笔者也是刚刚学习,操作流程模仿http://www.linuxidc.com/Linux/2016-11/136774p12.htm
一、准备数据
采用500张图片,分为大巴车、恐龙、大象、鲜花和马五个类,每个类100张。
编号分别以3,4,5,6,7开头,各为一类。我从其中每类选出20张作为测试,其余80张作为训练。因此最终训练图片400张,测试图片100张,共5类。
将图片放在:/home/sys418/LYY_study/datalist
即训练图片目录:/home/sys418/LYY_study/datalist/image_train
测试图片目录:/home/sys418/LYY_study/datalist/image_train
二、转换为lmdb格式
1.设置数据清单(train,test)
编写一个脚本create_filelist.sh,用来生成train.txt和test.txt清单文件
# sudo vi /home/sys418/LYY_study/datalist/create_filelist.sh
编辑此文件,写入如下代码,并保存
DATA=/home/sys418/LYY_study/datalist此处注意不加“/”易导致之后的字符插入时无法判定是地址还是单纯的字符串
echo "Create train.txt..."
rm -rf $DATA/train.txt
for i in 3 4 5 6 7
do
find $DATA/image_train -name $i*.jpg | cut -d '/' -f7 |sed "s/$/ $i/">>$DATA/train.txt
解析:1.find /home/sys418/LYY_study/datalis/image_train -name $i*.jpg
寻找/home/sys418/LYY_study/datalis/image_train路径下以“i”开头以“.jpgt”接我的文件
2. XXX | cut -d '/' -f7
对XXX进行分割,以“/”为分隔符(-d '/'),取用第7段被分割出的字符(-f7)
/home/sys418/LYY_study/datalis/image_train/123.jpg
第1段:空
第2段:Home
第3段:sys418
第4段:LYY_study
第5段:Datalis
第6段:image_train
第7段:123.jpg
3. XXX |sed "s/$/ $i/"
对XXX的内容在每行的最末尾(s/$/)标注i($i)
done
echo "Create test.txt..."
rm -rf $DATA/test.txt
for i in 3 4 5 6 7
do
find $DATA/image_test -name $i*.jpg | cut -d '/' -f7 | sed "s/$/ $i/">>$DATA/test.txt
done
echo "All done"
然后,运行此脚本
# sudo sh /home/sys418/LYY_study/datalist/create_filelist.sh
成功的话,就会在/home/sys418/LYY_study/datalist/文件夹下生成train.txt和test.txt两个文本文件,里面就是图片的列表清单。
2.编写和运行一个调用convert_imageset命令(用于转换数据格式)的脚本文件
# sudo vi /home/sys418/LYY_study/datalist/create_lmdb.sh
插入:
#!/usr/bin/env sh
echo "Create train lmdb.."
m -rf $MY/image_train_lmdb
/home/sys418/caffe/build/tools/convert_imageset
--shuffle --resize_height=256 --resize_width=256
/home/sys418/LYY_study/datalist/image_train/
/home/sys418/LYY_study/datalist/train.txt
/home/sys418/LYY_study/datalist/image_train_lmdb
echo "Create test lmdb.."
rm -rf $MY/image_test_lmdb
/home/sys418/caffe/build/tools/convert_imageset
--shuffle --resize_width=256 --resize_height=256
/home/sys418/LYY_study/datalist/image_test/
/home/sys418/LYY_study/datalist/test.txt
/home/sys418/LYY_study/datalist/image_test_lmdb
echo "All Done.."
然后,运行此脚本
# sudo sh /home/sys418/LYY_study/datalist/create_lmdb.sh
因为图片大小不一,因此我统一转换成256*256大小。
运行成功后,会在/home/sys418/LYY_study/datalist下面生成两个文件夹img_train_lmdb和img_test_lmdb,分别用于保存图片转换后的lmdb文件。
三、计算均值并保存
图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作。
Caffe程序提供了一个计算均值的文件compute_image_mean.cpp,
存放在/home/sys418/caffe/build/tools下,我们直接使用就可以了
# sudo /home/sys418/caffe/build/tools/compute_image_mean
/home/sys418/LYY_study/datalist/image_train_lmdb /home/sys418/LYY_study/datalist/mean.binaryproto
compute_image_mean带两个参数,第一个参数是lmdb训练数据位置,第二个参数设定均值文件的名字及保存路径。
运行成功后,会在/home/sys418/LYY_study/datalist下面生成一个mean.binaryproto的均值文件。
四、创建模型并编写配置文件
模型就用程序自带的caffenet模型,位置在/home/sys418/caffe/models/bvlc_reference_caffenet文件夹下, 将需要的两个配置文件,复制到LYY_study/文件夹内
# sudo cp /home/sys418/caffe/models/bvlc_reference_caffenet/solver.prototxt
/home/sys418/LYY_study/
# sudo cp /home/sys418/caffe/models/bvlc_reference_caffenet/train_val.prototxt
/home/sys418/LYY_study/
修改其中的solver.prototxt
# sudo vi /home/sys418/LYY_study/solver.prototxt
net: "/home/sys418/LYY_study/train_val.prototxt"
test_iter: 2
test_interval: 50
base_lr: 0.001
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 20
max_iter: 500
momentum: 0.9
weight_decay: 0.005
solver_mode: GPU
100个测试数据,batch_size为50,因此test_iter设置为2,就能全cover了。在训练过程中,调整学习率,逐步变小。
修改train_val.prototxt
# sudo vi /home/sys418/LYY_study/train_val.prototxt
只需要修改两个阶段的data层就可以了,其它可以不用管。
name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "/home/sys418/LYY_study/datalist/mean.binaryproto"
}
data_param {
source: "/home/sys418/LYY_study/datalist/image_train_lmdb"
batch_size: 256
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
mirror: false
crop_size: 227
mean_file: "/home/sys418/LYY_study/datalist/mean.binaryproto"
}
data_param {
source: "/home/sys418/LYY_study/datalist/image_test_lmdb"
batch_size: 50
backend: LMDB
}
}
实际上就是修改两个data layer的mean_file和source这两个地方,其它都没有变化 。
五、训练和测试
如果前面都没有问题,数据准备好了,配置文件也配置好了,这一步就比较简单了。直接使用/home/sys418/caffe/build/tools下的caffe文件和solver.prototxt文件执行训练。
# sudo /home/sys418/caffe/build/tools/caffe train -solver /home/sys418/LYY_study/solver.prototxt
运行时间和最后的精确度,会根据机器配置,参数设置的不同而不同。使用gpu+cudnn运行500次,大约8分钟,精度为95%。