图像数据转换为levedb或者lmdb+caffe上跑自己的数据
JLU-IPVR
听笙
图像数据转换为levedb或lmdb
在我们学习深度学习的过程中,难免要去使用自己的原始数据进行试验,验证一些网络模型,我们遇到的图片文件格式如:jpg,jpeg,png,bmp等格式,并且图像的尺寸不一定统一,图像是否都是灰度图等。那么如何将这些原始图像数据转化为caffe能够使用的文件(levedb/lmdb)呢?
其实在caffe中提供了一个文件:convert_imageset.cpp,编译后,生成的可执行文件存放在E:\caffe-windows\caffe-master\Build\x64\Debug文件夹下(以作者自己电脑中caffe的文件夹为例)。
这个可执行文件的使用方式:
convert_imageset[FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
FLAGS:图片参数组,后面进行详细介绍;
ROOTFOLDER/:图片存放的绝对路径;
LISTFILE:图片文件列表清单,一般为一个txt,每行对应一张图片。
如果图片已经在本地,那么需要创建一个图片列表清单,保存为txt(后续介绍)。接下来详细介绍FLAGS这个参数组。
-gray:是否以灰度图的方式打开图片,默认为false;
-shuffle:是否随机打乱图片顺序,默认为false;
-backend:需要转换成的文件格式,可选是levedb或者是lmdb,默认是lmdb;
-check_size:检查所有数据是否有相同的尺寸,默认为false;
-resize_width/resize_height:改变图片的大小,在运行时要求所有图片的尺寸一致,因此需要改变图片的大小,默认为0,不改变;
-encoded:是否将原图片编码放入最终的数据集中,默认为false;
-encode_type:与前一个参数对应,将图片编码为哪个格式:png,jpg等。
具体实例:
SET GLOG_logtostderr=1
convert_imageset.exe-resize_width=28 --resize_height=28 --gray=true --shuffle --backend="leveldb"C:\Users\LJL\Desktop\CodeRec\ 图片绝对路径(和标签里记录的路径组合起来就是图片的完整路径)C:\Users\LJL\Desktop\CodeRec\data\train2.txt标签C:\Users\LJL\Desktop\CodeRec\data\traindb0 pause
新建一个bat文件,内容如上。
运行这个bat文件就能将原始数据转换为levedb的格式。
在caffe上跑自己的数据
我们以手写数字识别为例,这个数据集是,实验室自己收集制作的。
可以分为以下几个步骤:
1) 制作训练集和测试集;
2) 将原始图像的格式转换为levedb或者lmdb.;
3) 利用转换好的数据计算均值,生成训练样本和测试样本的均值文件;
4) 利用LeNet网络结构进行训练;
制作训练集和测试集;
按照mnist数据集的规模进行构建,60000张训练数据,10000张测试数据。
将原始图像的格式转换为levedb或者lmdb:
首先,要制作标签,训练集和测试集数据都要制作标签使用批处理文件list.bat
dir/b/s/p/w *.bmp > num.txt
在训练集中,将每张图片产生的标签复制到一个train.txt中作为训练集的标签。
在测试集中,将每张图片产生的标签复制到一个test.txt中作为测试集的标签。
接下来,将原始数据进行转换。训练集和测试集都需要进行转换。使
用convert_imageset.exe。
运行bat文件运行过程如下图所示:
利用转换好的数据计算均值,生成训练样本和测试样本的均值文件:
使用批处理文件compute_image_mean.bat
compute_image_mean.exe--backend="leveldb"D:\experiment\data\testdbD:\experiment\data\val_mean.binaryprotocompute_image_mean.exe--backend="leveldb" D:\experiment\data\traindbD:\experiment\data\train_mean.binaryproto
pause
利用LeNet网络结构进行训练:
需要有这三个文件,训练时使用到其中的两个lenet_solver. prototx和lenet_train_test_prototxt,前者是训练模型时使用到的一些参数的设定,后者是网络结构。
接下来就可以训练自己的样本了。
使用批处理文件
caffe train--solver=D:/experiment/data/lenet_solver.prototxt
pause
训练过程如图所示:
训练结果如图所示:
识别率达到了0.9884.