笔记2:caffe制作行人检测数据集

caffe对于训练数据格式,支持:lmdb、hdf5……,其中lmdb数据格式常用于单标签数据,像分类等,经常使用lmdb的数据格式。对于回归等问题,或者多标签数据,一般使用h5py数据的格式。当然好像还有其它格式的数据可用,本文就主要针对lmdb数据格式的制作方法,进行简单讲解。

以一个简单的例子来介绍一下如何生成自己的图像集。主要分为两步:
(1)生成标签文件列表,即生成 .txt 文件
(2)将 txt 文件列表中的图像与train图像库、val图像库的图像相连接,生成lmdb格式文件

lmdb数据

lmdb用于单标签数据。为了简单起见,我后面通过一个行人与非行人分类问题作为例子,进行相关数据制作讲解。

首先新建一个文件夹,本文命名为caffe_person_Detection,包含train、val文件夹。

1、数据准备

首先我们要准备好训练数据,然后新建一个名为train的文件夹和一个val的文件夹:

笔记2:caffe制作行人检测数据集_第1张图片
train文件存放训练数据,val文件存放验证数据。然后我们在train文件下面,把训练数据包含人、不包含人图片各放在一个文件夹下面:

笔记2:caffe制作行人检测数据集_第2张图片

同样的我们在val文件下面也创建文件夹:

笔记2:caffe制作行人检测数据集_第3张图片

两个文件也是分别存我们用于验证的图片数据包含人与不包含人图像文件。我们在train/person下面存放了都是包含人的图片,然后在val/person下面存放的都是验证数据包含人的图片。


2、标签文件.txt文件制作

接着我们需要制作一个train.txt、val.txt文件,这两个文件分别包含了我们上面的训练数据的图片路径,以及其对应的标签,如下所示。


笔记2:caffe制作行人检测数据集_第4张图片

我们把包含人的图片标号为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("成功生成文件列表")  

上述代码保存为.py的Python文件,运行该Python代码生成 txt 文件。

执行: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数据过程是如下:

笔记2:caffe制作行人检测数据集_第5张图片

备注:

如果不修改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文件夹

笔记2:caffe制作行人检测数据集_第6张图片

并查看一下文件data.mdb数据的大小,如果这个数据包好了我们所有的训练图片数据,查一下这个文件的大小是否符合预期大小,如果文件的大小才几k而已,那么就代表你没有打包成功,估计是因为路径设置错误。


制作完数据集文件如下:

笔记2:caffe制作行人检测数据集_第7张图片






参考文献:

http://blog.csdn.net/liuweizj12/article/details/52149743 (写的很不错的,还有出现问题解决办法

http://www.07net01.com/2017/01/1768872.html  (很详细的制作数据集)

你可能感兴趣的:(caffe)