最近想熟悉一下深度学习,体验了一下Caffe,简单写写训练和分类的过程:
1.下载Caffe VS2013工程:https://github.com/Microsoft/caffe
2. 解压并用VS2013打开解决方案caffe-masterwindowsCaffe.sln,默认配置是x64 Debug
2. 重命名caffe-masterwindowsCommonSettings.props.example为caffe-masterwindowsCommonSettings.props,然后修改如下配置:
<CpuOnlyBuild>true</CpuOnlyBuild> ----- 是否使用GPU,我的电脑没有GPU,所以为true
<UseCuDNN>false</UseCuDNN> ----- 是否使用CuDNN库
<PythonSupport>false</PythonSupport> ----- 是否支持Python
<MatlabSupport>false</MatlabSupport> ----- 是否支持Matlab
4. 编译解决方案
全编译整个解决方案,刚开始会弹出一个窗口下载第三方库,需要下载一段时间,下载完毕后开始编译。第一次编译或许会出现错误说找不到libcaffe.lib,把工程libcaffe单独编译一下然后再编译整个解决方案即可。
5.编译通过后,在caffe-masterBuildx64Debug中会出现一堆exe和dll:
convert_imageset.exe 用来生成训练图片和测试图片的数据库
compute_image_mean.exe 计算训练图片的均值
classification.exe 对目标图片分类
6. 准备训练图片和测试图片,我们这里训练圆形,三角形,六边形和云朵图片,比如:
caffe-masterdata raincircle中放圆形练图片10张
caffe-masterdata raincloud中放云朵形状练图片5张
caffe-masterdata rainhexagon中放六边形练图片5张
caffe-masterdata rain riangle中放三角形练图片10张
训练图片共30张
caffe-masterdata rainval中放测试图片
这里放两张圆形图片(标准圆形和手绘圆形),两张三角形(标准+手绘),一张标准六边形,一张云朵图片,共6张
7. 新建文本文件caffe-masterdata rain rain.txt,填写将30张训练图片和类别编号对应关系,内容如下,jpg后面的数字表示图片类别编号,从0开始。
circle1.jpg 0
circle2.jpg 0
circle3.jpg 0
circle4.jpg 0
circle5.jpg 0
circle6.jpg 0
circle7.jpg 0
circle8.jpg 0
circle9.jpg 0
circle10.jpg 0
riangle1.jpg 1
riangle2.jpg 1
riangle3.jpg 1
riangle4.jpg 1
riangle5.jpg 1
riangle6.jpg 1
riangle7.jpg 1
riangle8.jpg 1
riangle9.jpg 1
riangle10.jpg 1
hexagon1.jpg 2
hexagon2.jpg 2
hexagon3.jpg 2
hexagon4.jpg 2
hexagon5.jpg 2
clouda.jpg 3
cloud.jpg 3
cloudc.jpg 3
cloudd.jpg 3
cloude.jpg 3
注意:这里每行的文件名称会和第9节convert_imageset_train.bat的行“set a=C:xxxcaffe-masterdata rain”指定的路径拼接成一个完整图片文件路径
8. 新建文本文件caffe-masterdatavalval.txt,填写测试图片和类别编号的对应关系,内容如下,格式与上面train.txt一样:
1.jpg 0
a.jpg 0
2.jpg 1
.jpg 1
3.jpg 2
5.jpg 3
注意:这里每行的图片文件名称会和第10节convert_imageset_val.bat的行“set a=C:xxxcaffe-masterdataval”指定的路径拼接成一个完整图片文件路径
9. 在caffe-master根目录下新建并运行批处理文件convert_imageset_train.bat,用于生成训练图片数据库:
10. 在caffe-master根目录下新建并运行批处理文件convert_imageset_val.bat,用于生成测试图片数据库,文件内容如下:文件内容如下:
SET GLOG_logtostderr=1
cd /d C:xxxcaffe-master
set a=C:xxxcaffe-masterdata rain
set b=C:xxxcaffe-masterdata rain rain.txt
set c=C:xxxcaffe-masterdata rainlmdb
Buildx64Debugconvert_imageset.exe -resize_height=200 -resize_width=200 %a% %b% %c% 0
pause
注意:运行此批处理文件前要确保文件夹caffe-masterdata rainlmdb不存在,否则会报错。
批处理运行后生成两个文件:caffe-masterdata rainlmdbdata.mdb和caffe-masterdata rainlmdblock.mdb
11. 生成均值文件,在caffe-master根目录下新建并运行批处理文件compute_image_mean.batSET GLOG_logtostderr=1
cd /d C:xxxcaffe-master
set a=C:xxxcaffe-masterdataval
set b=C: xxxcaffe-masterdatavalval.txt
set c=C:xxxcaffe-masterdatavallmdb
Buildx64Debugconvert_imageset.exe -resize_height=200 -resize_width=200 %a% %b% %c% 0
pause
注意:运行此批处理文件前要确保文件夹caffe-masterdatavallmdb不存在,否则会报错。
resize_height和resize_width分别为调整后的输入图片的宽度和高度
批处理运行后生成两个文件:caffe-masterdatavallmdbdata.mdb和caffe-masterdatavallmdblock.mdb
SET GLOG_logtostderr=1
cd /d C:xxxcaffe-master
set a=C:xxxcaffe-masterdata rainlmdb
set b=C:xxxcaffe-masterdataimage_mean.binaryproto
Buildx64Debugcompute_image_mean.exe %a% %b%
pause
批处理运行后生成caffe-masterdataimage_mean.binaryproto
12. 复制文件caffe-mastermodelsvlc_alexnetsolver.prototxt和caffe-mastermodelsvlc_alexnet rain_val.prototxt到caffe-masterdata,并修改如下:
solver.prototxt:
net: "C:/xxx/caffe-master/data/train_val.prototxt"
test_iter: 1
test_interval: 500
base_lr: 0.001
lr_policy: "step"
gamma: 0.1
stepsize: 100000
display: 20
max_iter: 10000
momentum: 0.9
weight_decay: 0.0005
snapshot: 1000
snapshot_prefix: "models/bvlc_alexnet/caffe_alexnet_train"
solver_mode: CPU
solver.prototxt和train_val.prototxt的详细介绍请参考如下两篇博客:
http://blog.csdn.net/u012746763/article/details/51549184
http://blog.csdn.net/u012746763/article/details/51549267
13. 在caffe-master根目录下新建并运行批处理文件train.bat开始训练:
SET GLOG_logtostderr=1
cd /d C:xxxcaffe-master
Buildx64Debugcaffe.exe train --solver=C:xxxcaffe-masterdatasolver.prototxt
pause
训练结果和快照保存在caffe-mastermodelsvlc_alexnet中。
14. 由于使用CPU计算,训练速度非常慢,不知道采用GPU能加速多少,减少训练图片数量和图片尺寸(step9和10中的resize_height和resize_width)能加快训练速度和降低内存使用。经过数个小时的等待训练结束,生成最终的训练结果,也可使用训练中间生成的快照来做分类。
15. 在caffe-master根目录下新建并运行批处理文件classification.bat开始分类。
SET GLOG_logtostderr=1
cd /d C:xxxcaffe-master
set a=C:xxxcaffe-mastermodelsvlc_alexnetdeploy.prototxt
set b=C:xxxcaffe-mastermodelsvlc_alexnetcaffe_alexnet_train_iter_4000.caffemodel
set c=C:xxxcaffe-masterdataimage_mean.binaryproto
set d=C:xxxcaffe-masterlabels.txt
set e=C:xxxcaffe-masterdatavalf.jpg
Buildx64Debugclassification.exe %a% %b% %c% %d% %e%
pause
参数说明:
deploy.prototxt:
修改name为data的layer中的input_param为{ shape: { dim: 10 dim: 3 dim: 200 dim: 200 } } 其中的200分别对应step9和10中的resize_height和resize_width
在name为fc8的layer中,修改num_output的值为4(训练图片类型的个数)
caffe_alexnet_train_iter_4000.caffemodel: 训练结果
image_mean.binaryproto: 均值文件
labels.txt: 图片类型编号对应的类型名称文件,一行一个名称
f.jpg: 待分类的图片
14. 手绘一个云朵形状的图片然后分类,结果:
0.9997 - "cloud"
0.0002 - "triangle
0.0001 - "hexagon"
0.0000 - "circle"