假设处理PascalVOC数据集,
图像文件存放路径:/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,其实还有一个文件,不过填的是这个)中继续训练。