在深度学习的实际应用中,我们经常用到的的原始数据是如jpg、png等格式的图片文件,而且图片的大小也可能不一致。而在caffe中经常使用的数据类型是lmdb或leveldb(当然还有其他格式,这里不做介绍),因此,我们需要将原始图片文件转换为caffe中能够运行的db文件。
在caffe中,作者提供了一个存放在根目录tools文件夹下的convert_imageset.cpp的文件;编译之后,会生成对应的可执行文件放在build/tools/下,这个文件的作用就是将图片文件转换成caffe框架中能直接使用的db文件。
该文件的使用格式是:
conver_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
四个参数的作用分别是:
FLAGS:图片参数组,后面做详细介绍
ROOTFOLDER/:图片存放的绝对路径,从系统根目录开始
LISTFILE:图片文件列表清单,一般为一个txt文件,一行一张图片
DB_NAME:最终生成的db文件存放目录
第一个参数 FLAGS,示例代码:
set -e
EXAMPLE=examples/mnist
DATA=data/mnist
BUILD=build/examples/mnist
BACKEND="lmdb"
echo "Creating ${BACKEND}..."
rm -rf $EXAMPLE/mnist_train_${BACKEND}
rm -rf $EXAMPLE/mnist_test_${BACKEND}
$BUILD/convert_mnist_data.bin $DATA/train-images-idx3-ubyte \
$DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} --backend=${BACKEND}
$BUILD/convert_mnist_data.bin $DATA/t10k-images-idx3-ubyte \
$DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_${BACKEND} --backend=${BACKEND}
echo "Done."
gray——是否以灰度图的方式打开图片。程序调用opencv库中的imread()函数来打开图片,默认为false
shuffle——是否随机打乱图片顺序,默认为false
backend——需要转换成db文件格式,可选为lmdb或leveldb,默认为lmdb
resize_width、resize_height——改变图片大小;在实际运行中,要求所有图片尺寸一致,因此需要修改图片大小。程序调用opencv的resize()函数来对图片放大缩小,默认为0,则是保持图片大小不变。
check_size——检查所有数据的尺寸是否相同,默认为false,不检查
encoded——是否将原图片编码放入最终数据中,默认为false
encode_type——编码方式
第三个参数LISTFILE:
图片可从网上下载,以caffe的mnist为例,get_mnist.sh:
#!/usr/bin/env sh
# This scripts downloads the mnist data and unzips it.
DIR="$( cd "$(dirname "$0")" ; pwd -P )"
cd "$DIR"
echo "Downloading..."
for fname in train-images-idx3-ubyte train-labels-idx1-ubyte t10k-images-idx3-ubyte t10k-labels-idx1-ubyte
do
if [ ! -e $fname ]; then
wget --no-check-certificate http://yann.lecun.com/exdb/mnist/${fname}.gz
gunzip ${fname}.gz
fi
done
如果图片已经下载到了本地,首先需要创建一个图片列表清单,保存为txt。
创建一个create_filelist.sh文件,编辑此文件,代码如下:
# /usr/bin/env sh
DATA=examples/images
echo "Create train.txt..."
rm rf $DATA/train.txt
find $DATA name *cat.jpg | cut d '/' f3 | sed "s/$/ 1/">>$DATA/train.txt
find $DATA name *bike.jpg | cut d '/' f3 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/train.txt
rm rf $DATA/tmp.txt
echo "Done.."
rm:删除文件
find:寻找文件
cut:截取路径
sed:在每行的最后加上备注
cat:将两个类别合并到一个文件里
最终形成一个train.txt文件:
cat.jpg 1
fishbike.jpg 2
除了训练集外,验证集和测试集都需要生成相应的文件:val.txt、test.txt。
除了leveldb和lmdb之外,我们经常会用到HDF5Data格式、MemoryData格式等,这里没有做介绍,但流程和参数都差不多,我的其他文章,如人脸标记点检测用的就是HDF5文件