环境: 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.youkuaiyun.com/dym755833564/article/details/77965966
https://www.linuxidc.com/Linux/2016-09/135025.htm
https://www.cnblogs.com/cxyxbk/p/6881683.html
https://blog.youkuaiyun.com/bengqian1670/article/details/89222006
https://blog.youkuaiyun.com/u012243626/article/details/82469174
https://blog.youkuaiyun.com/m0_37407756/article/details/70789271
https://blog.youkuaiyun.com/qinglu000/article/details/17242011