caffe——训练自己的模型
step1:将图片数据转化为lmdb格式
caffe中建议将图片转化为lmdb格式,我们可以利用caffe提供的工具中的convert_imageset,这个工具是需要使用open cv,因此在配置caffe中需要注意。我使用的OPENCV的2.4。
## Refer to http://caffe.berkeleyvision.org/installation.html
# Contributions simplifying and improving our build system are welcome!# cuDNN acceleration switch (uncomment to build with cuDNN).
# USE_CUDNN := 1# CPU-only switch (uncomment to build without GPU support).
# CPU_ONLY := 1# uncomment to disable IO dependencies and corresponding data layers
USE_OPENCV := 1
# USE_LEVELDB := 1
USE_LMDB := 1# uncomment to allow MDB_NOLOCK when reading LMDB files (only if necessary)
# You should not set this flag if you will be reading LMDBs with any
# possibility of simultaneous read and write
# ALLOW_LMDB_NOLOCK := 1# Uncomment if you\’re using OpenCV 3
# OPENCV_VERSION := 3
convert_imageset需要设定相关参数,可以参考http://www.cnblogs.com/denny402/p/5082341.html。
需要带四个参数:
FLAGS: 图片参数组
{
-gray: 是否以灰度图的方式打开图片。程序调用opencv库中的imread()函数来打开图片,默认为false
-shuffle: 是否随机打乱图片顺序。默认为false
-backend:需要转换成的db文件格式,可选为leveldb或lmdb,默认为lmdb
-resize_width/resize_height: 改变图片的大小。在运行中,要求所有图片的尺寸一致,因此需要改变图片大小。 程序调用opencv库的resize()函数来对图片放大缩小,默认为0,不改变
-check_size: 检查所有的数据是否有相同的尺寸。默认为false,不检查
-encoded: 是否将原图片编码放入最终的数据中,默认为false
-encode_type: 与前一个参数对应,将图片编码为哪一个格式:‘png\’,\’jpg\’……
}
ROOTFOLDER/: 图片存放的绝对路径,从linux系统根目录开始
LISTFILE: 图片文件列表清单,一般为一个txt文件,一行一张图片
DB_NAME: 最终生成的db文件存放目录
写成一个脚本convertlmdb.sh,由于我打算用AlexNet,所以对图片进行了一下resize。
1 IMAGE=/home/caffe-master/trainimage/ 2 LABEL=/home/caffe-master/train_label.txt 3 CAFFE_PATH=/home/caffe-master 4 LMDB_PATH=/home/train_lmdb 5 rm -rf $LMDB_PATH 6 $CAFFE_PATH/build/tools/convert_imageset \ 7 --backend=lmdb \ 8 --resize_height=227 --resize_width=227 \ 9 $IMAGE \ 10 $LABEL \ 11 $LMDB_PATH
step2:计算均值
在模型的输入中,需要计算训练数据中的均值,caffe同样提供了工具来进行计算。
1 CAFFE-MASTER 2 LMDB_PATH=/home/caffe-master/data/pedestrian/test_lmdb 3 MEAN_PATH=/home/caffe-master/data/pedestrian/testmean.binaryproto 4 $CAFFE-MASTER/build/tools/compute_image_mean \ 5 $LMDB_PATH \ 6 $MEAN_PATH
step3:定义模型和solver
关于模型的参数可以参考我的caffe——常用layer参数,我们使用CAFFENET,这个网络是对Alexnet的实现,protottxt可以在/caffe-master/models/bvlc_reference_caffenet中找到。对于训练策略,我们可以将文件中的solver.prototxt文件进行修改,使用了随机梯度下降的方法,训练策略可以参考http://caffe.berkeleyvision.org/tutorial/solver.html
#网络定义
net: "models/bvlc_reference_caffenet/train_val.prototxt" #测试集测试时迭代的次数
test_iter: 1000
#测试间隔 test_interval: 1000 #起始学习率
base_lr: 0.01
#学习率变化策略,step是递减的 lr_policy: "step" gamma: 0.1
#学习率递减的间隔 stepsize: 100000 #显示loss的次数
display: 20 #最大训练次数
max_iter: 450000 momentum: 0.9 weight_decay: 0.0005 #保存参数的次数
snapshot: 10000 #参数保存位置
snapshot_prefix: "models/bvlc_reference_caffenet/caffenet_train" #使用CPU或GPU
solver_mode: GPU
step4:开始训练
训练可以使用tools中的caffe,在命令行输入caffe我们可以看到相关的参数提示。
编写一个训练脚本,solver参数是必须给定的,model可以使用已经训练好的模型进行继续训练,设定–snapshot可以继续未完成的训练。
1 ./build/tools/caffe train \ 2 --solver=/home/caffe-master/models/cifar10/solver.prototxt \