1,下载mnist所需的所有数据
mnist数据集http://yann.lecun.com/exdb/mnist/,这里需要注意的是caffe并不直接通过下载得到的四个文件进行训练,而是会把它转化为lmdb或leveldb格式进行读取。lmdb是lightning(闪电的) memory-mapped database manager的缩写,能够把原始数据通过更为高效的存储方式存储,从而加快读取和训练速度(lmdb比leveldb更快,可以看看刚刚的NugetPackages文件夹,当中就包含着对应的库)。
实现这个转化的代码是\examples\mnist的convert_mnist_data.cpp,但也没必要看,因为它的运行脚本create_mnist.sh显然是linux下的东西。想了想也可以理解,毕竟caffe本来也不支持windows,能移植过来就不错了,也不能指望大牛们把所有例子的代码都一并移植过来。目前更很好的办法就是直接网盘下载,这里分享一个
链接: https://pan.baidu.com/s/1i44s1JB 密码: ewi82,将下载下来的文件夹中的mnist_train_leveldb和mnist_test_leveldb两个文件夹复制到caffe-master\examples\mnist文件夹下
3,修改配置文件。
mnist目录下prototxt扩展名的都是配置文件。我们需要修改lenet_solver.prototxt,用vs2013打开,定位到最后一行:solver_mode: GPU,将GPU改为CPU。
另外需要修改 lenet_train_test.prototxt文件的第14,16,31,33行
4,编写bat脚本
在caffe-master根目录下新建一个train_mnist.txt并写入如下内容:
当迭代次数达到lenet_solver.prototxt定义的max_iter时,就可以认为训练结束了。并且最终会在目录\examples\mnist下产生训练出的模型(文件后缀名为caffemodel和solverstate),如下图所示:
5,用标准数据集测试模型
按上一步骤生成test_mnist.bat,内容如下:
.\Build\x64\Release\caffe.exe test--model=examples/mnist/lenet_train_test.prototxt -weights=examples\mnist\lenet_iter_10000.caffemodel
pause
双击运行,结果如下:
6,用自己的图片测试此模型:
(1)用Windows的画图工具自己手写一张图片(需为28*28像素的灰度图像):
为了方便直接调整写的数字的大小,如果你这里不调整大小,在matlab里面有相关的resize函数,自己查询调用方法,很简单
如下所示:
(2)
查看图片属性:
可以发现,这个保存下来的是RGB图像,三通道(如果是RGB图,位深度是24;如果是灰度和索引图,位深度是8),然而我们的测试集和训练集mnist都是灰度图像,即单通道,所以要用matlab或者python进行图像二值化处理,我这里用的是matlab
image=imread('C:\Users\sun\Desktop\8.png') %载入指定路径下的图像
im=255-rgb2gray(image) %将图像二值化,彩色图像转化为灰度图像,并且将白色背景变为黑色,黑色字体变为白色,突出字体。
imwrite(uint8(im),'C:\Users\sun\Desktop\8.bmp') %以bmp格式保存图片到指定路径
(3)
将二值化后的图片保存到caffe-master\examples\mnist文件夹下,并新建一个标签文件synset_words.txt,填入数字0到9
7,计算均值文件:在.\caffe-master\Build\x64\Release目录下新建bat文件mnist_mean.bat,内容如下:
.\Build\x64\Release\compute_image_mean.exe examples/mnist/mnist_train_leveldb examples/mnist/mean.binaryproto --backend=leveldb
pause
在mnist文件夹中生成mean.binaryproto
8,生成deploy.prototxt
这里参考了苏的专栏:http://blog.csdn.net/lanxuecc/article/details/52474476
用训练好的caffemodel来测试单张图片需要一个deploy.prototxt文件来指定网络的模型构造。
事实上deploy.prototxt文件与lenet_train_test.prototxt文件类似,只是首尾有些差别。
所以我们可以复制lenet_train_test.prototxt,粘贴到当前文件夹,即lenet_train_test.prototxt副本,将其重命名为deploy.prototxt
用vs2013打开,并修改其中三处代码:
第一:/将原来训练与测试两层数据层data部分用下边代码替换/:
layer { name: "data"
type: "Input"
top: "data"
input_param { shape: { dim: 1 dim: 1 dim: 28 dim: 28 } }
}
总得来说,deploy.prototxt就是在lenet_train_test.prototxt的基础上稍作改动,input_param { shape: { dim: 1 dim: 1 dim: 28 dim: 28 } } 这四个dim参数分别是 :
(1)对待识别样本图片进行数据增广的数量,一个图片会变成10个,之后输入到网络进行识别。如果不进行数据增广,可以设置成1。
(2)图片的通道数,一般灰度图片为单通道,则值为1,如果为非灰度图3通道图片则为3。
(3)图片的高度,单位像素。
(4):图片的宽度,单位像素
第二:/删除了原有的测试模块的测试精度层/
第三:/*输出层的类型由SoftmaxWithLoss变成Softmax,训练是输出时是loss,应用时是prob。*/
layer {
name: "prob"
type: "Softmax"
bottom: "ip2"
top: "prob"
}
9,
在caffe-master根目录下新建mnist_class.txt,并填入下面内容:
.\Build\x64\Release\classification.exe examples/mnist/deploy.prototxt examples\mnist\lenet_iter_10000.caffemodel examples/mnist/mean.binaryproto examples/mnist/synset_words.txt examples/mnist/8.bmp
pause
改为bat文件,双击运行,结果如下:
bingo! 大功告成!