Caffe 跑自己的数据和训练

来源:互联网 发布:mac截图后文件在哪里 编辑:程序博客网 时间:2024/05/07 07:36

本文主要参考文末资料中的步骤,自己重新跑了一遍,大部分和上述资料中的相同,有些补充和改动.

Caffe提供mnist, cifar10, ImageNet1000等数据库,对于mnist和cifar10,数据集的准备是通过调用代码自己下载并完成,而ImageNet10的数据需要自己下载.我们可以参考ImageNet10的处理方式来生成caffe需要的lmdb/leveldb数据格式,然后进行training和testing.


1.准备图片数据

在data中新建文件夹mydatabase. 我有100个类,100张训练图片,30张评估,60张测试.
training和validation的输入用train.txt和val.txt描述,这两个txt文件列出所有文件名和他们的labels.
生成train.txt和val.txt可以用caffe提供的命令:
find-name*.jpeg|cut-d’/’-f2-3train.txt
注意文件路径;然后自行手动做分类标签.同理,生成val.txt.

当样本过多时,可以自己编写指令批量处理.
matlab代码,生成train.txt和val.txt:
batch_in_txt.m

clear allclcfile = dir('train_summer/');%file = dir('val_summer/');tmp = length(file);file = file(3:tmp);fp = fopen('train.txt','at'); % 'at' open or create file for reading and writing, append data to end of file%fp = fopen('val.txt','at');for n = 1:length(file)        txt = [file(n).name ' ' num2str(n) '\n'];    fprintf(fp, txt);endfclose(fp);

这里写图片描述

此外,我们还需要把图片大小变成256x256, caffe主页上的命令是:
(http://caffe.berkeleyvision.org/gathered/examples/imagenet.html)
for name in /path/to/imagenet/val/*.JPEG;
do
  convert -resize 256x256! namename
done

也可以在后面修改create_imagenet.sh时把里面的RESIZE=false改成true,以生成256x256的图片.

我自己的图片尺寸是1920x1080,用matlab resize到960x540,打算先看看效果如何.对于training, validation, test set, matlab 把图片resize到960x540的代码:

file = dir(cd);tmp = length(file);file = file(3:tmp);for n = 1:length(file)    tmp = imread(file(n).name);    tmp = imresize(tmp, 0.5, 'bilinear');    imwrite(tmp, file(n).name);end

注意在matlab窗口,我是进入到图片所在文件夹,然后把以上代码直接粘贴到命令行得到resize之后的图片.

这里写图片描述


2.生成所需的lmdb格式

在examples/新建文件夹mydata,将examples/imagenet文件夹下的create_imagenet.sh复制到该文件夹下,改名为create_summer.sh,修改training和validation的路径,如下图:
这里写图片描述
这里写图片描述
修改完成后,运行该sh:
./examples/mydata/create_summer.sh

最后会得到summer_train_lmdb和summer_val_lmdb,如下图:
这里写图片描述
小插曲:我在运行create_summer.sh时一直出现一个错误:/convert_imageset: not found
后来发现是由于我粘贴TOOLS路径名时后面跟了几个空格,导致TOOLSconvertimagesetTOOLS/convert_imageset变成了build/tools(此处有空格) /convert_imageset.


3.计算图像均值

模型需要从每张图片减去均值,所以我们需要获取training images的均值,用tools/compute_image_mean.cpp实现.这个cpp是一个很好的例子去熟悉如何操作多个组件,例如协议的缓冲区,leveldb,登陆等.
同样地,我们复制examples/imagenet的make_imagenet_mean.sh到examples/mydata中,改名为make_summer_mean.sh,修改该文件中的路径.
这里写图片描述


4.定义网络

把models/bvlc_reference_caffenet中的所有文件复制到examples/mydata文件夹中,修改train_val.prototxt,主要是修改各数据层的文件路径.如下图:
这里写图片描述

如果细心观察train_val.prototxt,可以发现他们除了数据来源和最后一层不同以外,其他基本相似.在training时,我们用softmax-loss层计算损失函数和初始化反向传播,而在验证时,我们使用精度层检测精度.

还有一个运行协议solver.prototxt,复制过来,将第一行路径改为我们自己的路径net:”examples/mydata/train_val.prototxt”. 从里面可以观察到,我们将运行256批次,迭代4500000次(90期),每1000次迭代,我们测试学习网络验证数据,我们设置初始的学习率为0.01,每100000(20期)次迭代减少学习率,显示一次信息,训练的weight_decay为0.0005,每10000次迭代,我们显示一下当前状态。
以上是教程的,实际上,以上需要耗费很长时间,因此,我们稍微改一下
test_iter: 1000是指测试的批次,我们就10张照片,设置10就可以了。
test_interval: 1000是指每1000次迭代测试一次,我们改成500次测试一次。
base_lr: 0.01是基础学习率,因为数据量小,0.01就会下降太快了,因此改成0.001
lr_policy: “step”学习率变化
gamma: 0.1学习率变化的比率
stepsize: 100000每100000次迭代减少学习率
display: 20每20层显示一次
max_iter: 450000最大迭代次数,
momentum: 0.9学习的参数,不用变
weight_decay: 0.0005学习的参数,不用变
snapshot: 10000每迭代10000次显示状态,这里改为2000次
solver_mode: GPU末尾加一行,代表用GPU进行


5.训练阶段

把examples/imagenet中的train_caffenet.sh复制到examples/mydata,改名为train_mysummer.sh,修改路径,如图:
这里写图片描述

运行:./examples/mydata/train_mysummer.sh
这里写图片描述


6.恢复数据

把examples/imagenet中的resume_training.sh复制过来并运行.


参考资料:
(http://www.yidianzixun.com/0A9Npmrh)

0 0
原创粉丝点击