网络上关于caffe微调的资料很多,今天自己动手实践了一下。顺便把实践过程记录下来,备忘。
一、下载model参数
下载地址为:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel,保存在caffenet目录下
二、准备数据
有自己的数据最好,如果没有,可以下载本练习的数据http://pan.baidu.com/s/1MotUe。
共有500张图片,分为大巴车、恐龙、大象、鲜花和马五个类,每个类100张。编号分别以3,4,5,6,7开头,各为一类。从其中每类选出20张作为测试,其余80张作为训练。因此最终训练图片400张(放在train文件夹内,每个类一个子文件夹),测试图片100张(放在test文件夹内,每个类一个子文件夹)。
三、图像数据转换成db(leveldb/lmdb)文件
1、先将图像文件名和标签信息存在txt文件中,编写处理脚本,分别处理训练集和测试集
# /usr/bin/env sh
DATA=train
echo "Create train.txt..."
OUTPUT=./train.txt
rm -rf $OUTPUT
# labels.0:bus;1:dinosaur;2:elephant;3:flower;4:horse
# find $DATA -name 3*.jpg | cut -d '/' -f3 |sed "s/$/ 1/">>$OUTPUT
find $DATA -name 3*.jpg | sed "s/$/0/">>$OUTPUT
find $DATA -name 4*.jpg | sed "s/$/1/">>$OUTPUT
find $DATA -name 5*.jpg | sed "s/$/2/">>$OUTPUT
find $DATA -name 6*.jpg | sed "s/$/3/">>$OUTPUT
find $DATA -name 7*.jpg | sed "s/$/4/">>$OUTPUT
echo "Done.."
也可以用caffe自带的examples/imagenet/create_imagenet.sh脚本处理。
2、使用caffe自带的convert_imageset工具转化图像,并用compute_image_mean计算出均值文件
convert_imageset --shuffle --resize_height=256 --resize_width=256 ./ ./train.txt ./img_train_lmdb
compute_image_mean ./img_train_lmdb ./caffe/img_mean.binaryproto
convert_imageset --shuffle --resize_height=256 --resize_width=256 ./ ./test.txt ./img_test_lmdb
至此,图像已经转化为ldmb格式,并分别存放在img_train_lmdb和img_test_lmdb目录下
四、修改网络配置文件train_val.prototxt
1、修改mean_file的路径。"caffenet/imagenet_mean.binaryproto"
2、修改输入数据的参数data_param。训练集为source: "./img_train_lmdb" ;测试集为source: "./img_test_lmdb"
3、修改fc8层,将其名称改成name: "fc8_re",top: "fc8_re",将本层的输出类别数由原来的1000,改成5,即num_output: 5。同时修改accuracy和loss层中的bottom: "fc8_re"
五、修改网络训练文件solver.prototxt
net: "caffenet/train_val.prototxt"
test_iter: 1000
test_interval: 1000
base_lr:0.0005
lr_policy: "step"
gamma: 0.1
stepsize: 500
display: 50
max_iter:5000
momentum: 0.9
weight_decay:0.0002
snapshot: 500
snapshot_prefix: "caffenet/caffenet_train"
solver_mode: GPU
此文件修改的重点是学习率base_lr,因为是用微调,所以lr就应该比从头训练用的数值更小。
六、微调训练
经过上述步骤的准备和修改工作之后,就可以训练自己的数据了。命令如下:
caffe train -solver caffenet/solver.prototxt -weights caffenet/bvlc_reference_caffenet.caffemodel-gpu 0
测试:caffe test -model caffenet/train_val.prototxt -weightscaffe/caffenet_train_iter_1000.caffemodel
实验结果,经过1000次迭代之后,训练和测试的准确率都达到100%!