参照http://blog.csdn.net/u012878523/article/details/41698209的说明,完成了在caffe上利用自己的数据集进行微调,现在将整个过程记录如下。
一.准备数据集
1.准备原始数据集
数据集中包括训练集和测试集。我是在caffe-windows主目录下新建了lp文件夹,里面有train和val两个文件夹。train里面又有pos_train和neg_train两个文件夹,分别存放着用于训练的正样本和负样本(各有500张256*256的图片)。val文件夹里面存放着100张图片。
2.制作标签txt文件
这一步我们需要对数据集中的图片添加标签,然后存成txt文件。由于我对matlab比较熟悉,所以用matlab编写了相应的程序,如下:
pos_folder="your path";
neg_folder = "your path";
image_width = 120; %图像小块的宽度
image_height = 34; %图像小块的高度
pixel_total = image_width * image_height*3; %图像中像素点的数目
pos = dir(pos_folder);
[pos_row,pos_line] = size(pos);
neg = dir(neg_folder);
[neg_row,neg_line] = size(neg);
fid=fopen('train.txt','w');
for i=3:pos_row
img_name = [pos_folder,pos(i).name];
[a,b]=strtok(img_name,pos_folder);
d=strcat(a,b);
d=strcat('train_pos/',d);
fprintf(fid,'%s %d\n',d,1);
end
for i=3:neg_row
img_name = [neg_folder,neg(i).name];
[a,b]=strtok(img_name,neg_folder);
d=strcat(a,b);
d=strcat('train_neg/',d);
fprintf(fid,'%s %d\n',d,2);
end
fclose(fid);
上述程序生成的train.txt内容如下:
同理可制作val.txt,如下所示:
3.利用caffe把数据集转换成leveldb的格式
打开maincaller.cpp,编译convert_imageset.cpp.,
然后在caffe主目录下建立一个convert.bat文件,内容如下:
SET GLOG_logtostderr=1
bin\MainCaller.exe data/lp/train/ data/lp/train.txt data/lp/mtrainlb 0
pause
双击convert.bat即可生成mtrainlb文件夹,这里面存放的就是leveldb格式的数据。
二.开始微调自己的网络
首先选择编译fine_tune.cpp,生成maincaller.exe
我直接使用的是imagenet的网络结构,所以将examples/imagenet里面的imagenet_train.prototxt、imagenet_val.prototxt、imagenet_solver.prototxt直接拷过来修改一下。
imagenet_train.prototxt、imagenet_val.prototxt改动的地方主要是:
source:mtrainlb
fc8的输出改成2层
接下来同样创建一个finetune.bat文件,内容如下:
copy ..\..\bin\MainCaller.exe ..\..\bin\fintune.exe
SET GLOG_logtostderr=1
“../../bin/fintune.exe” imagenet_solver.prototxt caffe_reference_imagenet_model
pause
然后双击运行,一开始的时候报错:
mtrainldb文件中的:MANIFEST-000007句柄无效的提示
然后程序就崩溃了。
在这个问题上折腾了很多时间,最后仔细观察命令行的打印信息才发现:
我这边出现这个问题的原因是train.protxt和test.protxt会使用同一个leveldb文件,因此会重复打开而失败。我就把mtrainldb复制了一下,重命名为mtrainldb2,然后把val.protxt里面的source改成mtrainldb2就好了。
接下来双击fine_tune.exe就可以开始微调了。CNN的训练方面目前接触比较少,接下来会研究CNN训练的一些trick 参数等等。