使用caffe训练mnist、验证手写图片、画模型结构

环境: 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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章