Windows下利用caffe训练印刷体数字并识别测试
写这篇文章主要是为了记录在windows下利用caffe训练、识别印刷体数字的过程,加深自己的印象的同时也给有这需求的人作为参考,针对下文中涉及到的一些参数修改如有不明之处建议上网查询,网上有很多相关介绍。
1、数据准备
本次测试的样本集是印刷体数字0—9,每个数字的训练样本数量为240、测试样本为40,图像大小64*64(图像大小必须统一)。
1) 在文件夹caffe/data目录下新建名为my的文件,相关数据路径如下图1所示。train和val存放训练、测试的样本数据,trainldb和valldb存放格式转换后的leveldb数据,train_val存放训练的配置参数文件,caffe_model存放的是训练好的caffe模型。图1
2)利用MATLAB(个人喜好,也可以采用bat命令)快速对train数据集图片进行编码,并对图像数据的路径+名称+标签一起写入相应的train.txt文件,如下图2所示。Val.txt的生成过程也一样。图2 MATLAB编码数字图片、数据标签
3)编写bat文件(bat文件的生成:新建一个txt,写入数据保存,将后缀.txt改为.bat则可)调用convert_imageset.exe生成对应的leveldb格式数据,注意参数和路径,仿照如下格式所示编写。-
Build\x64\Release\convert_imageset.exe--shuffle --backend=leveldb --resize_width=64 --resize_height=64E:\caffe\caffe-master\data\my\ E:\caffe\caffe-master\data\my\train \train.txtE:\caffe\caffe-master\data\my\trainldb
pause
双击bat文件,生成成功后的信息如下图3所示,在data/my/trainldb文件夹下生成如下对应的文件,valldb也是同样的操作。
图3
4)计算图像数据的均值,得到均值文件。通常做法是将训练集减去均值文件后再进行训练效果会好一点,当然也可以对数据做其他处理。同第三步一样,编写bat文件调用compute_image_mean.exe,在data/my路径下生成两个均值文件train_mean.binaryproto与val_mean.binaryproto,数据格式如下:
Build\x64\Release\compute_image_mean.exe --backend=leveldbE:\caffe\caffe-master\data\my\trainldb E:\caffe\caffe-master\data\my \train_mean.binaryproto
Pause
2、caffe网络定义并训练
1)将examples/mnist文件夹下的两个文件lenet_solver.prototxt、lenet_train_test.prototxt复制到data/my/train_val目录下,用vs2013(其他工具也行)打开,下面是根据我自己的数据设置两个文件相应的参数:
lenet_train_test.prototxt修改如下所示:
lenet_solver.prototxt修改如下所示:
2)编写bat文件,调用caffe.exe,格式如下所示:
Build\x64\Release\caffe.exe train--solver=data/my/train_val/lenet_solver.prototxt
pause
双击运行,训练结果如下图所示:
识别准确率93%就上不去了,分析原因可能是我的数字样本有些采用的字体太复杂,同时在data/my/caffe_model文件夹下生成了caffe模型如下所示, caffe对数字的训练到此结束。
3、印刷体数字识别测试
利用生成的caffe模型,对印刷体数字进行识别测试:
将examples/mnist文件夹下的文件lenet.prototxt拷贝到data/my/train_val目录下并进行如下修改(一定要修改,不然测试会出现问题):
Python编写测试代码如下:
import os
import caffe
root='E:/caffe/caffe-master/'#指定根目录
os.chdir(root)#更换工作目录
#调用模型
deploy=root+'data/my/train_val/lenet.prototxt'#结构文件
caffe_model=root +'data/my/_iter_10000.caffemodel'
labels_filename = root +'data/my/label.txt' #类别名称文件,数字标签转换回类别名称
imgtest='E:/caffe/caffe-master/examples/images/mytest/7.bmp'#用画板画的数字图片
net = caffe.Net(deploy,caffe_model, caffe.TEST)
transformer =caffe.io.Transformer({'data': net.blobs['data'].data.shape}) #设定图片的shape格式(1,3,32,32)
transformer.set_transpose('data',(2,0,1)) #改变维度的顺序,由原始图片(28,28,3)变为(3,28,28)
#transformer.set_mean('data',np.load(mean_file).mean(1).mean(1)) #减去均值,前面训练模型时没有减均值,这儿就不用
#transformer.set_raw_scale('data',1) #缩放到【0,1】之间 已经在网络里设置scale,这里可以不用
transformer.set_channel_swap('data',(2,1,0)) #交换通道,将图片由RGB变为BGR
im=caffe.io.load_image(imgtest) #加载图片
net.blobs['data'].data[...] =transformer.preprocess('data',im) #执行上面设置的图片预处理操作,并将图片载入到blob中
out = net.forward()
prob=net.blobs['prob'].data[0].flatten() #取出最后一层(Softmax)属于某个类别的概率值,并打印
print prob
order=prob.argsort()[-1]
print('the class is:',order)
用画板画的测试64*64的数字图像:
测试中如果碰到“no module name _caffe”问题,解决方法是在环境变量中添加路径E:\caffe\caffe-master\Build\x64\Release\pycaffe。
如果碰到“import caffe no module named google.protobuf.internal”,这是protobuf版本问题,解决方法:
1、下载protobuf(地址:https://github.com/google/protobuf/releases/tag/v3.0.0),下载两个版本,一个protoc-3.0.0-win32.zip,一个源码。
2、将protoc-3.0.0-win32\bin\protoc.exe拷贝进入源代码文件夹下 src中,进入源代码文件夹下Python文件夹,cmd执行 python setup.py build
3、将protobuf-3.0.0\python路径下的文件google拷贝到自己原先安装的Python路径\Lib\site-packages\下,这样再次运行就不会报错了。
最终运行结果如下所示:
有什么问题,欢迎大家一起讨论!