最近做实验需要用到caffe,做一下总结以备以后操作参考
实验是使用自己从网上爬的数据集来替换caffe中demo中的数据集
首先介绍一下数据的格式
Caffe生成的数据分为2种格式:Lmdb和Leveldb
它们都是键/值对(Key/Value Pair)嵌入式数据库管理系统编程库。
虽然lmdb的内存消耗是leveldb的1.1倍,但是lmdb的速度比leveldb快10%至15%,更重要的是lmdb允许多种训练模型同时读取同一组数据集。
因此lmdb取代了leveldb成为Caffe默认的数据集生成格式。
不论使用何种框架进行CNNs训练,共有3种数据集:
Training Set:用于训练网络
Validation Set:用于训练时测试网络准确率
Test Set:用于测试网络训练完成后的最终正确率
- 数据集的准备
1在实验目录下分别创建train,test,val三个文件分别存放训练集,测试集,验证集(三个文件家中存放的是图片数据
jpg,png等格式) 使用脚本江上述的图片数据集生成(key,value)的文本数据
2 在此我使用的数据集是从网上搜索出的猫狗的图像各300张数据量有点小,命名格式是cat_xxx.jpg或者是dog_xxx.jpg(这些也是可以利用脚本来完成的)
#!/usr/bin/env sh
DATA=images/train
echo "Create train.txt..."
rm -rf $DATA/train.txt
find $DATA -name cat*.jpg | cut -d '/' -f4 | sed "s/$/ 1/">>$DATA/train.txt
find $DATA -name dog*.jpg | cut -d '/' -f4 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/train.txt
rm -rf $DATA/tmp.txt
echo "Done.."
通过上述脚本可以获取cat_xxx.jpg 1这样的键值对数据存放在train.txt文件中。
- 3 利用train.txt的键值对数据形成lmdb形式的数据。
在caffe中,作者为提供了这样一个文件:convert_imageset.cpp,存放在根目录下的tools文件夹下。编译之后,生成对应的可执行文件放在 buile/tools/ 下面,这个文件的作用就是用于将图片文件转换成caffe框架中能直接使用的db文件。
使用格式
“`
convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
需要带四个参数:
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文件存放目录
#!/usr/bin/env sh
DATA=images/train
rm -rf $DATA/img_train_lmdb
build/tools/convert_imageset --shuffle \
--resize_height=256 --resize_width=256 \
/home/caffe/caffe/images/train $DATA/train.txt $DATA/img_train_lmdb
设置参数-shuffle,打乱图片顺序。设置参数-resize_height和-resize_width将所有图片尺寸都变为256*256.
/home/caffe/caffe/images/train/ 为图片保存的绝对路径。
可以根据实际情况将路径修改。
运行脚本,img_train_lmdb数据生成。
4计算均值
图片减去均值再训练,会提高训练速度和精度。因此,一般都会有这个操作。
caffe程序提供了一个计算均值的文件compute_image_mean.cpp,直接使用就可以了
# sudo build/tools/compute_image_mean images/train/img_train_lmdb images/train/mean.binaryproto
- 5 使用的demo中的网络参数文件和训练参数文件配置
网络参数
网络模型文件在 models/bvlc_reference_caffenet/train_val.prototxt 文件中;
这里直接使用caffe提供的这个网络结构,以后再根据自己的想法做更改;(可以根据models下面的不同网络模型进行选择)
注意:大家需要打开这个文件,更改里面的路径
训练参数
训练参数文件在:models/bvlc_reference_caffenet/solver.prototxt中
对solver.prototxt 修改后的参数如下
net: "/home/caffe/caffe/data/myfile/train_val.prototxt"
test_iter: 4 //测试的时候,输入4个batch
test_interval: 1000 //每迭代1000次,测试一次
base_lr: 0.01 // 初始的学习率是0.01
lr_policy: "step"
gamma: 0.1
stepsize: 3000 //每迭代3000次,调整一次学习率
display: 20 //每20次迭代,显示一次
max_iter: 12000 //最大迭代12000次
momentum: 0.9
weight_decay: 0.0005
snapshot: 5000
snapshot_prefix: "/home/caffe/caffe/data/myfile/"
solver_mode: GPU
这个文件需要根据网络参数与实际的数据来修改。
- 6训练及输出结果
# sudo /home/caffe/caffe/build/tools/caffe train -solver data/myfile/solver.prototxt```
当然,上面的命令,需要根据自己的路径相应的改下
输出的结果并不是很好也许是数据集的问题,毕竟是大数据集下的实验,通过此过程算是一个小小的入门吧。
参考资料
http://caffe.berkeleyvision.org/gathered/examples/imagenet.html
http://www.cnblogs.com/denny402/p/5083300.html