您的位置:首页 > Web前端

Caffe操作技巧之如何快速准备自己的lmdb数据集

2017-02-07 14:48 453 查看
这一期背景是安装完成了Caffe,在研究如何由图片转为lmdb文件时,在图片训练集上犯了愁。既不想下载imagenet,又不想费尽心思自己再准备个数据集(毕竟只是想简单测试一下Caffe,想体验一下跑自己数据集的快感)。于是各种歪脑子动尽,技巧列在下面了。

任何事情都有一二三,那么,首先要考虑的是,怎么快速拥有一堆图片!
答案是只要你有一张图片就好了,嗯,充分发挥ctrl CV精神,还省去了未来图片大小需要一致的问题。还是那句话,毕竟只是想测试一下。

第二,如何快速重命名这一堆图片?
面临一堆 副件123456...,看起来蛋疼,但只需要全选中,然后右键键入image,惊喜的发现全部文件名都变成了image (1),image (2)...这样的规律,是有利于到时候写convert_lmdb.bat的!

那么问题又来了。在测试过程中,发现convert_lmdb.bat文件读取train_file_name.txt(即所有训练图片集的文件名)过程中,读到的文件个数始终为0!再三检查后发现,文件名中不能有空格!好吧,但是刚才右键重命名的过程中生成的image
(1).jpg天然带一个空格(windows 10测试,其他系统不知道),如何去掉这些空格,重命名这堆图片呢?

针对这个问题,专门从网上找到了几个方法。分享记录于此。
文件重命名三部曲。
1、全选图片,右键键入image,调整成为image (1).png,带空格的形式。
2、在该图片文件夹中,新建bat文件,写入如下内容

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /s/b *.*') do (
set "foo=%%~nxi"
set foo=!foo: =!
set foo=!foo: =!
ren "%%~fi" "!foo!"
)
exit


然后运行bat文件。这时候图片全都变成了image(1).png,空格就全去掉了。
3、这个时候其实就可以了,但是我看着括号感觉十分不爽,于是接下来是去括号。
分两步。
(1)新建excel,第一列写ren imageset(1).png,第二列写imageset1.png,第三列写A1&" "&A2。然后均向下拖动自动填充图片序号一直到全部图片数。
(2)把第三列复制下来,同样填写到一个bat文件里,执行bat,这时候图片就全变成了image1.png...了。

第三,准备各种bat文件和exe文件。
不复杂。这里准备三个exe和三个对应的执行这些exe的bat文件(省得每回再敲cmd了),分别是compute_image_mean.exe,convert_imageset.exe以及caffe_gpu.exe。exe文件的生成参考上一篇,简单说就是从tools里面找到对应的cpp文件,然后放到caffe项目下跑出来生成该cpp对应的exe就行了。
然后是bat。由于caffe自带的是各种蛋疼的sh文件,是linux下的东西,windows下还需要下载什么gcc啥的,麻烦,于是就自己照着网上的例子写了bat文件。
这个是执行convert_imageset.exe对应的bat文件。我把caffe放在了D盘这个目录,所以多了这几步读盘符和cd进文件夹的操作。
SET GLOG_logtostderr=1
D:
cd D:\Program Files\Caffe\data\QQimage
convert_imageset.exe train/ train.txt mytrainlmdb 0
pause

然后convert_imageset.exe后面第一个参数是图片集所在文件夹,因为是相对路径,所以写/而不是\。然后空格,第二个参数是咱们第二步里准备的那些文件名,需要填写进一个txt文件里。这里我们把刚才excel里面生成的那一堆文件名粘过来。由于还需要在后面放对应的标签,这里把png替换一下,或者是excel里再操作一下,就行了。如开题所说,我们仅仅是为了测试,所以我就随便填了0 1 2三种标签。做好的txt文件(train.txt)内容如下面几行所示。
image1.png 0
image2.png 0
image3.png 0
image4.png 0
image5.png 1
image6.png 1
image7.png 1
image8.png 1
image9.png 1

第三个参数是生成的lmdb的文件夹名称,生成后会有data和lock两个文件存放在mytrainlmdb文件夹里。第四个参数填0,不知道是什么。
运行这个bat文件,lmdb就生成了。

至此,你应该看到梦寐以求的lmdb数据集了。

---------------------------------------------------------------------------分割线--------------------------------------------------------------------------------------

后续
第四,calculate_image_mean.exe和caffe.exe对应的bat文件。
SET GLOG_logtostderr=1
D:
cd D:\Program Files\Caffe\data\QQimage
compute_image_mean.exe mytrainldb mymean.binaryproto
pause

不多说了,生成的mean文件为mymean.binaryproto。
SET GLOG_logtostderr=1
D:
cd D:\Program Files\Caffe\data\QQimage
caffe_gpu.exe train --solver=solver.prototxt
pause


这里要注意这种caffe_gpu.exe train --solver=solver.prototxt的写法。solver文件是一个单独的文件,存放各类配置等,从mnist里面拷出来修改一下。
我的贴在这里。
net: "train_val.prototxt"
test_iter: 80
test_interval: 10
base_lr: 0.01
lr_policy: "step"
gamma: 0.1
stepsize: 1
display: 3
max_iter: 80
momentum: 0.9
weight_decay: 0.005
snapshot: 4000
snapshot_prefix: "prefix"
solver_mode: GPU


test_iter是迭代次数。test_interval是多少图片一批。
这里有个详细的介绍。http://blog.csdn.net/u012746763/article/details/51549184

然后特别说明的是,(1)stepsize和滑动窗口原理一样,是步长,很好理解了。test_iter,test_interval和stepsize一定要协调好,数据集太小的情况下,不要超过数据集数量范围。
(2)第一行又是一个单独的文件,存放net的结构。这个也从mnist里面找到就行了。
(3)snapshot_prefix随便写就行,代表的是训练过程的快照,快照的名字是prefix。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息