原版caffe代码项目编译在windows下非常麻烦,还好微软集成了所有三方包之后放出了一个windows版本的,省了不少时间。
项目下载地址:
https://github.com/Microsoft/caffe
网上有这个版本caffe编译现成的教程可以搜。如果自己下载编译,建议注释data_layer.cpp下
DLOG(INFO) << "Prefetch batch: " <<
batch_timer.MilliSeconds() << " ms.";
DLOG(INFO) << " Read time: " << read_time / 1000 << " ms.";
DLOG(INFO) << "Transform time: " << trans_time /
1000 << " ms.";
这三行,要不然训练时干扰loss显示很烦人。
修改源码以及编译IDE使用visual studio 2013
如果有加载libcaffe和test_all项目失败的情况,先确保正确版本的cuda已经安装。
/windows/CommonSettings.props
文件里可以设置是否使用CuDNN以及Cuda版本。Python接口一般是编译的,matlab看使用需求是否编译。
解决方案位于/windows/caffe.sln
放出我配置好的windows caffe项目以及数据集、网络结构,照搬下载,更改路径和配置即可。
windows caffe项目(已编译好libcaffe、caffe、pycaffe、convert_imageset):
http://pan.baidu.com/s/1dFJYLDv
数据集(汉字识别)+网络(自设计)
http://pan.baidu.com/s/1bpbx6Gn
eclipse环境以及数据预处理、模型调用解决方案
http://pan.baidu.com/s/1jHQZTB4
http://pan.baidu.com/s/1bEyZP8
python2.7目录下所有内容,包含三方库
http://pan.baidu.com/s/1c1Q6mUc
内容以及结构说明会在后面详细说明。
编译顺序:libcaffe、caffe、pycaffe、convert_imageset
这里需要设置一些引用,具体如截图:
libcaffe引用python安装路径,默认c:\\Python27
caffe项目引用:
pycaffe:
convert_imageset
------------------------------------------------
编译好之后的目录在 /Build/x64/Debug下,内容如下:
之后复制pycaffe下所有内容到 {python安装目录这里是c:\\python27}\Lib\site-packages
下
这个目录也是python三方库所在位置,不光是python,还需要安装numpy、scipy、sckit-image、opencv_python、matplotlib之类的一堆东西,才能让在python环境下调用caffe并且对图片进行预处理。
如果在eclipse里import东西时出错,多半是这些需要的库没有安装好。安装教程同样网上找,比较零散。
当然也可以下载python27.rar然后复制粘贴覆盖,省得一个一个去安装。
目录截图:
接下来eclipse安装以及配置pyDev环境,网上找教程省略不写,或者直接下载eclipse.rar解压即可。
===========================================================
到此为止开发环境已配置部署完毕。
创建自己的训练集:
dpsample.rar解压, /dpsample/dpsample
目录下是原始数据,需要进行一系列处理,使用testcaffe.rar里的解决方案。
prepareSamples()方法将文字等比拉伸并且居中到32x32大小的图片,并且根据文字放入相应的文件夹,目录/dpsample/cha_data/...
prepareTraining()方法从分类好的文字里筛选至少有50个文字样本的字,随机放入训练或是测试数据集文件夹,自设放置训练与测试的比例。限定训练文件夹内同一个字最多不超过60个,以满足训练样本平衡。
最终得到以下内容:
/dpsample/data/character_dict.txt 汉字Index(caffe只能识别int型作为softmax分类)
/dpsample/data/train.txt
训练集目录
/dpsample/data/val.txt
测试集目录
/dpsample/data/train
训练集图片文件夹
/dpsample/data/val
测试集图片文件夹
之后修改caffe-master目录下convertimage2ldb.bat和convertimage2ldb_test.bat两个脚本内的路径,调用
/Build/x64/Debug/convert_imageset.exe程序分别生成训练集以及测试集的lmdb数据文件。注意这里使用--shuffle打乱图片排列顺序很重要。
两个bat脚本运行完得到/dpsample/data/testldb 和/dpsample/data/trainldb
文件夹。
之后在/dpsample/solver目录下创建编辑三个prototxt文档,分别是
lenet_solver.prototxt 训练模型使用的参数
lenet_train_test.prototxt 训练模型使用的网络,带accuracy以及loss函数
lenet_deploy.prototxt 模型训练好后,python调用模型时使用的网络。
三个prototxt文档内的内容含义网上有教程,不重复叙述。
这里放一个很实用的网络结构可视化网站:
http://ethereon.github.io/netscope/#/editor
网络结构以及solver定义好、lmdb数据准备好之后,就可以开始训练了。
/caffe-master/Build/x64/Debug 下打开控制台,运行
caffe.exe train
-solver={lenet_solver.prototxt文档路径}
等待训练结束。
当然也可以训练一段时间之后手动ctrl+c结束
得到一系列.caffemodel以及.solverstate文件
其中caffemodel文件是可以调用的模型,solverstate文件是继续检查点接着训练需要用到的文件。
python里调用caffemodel文件,对指定图片(30_47.png图,character_dict.txt里:多=30)进行分类:
import省略
deploy='C:/Users/Shirui/Downloads/dpsample/solver/lenet_deploy.prototxt'
#deploy文件
caffe_model='C:/Users/Shirui/Downloads/dpsample/solver_iter_1000.caffemodel'
#训练好的caffemodel
imgtest='C:/Users/Shirui/Downloads/dpsample/solver/30_47.png'
#随机找的一张待测图片
net = caffe.Net(deploy, caffe_model, caffe.TEST)
transformer = caffe.io.Transformer({'data':
net.blobs['data'].data.shape})
#设定图片的shape格式(1,3,28,28)
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】之间 已经在网络prototxt里已设置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] #获取最大prob的index
print(order)
最终得到正确的图片分类index 30