caffe框架使用的数据格式通常是lmdb和leveldb,但是我们经常用到的是图片文件,如jpg,jpeg,png,tif等格式的,而且有可能图片的大小还不一致。
转换过程中,需要准备两部分内容:
1:train.txt和test.txt带有标签的图像地址列表文件,
2:执行文件。
第一部分如下图所示
注意:必须保证路径正确,并且在标签后面不能出现空格,否则会出现找不到文件的错误。()
我们可以查看源代码,convet_imageset.cpp中有这样一段:
int label;
while (std::getline(infile, line)) {
pos = line.find_last_of(' ');
label = atoi(line.substr(pos + 1).c_str());
lines.push_back(std::make_pair(line.substr(0, pos), label));
}
第二部分:
在convet_imageset.cpp文件main函数中给出执行文件的写法如下:
ROOTFOLDER/: 图片存放的绝对路径
LISTFILE: 图片文件列表清单,一般为一个txt文件,一行一张图片(带有标签)
DB_NAME: 生成的db文件存放位置
我们来了解一下FLAGS参数组的内容:
DEFINE_bool(gray, false,
"When this option is on, treat images as grayscale ones");
DEFINE_bool(shuffle, false,
"Randomly shuffle the order of images and their labels");
DEFINE_string(backend, "lmdb",
"The backend {lmdb, leveldb} for storing the result");
DEFINE_int32(resize_width, 0, "Width images are resized to");
DEFINE_int32(resize_height, 0, "Height images are resized to");
DEFINE_bool(check_size, false,
"When this option is on, check that all the datum have the same size");
DEFINE_bool(encoded, false,
"When this option is on, the encoded image will be save in datum");
DEFINE_string(encode_type, "",
"Optional: What type should we encode the image as ('png','jpg',...).");
–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’……
编写执行文件,创建.bat脚本。
.\Build\x64\Release\convert_imageset.exe –gray=true –backend=leveldb –shuffle=true –resize_height=22 –resize_width=22 test/ test.txt leveldb
大功告成!
调了一上午的错误,终于在Release下跑通了。。。我觉得应该写一个改错误的文章了。。。。有空多看看源码吧