1.建立好自己的文件夹如图所示,总文件夹中包括train和test两个文件夹,train和test文件夹下又包含两个文件夹,cat和dog文件夹,如图所示
输入ls train/cat/ | sed "s:^:cat/:" |sed "s:$: 0:" >>train.txt,将cat的图片信息就会输入到TXT文件中,会看到生成的train.txt
然后输入ls train/dog/ | sed "s:^:dog/:" |sed "s:$: 1:" >>train.txt,将dog的图片信息写入到train.txt中。整个训练的图片的信息输入完成。
同理,输入测试集的图片的信息ls test/cat/ | sed "s:^:cat/:" |sed "s:$: 0:" >>t_test.txt,ls test/dog/ | sed "s:^:dog/:" |sed "s:$: 1:" >>t_test.txt。训练集和测试集的图片信息输入完成。
2.将图片数据转化为LMDB数据
在data文件夹下建立一个lmdb文件夹,然后将caffe-master下的imagenet文件夹的create_imagenet.sh复制到该文件夹下进行修改
#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
set -e
EXAMPLE=lmdb #根据终端命令确定,data/lmdb
DATA=data_test #即生成的文件列表.txt文件所在文件夹
TOOLS=/home/wuqingqing/caffe-master/build/tools
TRAIN_DATA_ROOT=/home/wuqingqing/data/data_test/train/ #待处理的训练数据,必须是绝对路径
VAL_DATA_ROOT=/home/wuqingqing/data/data_test/test/ #待处理的测试数据
# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=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_imagenet.sh to the path" \
"where the ImageNet 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_imagenet.sh to the path" \
"where the ImageNet validation data is stored."
exit 1
fi
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/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/test.txt \
$EXAMPLE/test_lmdb
echo "Done."
返回到data文件下,执行终端命令./lmdb/create_imagenet.sh。就可以看到lmdb下面生成两个lmdb文件夹3.计算均值并保存
在data文件加下打开终端命令,输入sudo /home/wuqingqing/caffe-master/build/tools/compute_image_mean lmdb/train_lmdb lmdb/train_lmdb/mean.binaryproto
compute_image_mean带两个参数,第一个参数时lmdb训练数据位置,第二个参数设定均值文件的名字及保存路径。
运行成功后,如下图所示
会在lmdb文件夹下看到mean.binaryproto
可能出现的错误
原因是:图片没有同一大小,把所有的图片都大小一致
4创建模型并编写配置文件
模型就用程序自带的caffenet模型,位置在 models/bvlc_reference_caffenet/文件夹下, 将需要的两个配置文件,复制到lmdb文件夹内
在data文件夹下执行命令 sudo cp /home/wuqingqing/caffe-master/models/bvlc_reference_caffenet/solver.prototxt lmdb/
修改其中的solver.prototxt 执行命令 sudo vi lmdb/solver.prototxt
net: "lmdb/train_val.prototxt"
test_iter: 2
test_interval: 50
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 20
max_iter: 500
momentum: 0.9
weight_decay: 0.0005
solver_mode: CPU
在data文件夹下执行命令sudo cp /home/wuqingqing/caffe-master/models/bvlc_reference_caffenet/train_val.prototxt lmdb/修改其中的train_val.prototxt 执行命令 sudo vi lmdb/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: "lmdb/mean.binaryproto"
}
data_param {
source: "lmdb/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: "lmdb/mean.binaryproto"
}
data_param {
source: "lmdb/test_lmdb"
batch_size: 50
backend: LMDB
}
实际上就是修改两个data layer的mean_file和source这两个地方,其它都没有变化 。
五、训练和测试
如果前面都没有问题,数据准备好了,配置文件也配置好了,这一步就比较简单了。
输入:sudo /home/wuqingqing/caffe-master/build/tools/caffe train --solver=lmdb/solver.prototxt
训练时出现的错误如下:
1.一直出现“Restarting data prefetching from start”,修改train_val.prototxt中参数,
data_param {
source: "lmdb/train_lmdb"
batch_size: 256
backend: LMDB
}
训练集太笑了,将256改成50就可以了2.出现Check failed:datum_height >= crop_size (220 vs. 227)错误
查看:http://www.cnblogs.com/hust-yingjie/p/6526370.html
最后跑了两个多小时,结果才出来