Windows下利用caffe训练印刷体数字并识别测试



写这篇文章主要是为了记录在windows下利用caffe训练、识别印刷体数字的过程,加深自己的印象的同时也给有这需求的人作为参考,针对下文中涉及到的一些参数修改如有不明之处建议上网查询,网上有很多相关介绍。

1、数据准备

  本次测试的样本集是印刷体数字09,每个数字的训练样本数量为240、测试样本为40,图像大小64*64(图像大小必须统一)

  1) 在文件夹caffe/data目录下新建名为my的文件,相关数据路径如下图1所示。trainval存放训练、测试的样本数据,trainldbvalldb存放格式转换后的leveldb数据,train_val存放训练的配置参数文件,caffe_model存放的是训练好的caffe模型。

Windows下利用caffe训练印刷体数字并识别测试

1

   2)利用MATLAB(个人喜好,也可以采用bat命令)快速对train数据集图片进行编码,并对图像数据的路径+名称+标签一起写入相应的train.txt文件,如下图2所示。Val.txt的生成过程也一样。

Windows下利用caffe训练印刷体数字并识别测试Windows下利用caffe训练印刷体数字并识别测试

2 MATLAB编码数字图片、数据标签

3)编写bat文件(bat文件的生成:新建一个txt,写入数据保存,将后缀.txt改为.bat则可)调用convert_imageset.exe生成对应的leveldb格式数据,注意参数和路径,仿照如下格式所示编写。
  1. 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也是同样的操作。

Windows下利用caffe训练印刷体数字并识别测试

Windows下利用caffe训练印刷体数字并识别测试

3

4)计算图像数据的均值,得到均值文件。通常做法是将训练集减去均值文件后再进行训练效果会好一点,当然也可以对数据做其他处理。同第三步一样,编写bat文件调用compute_image_mean.exe,在data/my路径下生成两个均值文件train_mean.binaryprotoval_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

2caffe网络定义并训练

1)examples/mnist文件夹下的两个文件lenet_solver.prototxtlenet_train_test.prototxt复制到data/my/train_val目录下,用vs2013(其他工具也行)打开,下面是根据我自己的数据设置两个文件相应的参数:

lenet_train_test.prototxt修改如下所示:

Windows下利用caffe训练印刷体数字并识别测试 Windows下利用caffe训练印刷体数字并识别测试 

 

lenet_solver.prototxt修改如下所示:

Windows下利用caffe训练印刷体数字并识别测试 

2)编写bat文件,调用caffe.exe,格式如下所示:

Build\x64\Release\caffe.exe train--solver=data/my/train_val/lenet_solver.prototxt

pause

双击运行,训练结果如下图所示:

Windows下利用caffe训练印刷体数字并识别测试

识别准确率93%就上不去了,分析原因可能是我的数字样本有些采用的字体太复杂,同时在data/my/caffe_model文件夹下生成了caffe模型如下所示, caffe对数字的训练到此结束。

Windows下利用caffe训练印刷体数字并识别测试

3、印刷体数字识别测试

利用生成的caffe模型,对印刷体数字进行识别测试:

examples/mnist文件夹下的文件lenet.prototxt拷贝到data/my/train_val目录下并进行如下修改(一定要修改,不然测试会出现问题)

Windows下利用caffe训练印刷体数字并识别测试

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)   #缩放到【01】之间   已经在网络里设置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的数字图像:

Windows下利用caffe训练印刷体数字并识别测试

 测试中如果碰到“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\下,这样再次运行就不会报错了。

最终运行结果如下所示:

Windows下利用caffe训练印刷体数字并识别测试

 

有什么问题,欢迎大家一起讨论!