参考这篇优秀的博文,基本上都能够实现训练自己的数据集以及标注过程。
https://blog.youkuaiyun.com/qq_27923041/article/details/54139887#comments
这个小哥的过程很是详细,我不在这里重复,仅在此做一些细节上的补充和说明。
首先是数据集的获取,我直接用的这个小哥收集的数据。
需要注意的是,图像的命名都为-------三位数字.jpg,如301.jpg,这样命名是为了之后方便lmdb数据库的生成,以及标注图像的类别。博主是把图像名字的第一个数字当作了对应的类别,通过在配置文件中的命令实现这个操作。
这一过程的实现实在create_filelist.sh中实现的,因为要生成lmdb格式的数据库,对应的txt文件必须要是前面一行是文件路径/文件名 和 类别。
如图所示。现在说一下实现的代码:
#!/usr/bin/env sh
DATA=data/re/ 这一行是你的数据所在的文件目录,但是首先都是在caffe目录下
MY=examples/myfile 这是你自己touch的一个文件,用来保存配置文件
echo "Create train.txt..."
rm -rf $MY/train.txt 删除现有的train.txt文件,即是清除历史文件,生成新的文件
for i in 3 4 5 6 7 总共有5类,从3开始到7结束,这也是每一幅图像名字的开头的数字标号
do
find $DATA/train -name $i*.jpg | cut -d '/' -f4-5|sed "s/$/ $i/">>$MY/train.txt 从图像的名字中剪出类别,即只取第一个数字。sed是把剪出来的类别加到生成的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 '/' -f4-5|sed "s/$/ $i/">>$MY/test.txt
done
echo "All done"
运行这个.sh文件会生成两个txt文件,train.txt和test.txt。如上图所示。
前期的材料已经备齐,之后是生成lmdb数据库。这在creat_lmdb.sh中实现
#!/usr/bin/env sh
MY=examples/myfile 保存creat_lmdb.sh配置文件的路径
echo "Create train lmdb.."
rm -rf $MY/img_train_lmdb
build/tools/convert_imageset \ 要用到caffe tools 中的 convert_imageset 函数。
--shuffle \
--resize_height=256 \
--resize_width=256 \
/home/mysj/caffe/data/re/ \ 图像数据所在的路径
$MY/train.txt \ create_filelist.sh生成的train.txt文件,即是图像名和类别。
$MY/img_train_lmdb
echo "Creat test lmdb.."
rm -rf $MY/img_test_lmdb
build/tools/convert_imageset \
--shuffle \
--resize_width=256 \
--resize_height=256 \
/home/mysj/caffe/data/re/ \
$MY/test.txt \
$MY/img_test_lmdb
echo "All Done.."
运行这个.sh文件会生成两个 img_test_lmdb、img_train_lmdb文件。即成功的把自己的数据集转成了caffe网络需要的数据格式。
补充说明:creat_filelist.sh、creat_lmdb.sh是需要自己写的,之后网络的配置文件是copy自models/bvlc_reference_caffenet中的solver.prototxt train_val.prototxt
然后是修改这两个配置文件:
首先是solver.prototxt文件:
net: "examples/myfile/train_val.prototxt" 这个路径一定要注意,一定要是你的train_val.prototxt所在的路径,不然一定会报错
test_iter: 2
test_interval: 50 这两个数据根据你的测试数据集的大小进行设置。2×50
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 50
max_iter: 5000 迭代次数
momentum: 0.9
weight_decay: 0.0005
solver_mode: GPU 是否使用gpu
然后是train_val.prototxt
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" 改为你的mean.binaryproto文件所在的路径,这个文件的生成会在下面讲。
}
# mean pixel / channel-wise mean instead of mean image
# transform_param {
# crop_size: 227
# mean_value: 104
# mean_value: 117
# mean_value: 123
# mirror: true
# }
data_param {
source: "examples/myfile/img_train_lmdb" 你的训练数据所在的路径
batch_size: 250
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" 上同
}
# mean pixel / channel-wise mean instead of mean image
# transform_param {
# crop_size: 227
# mean_value: 104
# mean_value: 117
# mean_value: 123
# mirror: false
# }
data_param {
source: "examples/myfile/img_test_lmdb" 你的测试数据所在的路径
batch_size: 50
backend: LMDB
}
}
只需要修改这几个地方就可以。
sudo build/tools/compute_image_mean examples/myfile/img_train_lmdb examples/myfile/mean.binaryproto
感兴趣的可以到所在路径下查看源码。
自此,所有的准备工作完成,可以跑网络了。
sudo build/tools/caffe train -solver examples/myfile/solver.prototxt
完成。
之后研究一下imgnet数据集。