将图片转换成caffe的lmdb形式并进行实验

最近做实验需要用到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. 数据集的准备
    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

你可能感兴趣的:(caffe)