本篇的目的在于训练出一个基于自己建立的图片集的模型(imagenet图片集过大,准备以后硬件设施允许的情况下使用),后续会利用此网络做fine-tune实验,以及更改相关参数实现图片检索的操作。
本来想在Imagenet这样的大型数据集上建立训练,奈何其数据量庞大。索性自己建立一个图片集,我准备了10个类,每个类包含100张训练图片及10张测试图片。后续会在附录上上传该链接。仿照caffe的caffenet结构,在CAFFEROOT的data目录下建立一个文件夹,下面再建立train文件夹存放训练图片;建立val文件夹存放测试图片。在CAFFEROOT的examples文件夹下建立对应的文件夹存放相关配置文件。
注意:train文件夹下面的每个文件夹存放该类图片。最后如图:
二、数据预处理
1、统一图片尺寸
编写shell脚本,使用ImageMagick将所有图片转换为256x256像素。
for pic in PATH TO IMAGE FOLDER/*.jpg;do convert -resize 256x256! $pic $pic done
2、生成图片对应的列表清单txt文件
caffe需要train.txt test.txt val.txt存放图片的路径信息和类别信息。采用在每个文件名后打标签的形式归类。(train中的标签一定要从0开始,否则会出错)此过程需要自己编写一个脚本,其实网上的脚本也很多,忘记怎么写可以参考一下。最后如图:
3、将图片转格式为lmdb并计算均值
在CAFFEROOT/examples文件夹下找到imagenet文件夹,该文件夹下包含了一个create_imagenet.sh文件以及计算图片均值的make_mean文件,将两个拷贝出来到自己创建的对应文件夹下,修改相关路径、名称。
运行create_lmdb脚本后会生成两个lmdb文件夹存放图片转换成的lmdb数据。同样的,运行make_mean脚本会生成.binaryproto的均值文件。
4、配置prototxt文件和solver文件
CAFFEROOT/models下的caffenet文件夹下包含train_val.prototxt与deploy.prototxt两个网络配置文件。前者是用于训练过程使用,后者是用于测试过程使用。其实,就算一开始分不清他们的作用,但是编辑两个文件的时候会发现一些不同,首先deploy的网络更“简洁”,再就是train_val的最后一层是softmaxwithloss,而deploy的最后是softmax。二者的区别在于softmax的作用是将线性预测值转换为类别的概率,即用于测试的过程,比如输入一张图片,那么softmax将计算其属于类别的概率。而在训练的过程中,已经明确地知道的每个训练数据的所属类别,这是一个求极大似然值的过程,softmaxwithloss就是实现这个作用的。即假设我们输入一张图片属于某个类,那么训练的目的就是要调整相关权值获得极大似然。
这里将fc_8的输出num_output都设为20,其他结构保持不变。将相关路径修改好就可以训练了。
solver文件部分参数:
test_iter:=test图片数量/batch_size,为测试过程需要迭代的次数,其中,batchsize为一次操作的图片数量,在prototxt文件中设置。
test_interval:每迭代test_interval就进行一次测试。
三、训练
在其他例子中找到一个train.sh,修改参数后就可以训练了。
参考:
http://freemind.pluskid.org/machine-learning/softmax-vs-softmax-loss-numerical-stability/
https://www.zhihu.com/question/24529483
http://blog.csdn.net/han_xiaoyang/article/details/50856583
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:caffe 训练测试自己的图片 - Python技术站