假设处理Pascal VOC数据集,
图像文件存放路径:/home/my/caffe/data/pascal/JPEGImages/(训练图像和测试图像在一个文件夹内,)
train.txt路径:/home/my/caffe/data/pascal/
val.txt路径:/home/my/caffe/data/pascal/
网络训练文件路径:/home/my/caffe/examples/pascal
其中网络训练文件就是将/home/my/caffe/examples/imagenet文件夹中的文档全部复制过来,修改文件名。
1.前期准备:
我们有两个数据集:训练集train和测试集val,train和val文件夹中存放了原始图像,train.txt和val.txt中存放了图像文件名和标签。txt文件夹中的图像名必须与文件夹中图像名称一致,且TXT文件中的图像名称是包含后缀的,名称与标签之间只能有一个空格!!!若无后缀或者空格较多等情况,使用文档编辑器的查找与替换功能批量处理,无需写程序文件。
2.生成lmdb文件
修改create_pascal.sh(就是create_imagenet.sh文件,只是根据需要改了名字)
#!/usr/bin/env sh
# Create the pascal lmdb inputs
# N.B. set the path to the pascal train + val data dirs
set -e
EXAMPLE=examples/pascal #输出lmdb的路径,这里无需添加绝对路径,且路径前后都没有“/”
DATA=data/pascal #txt文件的路径
TOOLS=build/tools
#TRAIN_DATA_ROOT=/path/to/pascal/train/
#VAL_DATA_ROOT=/path/to/pascal/val/
TRAIN_DATA_ROOT=data/pascal/JPEGImages/ #训练图像路径
VAL_DATA_ROOT=data/pascal/JPEGImages/ #测试图像路径
# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true #数据集图像需要更改大小的话就设为true,否则false
if $RESIZE; then
RESIZE_HEIGHT=256
RESIZE_WIDTH=256
else
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
fi
if [ ! -d "$TRAIN_DATA_ROOT" ]; then
echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
echo "Set the TRAIN_DATA_ROOT variable in create_pascal.sh to the path" \
"where the pascal training data is stored."
exit 1
fi
if [ ! -d "$VAL_DATA_ROOT" ]; then
echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
echo "Set the VAL_DATA_ROOT variable in create_pascal.sh to the path" \
"where the pascal validation data is stored."
exit 1
fi
rm -rf $EXAMPLE/pascal_train_lmdb #删除原有lmdb文件,否则无法运行第二次
rm -rf $EXAMPLE/pascal_val_lmdb
echo "Creating train lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/pascal_train_lmdb
echo "Creating val lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$DATA/val.txt \
$EXAMPLE/pascal_val_lmdb
echo "Done."
-shuffle: 是否随机打乱图片顺序。默认为false
3.二进制均值文件make_pascal_mean.sh
#!/usr/bin/env sh
# Compute the mean image from the imagenet training lmdb
# N.B. this is available in data/ilsvrc12
EXAMPLE=examples/pascal #同第2步
DATA=data/pascal
TOOLS=build/tools
$TOOLS/compute_image_mean $EXAMPLE/pascal_train_lmdb \
$DATA/pascal_mean.binaryproto
echo "Done."
4.如何在原有训练模型上继续训练?
在训练文件夹中创建resume_train.sh,内容与训练sh文件相同,打开后,
#!/usr/bin/env sh
set -e
./build/tools/caffe train \
--solver=examples/pascal/solver.prototxt $@
在删除“$@”后添加“\”,添加
--snapshot=examples/pascal/caffenet_train_10000.solverstate.h5
create_pascal.sh内容为
#!/usr/bin/env sh
set -e
./build/tools/caffe train \
--solver=examples/pascal/solver.prototxt \
--snapshot=examples/pascal/caffenet_train_10000.solverstate.h5
说明在迭代10000次之后的模型(模型文件caffenet_train_10000.solverstate.h5,其实还有一个文件,不过填的是这个)中继续训练。