Li_GaoGao 2018-09-01 09:12:50
这个基本上按照大神的笔记来的。
学习参考大神不仅提供了训练图片,还有详细的训练过程,包括转换源码,非常感谢。
总的来说用caffe来训练分类,可以分为几个步骤。
- 下载图片,生成.txt,这个txt用于转换图片格式的参数用到了
- 把训练图片转换成lmdb格式
- 计算图片均值
- 修改网络参数和网络的图片路径等
- 训练网络
大分为以上5个步骤。其实最开始三个环节都可以归类位准备数据环节。
###下载图片及生成清单###
图片来源于大神提供:
分为训练和测试两个文件,训练大约400个,测试100个。
每个里面都是五个分类,标签是3,4,5,6,7。
下载后将图片放在caffe的data文件夹里。
大神谢了一个脚本实现了txtx参数的生成,在评论里有大神说用python比较方便,这里提供了两种方法:
首先,在examples下面创建一个myfile的文件夹,来用存放配置文件和脚本文件。然后编写一个脚本create_filelist.sh,用来生成train.txt和test.txt清单文件。
# sudo mkdir examples/myfile
# sudo vi examples/myfile/create_filelist.sh
编辑此文件,写入以下代码:
#!/usr/bin/env sh
DATA=data/re/
MY=examples/myfile
echo "Create train.txt..."
rm -rf $MY/train.txt
for i in 3 4 5 6 7
do
find $DATA/train -name $i*.jpg | cut -d '/' -f3-5 | sed "s/$/ $i/">>$MY/train.txt
done
echo "Create test.txt..."
rm -rf $MY/test.txt
for i in 3 4 5 6 7
do
find $DATA/test -name $i*.jpg | cut -d '/' -f3-5 | sed "s/$/ $i/">>$MY/test.txt
done
echo "All done"
或者编写一个py文件create_filelist.py
# sudo mkdir examples/myfile
# sudo vi examples/myfile/create_filelist.py
编辑内容如下:
# -*- coding: utf-8 -*-
import os
data_path='data/re/'
my='examples/myfile/'
classes=[3,4,5,6,7]
def gen_txt(phase):
f=open(my+phase+'.txt','w')
for c in classes:
folder=str(c)
images=os.listdir(data_path+phase+'/')
for img in images:
f.write(phase+'/'+img+' '+folder+'\n')
gen_txt('train')
gen_txt('test')
接着在caffe根目录下执行即可。
# sudo sh examples/myfile/create_filelist.sh
#或者
# sudo python examples/myfile/create_filelist.py
成功的话,就会在examples/myfile/ 文件夹下生成train.txt和test.txt两个文本文件,里面就是图片的列表清单。
###转换成lmdb格式###
使用convert_imagese来转换格式,
# sudo vi examples/myfile/create_lmdb.sh
编写脚本内容如下:
#!/usr/bin/env sh
MY=examples/myfile
echo "Create train lmdb.."
rm -rf $MY/img_train_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_height=256 \
--resize_width=256 \
/home/xxx/caffe/data/re/ \
$MY/train.txt \
$MY/img_train_lmdb
echo "Create test lmdb.."
rm -rf $MY/img_test_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_width=256 \
--resize_height=256 \
/home/xxx/caffe/data/re/ \
$MY/test.txt \
$MY/img_test_lmdb
echo "All Done.."
因为图片大小不一,因此需要统一转换成256*256大小。运行成功后,会在 examples/myfile下面生成两个文件夹img_train_lmdb和img_test_lmdb,分别用于保存图片转换后的lmdb文件。
###计算均值###
图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作。
caffe程序提供了一个计算均值的文件compute_image_mean.cpp,可以直接使用
# sudo build/tools/compute_image_mean examples/myfile/img_train_lmdb examples/myfile/mean.binaryproto
compute_image_mean带两个参数,第一个参数是lmdb训练数据位置,第二个参数设定均值文件的名字及保存路径。
运行成功后,会在 examples/myfile/ 下面生成一个mean.binaryproto的均值文件。
###修改训练参数及网络###
模型就用程序自带的caffenet模型,位置在 models/bvlc_reference_caffenet/文件夹下, 将需要的两个配置文件,复制到myfile文件夹内
# sudo cp models/bvlc_reference_caffenet/solver.prototxt examples/myfile/
# sudo cp models/bvlc_reference_caffenet/train_val.prototxt examples/myfile/
我们常用到的就是这两个文件,一个是训练参数,一个是网络参数
修改其中的solver.prototxt
# sudo vi examples/myfile/solver.prototxt
主要是修改路径和训练参数,迭代两次,每次50,即可把测试用的100张照片完全覆盖
然后修改网络参数,也是修改路径
name: "CaffeNet"
layer {
name: "data"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
crop_size: 227
mean_file: "examples/myfile/mean.binaryproto"
}
data_param {
source: "examples/myfile/img_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: "examples/myfile/mean.binaryproto"
}
data_param {
source: "examples/myfile/img_test_lmdb"
batch_size: 50
backend: LMDB
}
}
训练和测试两个地方的参数。
网友提到需要不需要把分类的1000个改成5,目前来看,我没改好像也可。
###训练和测试###
一个命令行即可搞定
# sudo build/tools/caffe train -solver examples/myfile/solver.prototxt
使用GPU大概几分钟就 能出结果。
_________________________________________________________________________________________________________________________________________________
每一个不曾起舞的日子,都是对生命的辜负。
But it is the same with man as with the tree. The more he seeks to rise into the height and light, the more vigorously do his roots struggle earthward, downward, into the dark, the deep - into evil.
其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。----尼采