lmdb用于单标签数据。为了简单起见,我后面通过一个行人与非行人分类问题作为例子,进行相关数据制作讲解。
首先新建一个文件夹,本文命名为caffe_person_Detection,包含train、val文件夹。
1、数据准备
首先我们要准备好训练数据,然后新建一个名为train的文件夹和一个val的文件夹:
同样的我们在val文件下面也创建文件夹:
两个文件也是分别存我们用于验证的图片数据包含人与不包含人图像文件。我们在train/person下面存放了都是包含人的图片,然后在val/person下面存放的都是验证数据包含人的图片。
2、标签文件.txt文件制作
接着我们需要制作一个train.txt、val.txt文件,这两个文件分别包含了我们上面的训练数据的图片路径,以及其对应的标签,如下所示。
我们把包含人的图片标号为1,不包含人的图片标记为0。标签数据文件txt的生成可以通过如下代码,通过扫描路径包含人、不包含人下面的图片,得到标签文件train.txt和val.txt,
注意:必须是这样的person/hah.jpg 1格式。 路径与标签之间是一个空格,标签最好从0开始。
#coding:utf-8
import os
def IsSubString(SubStrList,Str):
flag=True
for substr in SubStrList:
if not(substr in Str):
flag=False
return flag
#扫面文件
def GetFileList(FindPath,FlagStr=[]):
FileList=[]
FileNames=os.listdir(FindPath)
if len(FileNames)>0:
for fn in FileNames:
if len(FlagStr)>0:
if IsSubString(FlagStr,fn):
fullfilename=os.path.join(FindPath,fn)
FileList.append(fullfilename)
else:
fullfilename=os.path.join(FindPath,fn)
FileList.append(fullfilename)
if len(FileList)>0:
FileList.sort()
return FileList
train_txt=open('train.txt','w')
#制作标签数据,如果是狗的,标签设置为0,如果是猫的标签为1
imgfile=GetFileList('train/person') #将数据集放在与.py文件相同目录下
for img in imgfile:
str1=img[6:]+' '+'1'+'\n' #用空格代替转义字符 \t
train_txt.writelines(str1)
imgfile=GetFileList('train/non-person')
for img in imgfile:
str2=img[6:]+' '+'0'+'\n'
train_txt.writelines(str2)
train_txt.close()
#测试集文件列表
test_txt=open('val.txt','w')
#制作标签数据,如果是男的,标签设置为0,如果是女的标签为1
imgfile=GetFileList('val/person')#将数据集放在与.py文件相同目录下
for img in imgfile:
str3=img[4:]+' '+'1'+'\n'
test_txt.writelines(str3)
imgfile=GetFileList('val/non-person')
for img in imgfile:
str4=img[4:]+' '+'0'+'\n'
test_txt.writelines(str4)
test_txt.close()
print("成功生成文件列表")
执行:python create_lmdb_pedestrian_datatxt.py可生成train.txt 、val.txt,
注:本文中生成txt文件时,caffe_person_Detection文件夹与生成文件列表的代码.py文件位于同一个目录下。
3、生成lmdb数据
接着我们的目的就是要通过上面的四个文件(两个txt文件列表、train与val两个图库),把图片的数据和其对应的标签打包起来,打包成lmdb数据格式:在caffe-master创建caffe_person_Detection文件夹,然后将caffe-master下的imagenet文件夹的create_imagenet.sh复制到该文件夹下进行修改,进行训练和测试路径的设置,运行该sh.
注意:这里是对.sh文件进行修改,在终端打开该文件后进行修改并保存。修改可参考如下代码:
#!/usr/bin/env sh
# Create the imagenet lmdb inputs
# N.B. set the path to the imagenet train + val data dirs
set -e
EXAMPLE=/home/zhangjing/zj/project/deepLearning/caffe-master/caffe_person_Detection #生成模型训练数据文件夹,即create_imagenet.sh所在文件夹
DATA=/home/zhangjing/zj/project/deepLearning/caffe-master/caffe_person_Detection #python脚本处理数据路径,即生成的文件列表.txt文件所在文件夹
TOOLS=/home/zhangjing/zj/project/deepLearning/caffe-master/tools #caffe的工具库,不用更改
TRAIN_DATA_ROOT=/home/zhangjing/zj/project/deepLearning/caffe-master/caffe_person_Detection/train/
VAL_DATA_ROOT=/home/zhangjing/zj/project/deepLearning/caffe-master/caffe_person_Detection/val/
# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true // 默认是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..."
rm -rf $EXAMPLE/train_lmdb
rm -rf $EXAMPLE/val_lmdb #删除已存在的lmdb格式文件,若在已存在lmdb格式的文件夹下再添加lmdb文件,会出现错误
GLOG_logtostderr=1 $TOOLS/convert_imageset \
--resize_height=$RESIZE_HEIGHT \
--resize_width=$RESIZE_WIDTH \
--shuffle \
$TRAIN_DATA_ROOT \
$DATA/train.txt \
$EXAMPLE/personDetection_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/personDetection_val_lmdb //可改
echo "Done."
执行:create_imagenet.sh 生成lmdb数据集,如下图
生成lmdb数据过程是如下:
备注:
如果不修改RESIZE为true,可能会报错:
coco@coco-OMEN-by-HP-Laptop:~/caffe/examples/myself$ ./make_imagenet_mean.shF1008 15:47:15.137737 13163 compute_image_mean.cpp:77] Check failed: size_in_datum == data_size (213180 vs. 196608) Incorrect data field size 213180
原因:上一步生成lmdb文件时,图片归一化没有成功,更改myself文件夹下的create_imagenet.sh文件,将 RESIZE=false改为RESIZE=true
4、验证生成的lmdb数据
通过运行上面的脚本,我们将得到文件夹train_lmdb val_lmdb:
我们打开train_lmdb文件夹并查看一下文件data.mdb数据的大小,如果这个数据包好了我们所有的训练图片数据,查一下这个文件的大小是否符合预期大小,如果文件的大小才几k而已,那么就代表你没有打包成功,估计是因为路径设置错误。
制作完数据集文件如下:
参考文献:
http://blog.csdn.net/liuweizj12/article/details/52149743 (写的很不错的,还有出现问题解决办法
http://www.07net01.com/2017/01/1768872.html (很详细的制作数据集)