在深度学习的实际应用中,我们经常用到的原始数据是图片文件,如jpg,png,tif等格式的,而且有可能图片的大小还不一致。
我今天尝试制作一个自己的训练数据集,主要步骤为:
1.用MATLAB截图得到训练集的图片
2.生成标签文件列表,即生成 train.txt val.txt 文件
3.将 txt 文件列表中的图像与train图像库、val图像库的图像相连接,生成lmdb格式文件
实验是对一副315×299像素的jpg灰度图片所进行的,我首先用MATLAB截图代码对其进行了三个类别的截图,然后对这三个类别进行15×15的滑动窗口分割,得到了每个类别400张15×15的图片样本,其中200张用作train 100张用做test。
而在caffe中经常使用的数据类型是lmdb或leveldb,如何从原始图片文件转换成caffe中能够运行的db(leveldb/lmdb)文件?
在caffe中,作者为我们提供了这样一个文件:convert_imageset.cpp,存放在根目录下的tools文件夹下。编译之后,生成对应的可执行文件放在 buile/tools/ 下面,这个文件的作用就是用于将图片文件转换成caffe框架中能直接使用的db文件。
1 数据准备
首先在caffe根目录下建立一个文件夹myfile,用于存放数据文件和后面的caffe模型相关文件。
然后在myfile文件夹下建立build_lmdb和datatest两个文件夹,其中build_lmdb文件夹用于存放生成的lmdb文件,datatest文件夹存放图片数据。
在datatest下主要有2个文件夹和2个.sh文件和2个.txt文件,其中train文件夹中存放待训练的图片,val文件夹中存放待测试的图片,creatlist.sh是分别用来生成train和val的.sh文件,train.txt和val.txt是生成的标签文件。
建立好文件夹后,我们把MATLAB分割好的图片放到train和val文件夹里面
我在这里对3个类别分别又建立了3个文件夹
这是其中的一个类别,其他的和val文件夹同此, 把待训练的图片放到这里。
2 生成train.txt val.txt
下面是生成train.txt标签文件的.sh文件指令
- 其中DATA是train数据的目录,DATASAVE是train.txt保存的路径
- -name ground*.jpg的意思呢是指的是以ground开头的图片名字
- cut -d ‘/’ -f3-5是截取图片的路径,调整-f后面的数字可设置几级路径
- sed “s/$/ 1/”是在其后面加上 1(空格和1)
- 然后保存到train.txt中
# /usr/bin/env sh
DATA=myfile/datatest/train/
DATASAVE=myfile/datatest/
echo "Create train.txt..."
find $DATA -name ground*.jpg | cut -d '/' -f3-5 | sed "s/$/ 1/">>$DATASAVE/train.txt
find $DATA -name sea*.jpg | cut -d '/' -f3-5 | sed "s/$/ 2/">>$DATASAVE/tmp.txt
find $DATA -name matou*.jpg | cut -d '/' -f3-5 | sed "s/$/ 3/">>$DATASAVE/tmp1.txt
cat $DATASAVE/tmp.txt>>$DATASAVE/train.txt
cat $DATASAVE/tmp1.txt>>$DATASAVE/train.txt
rm -rf $DATASAVE/tmp.txt
rm -rf $DATASAVE/tmp1.txt
echo "Done.."
以此就可以生成train.txt文件了,见下图
生成val.txt文件同上
至此我们就已经完成了制作自己的数据集以及生成train.txt和val.txt
3 生成LMDB文件
在caffe root/examples/imagenet中有个create_imagenet.sh文件,我们将其复制到我们的build_lmdb文件夹下重命名为create_mynet.sh,然后对其中需要修改的地方进行修改:
- 其中EXAMPLE=myfile/build_lmdb改为自己文件的路径
- DATA=myfile/datatest,改为自己的路径
- TRAIN_DATA_ROOT和TRAIN_DATA_ROOT修改到路径datatest,这里因为train.txt文件的路径是从datatest开始的
- TOOLS保持不变
- resize是调整其大小为256*256以适应net的输入,这里还不太懂,先记下来
#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
set -e
EXAMPLE=myfile/build_lmdb
DATA=myfile/datatest
TOOLS=build/tools
TRAIN_DATA_ROOT=/home/dragon/caffe/myfile/datatest/
VAL_DATA_ROOT=/home/dragon/caffe/myfile/datatest/
# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=false
if $RESIZE; then
RESIZE_HEIGHT=256
RESIZE_WIDTH=256
else
RESIZE_HEIGHT=0
RESIZE_WIDTH=0
fi
if [ ! -d "$TRAIN_DATA_ROOT" ]; then
echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet training data is stored."
exit 1
fi
if [ ! -d "$VAL_DATA_ROOT" ]; then
echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \
"where the ImageNet validation data is stored."
exit 1
fi
echo "Creating train lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/train_lmdb
echo "Creating val lmdb..."
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$VAL_DATA_ROOT \
$DATA/val.txt \
$EXAMPLE/val_lmdb
echo "Done."
然后在终端里面执行
cd caffe
./myfile/build_lmdb/create_mynet.sh
即可得到lmdb文件
然后就可以利用这些文件进行训练啦,我看有的模型里面还有添加均值文件,下次在学习均值文件的生成~
参考: