環境: ubuntu18.04 CUDA: 9.0 已安裝caffe GPU: NVIDIA Corporation GP104
opencv: 3.4.5
1 caffe源碼下載和編譯
git clone https://github.com/BVLC/caffe
cd caffe
將Makefile.config.example拷貝一份成Makefile.config,修改Makefile.config中的以下內容(紅色是需要添加的內容):
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial/
由於是CUDA 9.0, 找到CUDA_ARCH,去掉
-gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_20,code=sm_21
運行make all,還是fail,
.build_release/lib/libcaffe.so: undefined reference to `cv::imread(cv::String const&, int)'
.build_release/lib/libcaffe.so: undefined reference to `cv::imencode(cv::String const&, cv::_InputArray const&, std::vector<unsigned char, std::allocator<unsigned char> >&, std::vector<int, std::allocator<int> > const&)'
.build_release/lib/libcaffe.so: undefined reference to `cv::imdecode(cv::_InputArray const&, int)'
collect2: error: ld returned 1 exit status
Makefile:635: recipe for target '.build_release/tools/upgrade_net_proto_binary.bin' failed
make: *** [.build_release/tools/upgrade_net_proto_binary.bin] Error 1
修改Makefile.config:
去掉配置文件Makefile.config裏下面幾行 前面的註釋.
USE_CUDNN := 1
OPENCV_VERSION := 3
WITH_PYTHON_LAYER := 1
USE_NCCL := 1
修改PYTHON_INCLUDE爲3.6版本:
PYTHON_INCLUDE := /usr/include/python3.6 \
/usr/lib/python3/dist-packages/numpy/core/include
修改Makefile:
PYTHON_LIBRARIES ?= boost_python3-py36
這裏的boost_python3-py36來自於查找命令:
ll /usr/lib/x86_64-linux-gnu/ | grep python
libboost_python3.so -> libboost_python3-py36.so
下載hdf5-1.8.21版本代碼,放在/usr/local/hdf5-1.8.21下。修改以下兩句代碼:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/local/hdf5-1.8.21/hdf5/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/local/hdf5-1.8.21/hdf5/lib
用來解決 Headers are 1.10.0, library is 1.8.21 SUMMARY OF THE HDF5 CONFIGURATION 報錯問題。
到此,make all可以ok了。
最好make clean一下,再執行 make all make test make runtest make pycaffe,否則,會由於某些模塊在修改配置文件前編譯的,導致make test編譯不通過。
make runtest成功打印的結尾:
2 mnist 訓練
./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh
一定要在caffe根目錄下運行./examples/mnist/create_mnist.sh,運行命令前,最好查看caffe/build/examples/mnist這個目錄下是否生成了convert_mnist_data.bin,如果沒有,則表示make all沒有成功,需要make clean,make all。
經過上述操作./examples/mnist/路徑下會有mnist_test_lmdb和mnist_train_lmdb兩個文件夾,分別是測試和訓練數據。
訓練命令:
./examples/mnist/train_lenet.sh
第一次運行,輸出
共迭代10000次,訓練完成後,自動用測試數據驗證模型。
最後訓練輸出了2個model. 路徑是caffe/examples/mnist
3 驗證分類
自己手動畫一張4的圖片,用訓練好的模型去識別圖片,並輸出結果
由於python3版本裝了多個,就安裝了anaconda3,借用anaconda3的python3去編譯caffe
安裝的anaconda3版本是:Anaconda3-2019.03-Linux-x86_64.sh
編譯boost.python庫:
下載解壓boost_1_70_0.tar.gz
cd到解壓後的boost目錄下:
./bootstrap.sh --with-libraries=python --with-toolset=gcc
./b2 --with-python include="/root/anaconda3/include/python3.7m/"
cp -rf stage/lib/* /usr/lib/x86_64-linux-gnu/
再次進入caffe根目錄,修改Makefile和Makefile.config裏的參數爲
PYTHON_LIBRARIES := boost_python37 python3.7m
執行 make all -j4, 成功啦。。。
接下來是驗證自己畫的圖片了。
圖片要求:
1. 必須是256位黑白色
2. 必須是黑底白字
3. 像素大小必須是28*28
4. 數字在圖片中間,上下左右沒有過多空白
5. 圖片名稱是:“again.bmp",存放在caffe/examples/images/again.bmp
編寫一個python腳本,識別手寫數字的圖片。
import os
import sys
import numpy as np
import matplotlib.pyplot as plt
caffe_root = '/home/zhangjing/work/caffe/'
os.chdir(caffe_root) #change pwd
sys.path.insert(0,caffe_root+'python')
import caffe
MODEL_FILE = caffe_root + 'examples/mnist/lenet.prototxt'
PRETRAINED = caffe_root + 'examples/mnist/lenet_iter_10000.caffemodel'
IMAGE_FILE = caffe_root + 'examples/images/again.bmp'
input_image = caffe.io.load_image(IMAGE_FILE, color=False)
net = caffe.Classifier(MODEL_FILE, PRETRAINED)
prediction = net.predict([input_image], oversample=False)
print('predicted classes:', prediction[0].argmax())
在caffe根目錄下執行上述腳本。最後成功識別圖片中的數字。
執行腳本的命令:
python verify_mnist.py
第一次執行時,報錯:ImportError: No module named google.protobuf,這是因爲找不到對應的庫路徑導致。需要使用你的python 去安裝protocol buffer。
下載protobuf-all-3.7.1.tar.gz(去github protobuf下載)
解壓後依次執行:
./configure
make
make check
make install
最後一步涉及到權限,可能會需要sudo
再進入protobuf3.7.2/python執行命令sudo python setup.py install
然後到caffe根目錄下,執行python verify_mnist.py,看到輸出的最後一句是predicted classes: 4,用時9秒。
4 畫模型結構圖
cd caffe/python
python draw_net.py --rankdir TB ../examples/mnist/lenet.prototxt ../examples/mnist/lenet_structure.jpg
其中,--rankdir TB表示畫圖方向是從top到bottom, --rankdir LR就表示橫向繪製,從left到right
參考:
《深度學習--caffe之經典模型詳解與實戰》
https://blog.csdn.net/dym755833564/article/details/77965966
https://www.linuxidc.com/Linux/2016-09/135025.htm
https://www.cnblogs.com/cxyxbk/p/6881683.html
https://blog.csdn.net/bengqian1670/article/details/89222006
https://blog.csdn.net/u012243626/article/details/82469174
https://blog.csdn.net/m0_37407756/article/details/70789271
https://blog.csdn.net/qinglu000/article/details/17242011