zoukankan      html  css  js  c++  java
  • caffe数据集制作比较好的博客

    https://blog.csdn.net/u010417185/article/details/52119863#

    https://blog.csdn.net/hjimce/article/details/49248231

    caffe对于训练数据格式,支持:lmdb、h5py……,其中lmdb数据格式常用于单标签数据,像分类等,经常使用lmdb的数据格式。对于回归等问题,或者多标签数据,一般使用h5py数据的格式。当然好像还有其它格式的数据可用,本文就主要针对lmdb数据格式的制作方法,进行简单讲解。
     
    以一个简单的例子来介绍一下如何生成自己的图像集。主要分为两步:
     
    (1)生成标签文件列表,即生成 .txt 文件
    (2)将 txt 文件列表中的图像与train图像库、val图像库的图像相连接,生成lmdb格式文件
     
    lmdb数据

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

    1、数据准备

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

    train文件存放训练数据,val文件存放验证数据。然后我们在train文件下面,把训练数据猫、狗图片各放在一个文件夹下面:

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

    两个文件也是分别存我们用于验证的图片数据猫与狗图像文件。我们在test_cat下面存放了都是猫的图片,然后在test_dog下面存放的都是验证数据的狗图片。

    将train 与 val 文件夹放到一个文件夹内,本文中放到了Data_Test文件夹内。

     

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

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

     

     
     
     
     
     

    我们把猫图片标号为1,狗图片标记为0。标签数据文件txt的生成可以通过如下代码,通过扫描路径猫、狗下面的图片,得到标签文件train.txt和val.txt:

     

    需要注意的是,路径与标签之间是一个空格,标签最好从0开始。

     

     

    1.  
      <pre class="python" name="code">#coding:utf-8
    2.  
      '''
    3.  
      Created on Jul 29, 2016
    4.  
       
    5.  
      @author: sgg
    6.  
      '''
    7.  
       
    8.  
      "<span style=""font-family:Arial;font-size:18px;"">"
    9.  
      "<span style=""font-size:18px;"">"
    10.  
      "<span style=""font-size:18px;"">"
    11.  
      import os
    12.  
       
    13.  
      def IsSubString(SubStrList,Str):
    14.  
      flag=True
    15.  
      for substr in SubStrList:
    16.  
      if not(substr in Str):
    17.  
      flag=False
    18.  
       
    19.  
      return flag
    20.  
       
    21.  
      #扫面文件
    22.  
      def GetFileList(FindPath,FlagStr=[]):
    23.  
      FileList=[]
    24.  
      FileNames=os.listdir(FindPath)
    25.  
      if len(FileNames)>0:
    26.  
      for fn in FileNames:
    27.  
      if len(FlagStr)>0:
    28.  
      if IsSubString(FlagStr,fn):
    29.  
      fullfilename=os.path.join(FindPath,fn)
    30.  
      FileList.append(fullfilename)
    31.  
      else:
    32.  
      fullfilename=os.path.join(FindPath,fn)
    33.  
      FileList.append(fullfilename)
    34.  
       
    35.  
      if len(FileList)>0:
    36.  
      FileList.sort()
    37.  
       
    38.  
      return FileList
    39.  
       
    40.  
       
    41.  
       
    42.  
      train_txt=open('train.txt','w')
    43.  
      #制作标签数据,如果是狗的,标签设置为0,如果是猫的标签为1
    44.  
      imgfile=GetFileList('train/train_cat')#将数据集放在与.py文件相同目录下
    45.  
      for img in imgfile:
    46.  
      str1=img+' '+'1'+' ' #用空格代替转义字符
    47.  
      train_txt.writelines(str1)
    48.  
       
    49.  
       
    50.  
      imgfile=GetFileList('train/train_dog')
    51.  
      for img in imgfile:
    52.  
      str2=img+' '+'0'+' '
    53.  
      train_txt.writelines(str2)
    54.  
      train_txt.close()
    55.  
       
    56.  
       
    57.  
      #测试集文件列表
    58.  
      test_txt=open('val.txt','w')
    59.  
      #制作标签数据,如果是男的,标签设置为0,如果是女的标签为1
    60.  
      imgfile=GetFileList('val/test_cat')#将数据集放在与.py文件相同目录下
    61.  
      for img in imgfile:
    62.  
      str3=img+' '+'1'+' '
    63.  
      test_txt.writelines(str3)
    64.  
       
    65.  
       
    66.  
      imgfile=GetFileList('val/test_dog')
    67.  
      for img in imgfile:
    68.  
      str4=img+' '+'0'+' '
    69.  
      test_txt.writelines(str4)
    70.  
      test_txt.close()
    71.  
       
    72.  
      print("成功生成文件列表")
    
    
    
    
     
     
    将上述代码保存为.py的Python文件,运行该Python代码生成 txt 文件。
     

    注:本文中生成txt文件时,Data_Test文件夹与生成文件列表的代码.py文件位于同一个目录下。

    3、生成lmdb数据

    接着我们的目的就是要通过上面的四个文件(两个txt文件列表、train与val两个图库),把图片的数据和其对应的标签打包起来,打包成lmdb数据格式:

    在caffe-master创建My_Files文件夹,然后将caffe-master下的imagenet文件夹的create_imagenet.sh复制到该文件夹下进行修改,进行训练和测试路径的设置,运行该sh.

    注意:这里是对.sh文件进行修改,在终端打开该文件后进行修改并保存。这里为了排版所以代码类型选择了Python代码类型。

    1.  
      <pre class="python" name="code">#!/usr/bin/env sh
    2.  
      # Create the imagenet lmdb inputs
    3.  
      # N.B. set the path to the imagenet train + val data dirs
    4.  
      set -e
    5.  
       
    6.  
       
    7.  
      EXAMPLE=My_Files/Build_lmdb #生成模型训练数据文件夹,即create_imagenet.sh所在文件夹
    8.  
      DATA=My_Files/Data_Test #python脚本处理数据路径,即生成的文件列表.txt文件所在文件夹
    9.  
      TOOLS=build/tools #caffe的工具库,不用更改
    10.  
       
    11.  
      TRAIN_DATA_ROOT=<span style="font-size:14px;">/home/sgg/workspace/caffe_learn/scr/Data_Test/</span> #待处理的训练数据
    12.  
      VAL_DATA_ROOT=<span style="font-size:14px;">/home/sgg/workspace/caffe_learn/scr/Data_Test/</span> #待处理的验证数据
    13.  
       
    14.  
       
    15.  
      # Set RESIZE=true to resize the images to 256x256. Leave as false if images have
    16.  
      # already been resized using another tool.
    17.  
      RESIZE=true #是否需要对图片进行resize
    18.  
      if $RESIZE; then
    19.  
      RESIZE_HEIGHT=256
    20.  
      RESIZE_WIDTH=256
    21.  
      else
    22.  
      RESIZE_HEIGHT=0
    23.  
      RESIZE_WIDTH=0
    24.  
      fi
    25.  
       
    26.  
      if [ ! -d "$TRAIN_DATA_ROOT" ]; then
    27.  
      echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT"
    28.  
      echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path"
    29.  
      "where the ImageNet training data is stored."
    30.  
      exit 1
    31.  
      fi
    32.  
       
    33.  
      if [ ! -d "$VAL_DATA_ROOT" ]; then
    34.  
      echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT"
    35.  
      echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path"
    36.  
      "where the ImageNet validation data is stored."
    37.  
      exit 1
    38.  
      fi
    39.  
       
    40.  
      echo "Creating train lmdb..."
    41.  
       
    42.  
      rm -rf $EXAMPLE/train_lmdb
    43.  
      rm -rf $EXAMPLE/val_lmdb #删除已存在的lmdb格式文件,若在已存在lmdb格式的文件夹下再添加lmdb文件,会出现错误
    44.  
       
    45.  
      GLOG_logtostderr=1 $TOOLS/convert_imageset
    46.  
      --resize_height=$RESIZE_HEIGHT
    47.  
      --resize_width=$RESIZE_WIDTH
    48.  
      --shuffle
    49.  
      $TRAIN_DATA_ROOT
    50.  
      $DATA/train.txt
    51.  
      $EXAMPLE/train_lmdb
    52.  
       
    53.  
       
    54.  
      echo "Creating val lmdb..."
    55.  
       
    56.  
      GLOG_logtostderr=1 $TOOLS/convert_imageset
    57.  
      --resize_height=$RESIZE_HEIGHT
    58.  
      --resize_width=$RESIZE_WIDTH
    59.  
      --shuffle
    60.  
      $VAL_DATA_ROOT
    61.  
      $DATA/val.txt
    62.  
      $EXAMPLE/val_lmdb
    63.  
       
    64.  
      echo "Done."
    65.  
       
    
    
    
    
    
    

    这里对程序中所涉及的几个路径做简单说明:

    先通过几张图了解一下每个文件夹所包含的内容与位置:

    1、训练与测试图像库,即 train 与 val 文件夹所在位置,可以通过查看属性来确定其位置,本文中其位置是位于/home/sgg/workspace/caffe_learn/scr/Data_Test下

       

    2、生成的txt文件,即 train.txt 与 test.txt 文件所在位置,可以通过查看属性来确定其位置,本文中其位置是位于/home/sgg/Downloads/caffe-master/My_Files/Data_Test下

    3、生成lmdb的.sh文件,即 进行修改后的create_imagenet.sh文件所在位置,可以通过查看属性来确定其位置,本文中其位置是位于/home/sgg/Downloads/caffe-master/My_Files/Build_lmdb下

    4、生成后的lmdb格式文件,即 生成的train_lmdb与val_lmdb文件夹所在位置,其位置与生成文件create_imagenet.sh位于同一目录下,本文中其位置是位于/home/sgg/Downloads/caffe-master/My_Files/Build_lmdb下

    正式介绍文件中的几个路径值:

    1、EXAMPLE

    EXAMPLE 表示生成模型训练数据文件夹,即create_imagenet.sh所在文件夹

    本文设为EXAMPLE=My_Files/Build_lmdb     ,其中My_Files文件夹位于caffe-master文件夹下

    2、DATA

    DATA 表示python脚本处理数据路径,即生成的文件列表.txt文件所在文件夹

    本文设为 DATA=My_Files/Data_Test            

    注:(1)本文开始为了测试DATA 值的设定,在该目录下直接拷贝了eclipse工作空间下的Data_Test文件,所以这里要注意这里是含有Data_Test文件夹的。

    (2)该DATA路径直接写为 My_Files/Data_Test   ,不用将其变为 /home/sgg/Downloads/caffe-master/My_Files/Data_Test ,写成这样是错误的。具体原因尚不明确。

    3、TOOLS

    TOOLS  表示caffe的工具库,为  TOOLS=build/tools   不用更改

    4、TRAIN_DATA_ROOT

    TRAIN_DATA_ROOT 表示待处理的训练数据,即 train 训练图像库所在位置。

    注:

    (1)这里需要写具体地址,这就是为什么看地址时需要通过文件的属性进行查看具体地址,写的地址为属性中所显示的地址。

    像本文train 训练图像库所在位置为  /home/sgg/workspace/caffe_learn/scr/Data_Test/train/   ,我们经常在终端定位时写的比较简单,在终端定位时的地址为: /workspace/caffe_learn/scr/Data_Test/train/   ,会直接省略 /home/sgg ,但如果在程序中省略的话是出错误的,所以这里的地址要是完整地址。

    (2)由于我们在生成txt 文件时路径中包含了 “train” 与" val ",所以在 .sh 文件中写路径时去掉了train,将其路径定义为  /home/sgg/workspace/caffe_learn/scr/Data_Test/  ,TRAIN_DATA_ROOT所设定的值与 txt 文件中路径两者合起来是图像的整体路径。

    5、VAL_DATA_ROOT

    VAL_DATA_ROOT 表示待处理的验证数据,即 val 训练图像库所在位置,其要求与TRAIN_DATA_ROOT 相同。

    4、验证生成的lmdb数据

    通过运行上面的脚本,我们将得到文件夹train_lmdbval_lmdb:

    方法一:

    我们打开train_lmdb文件夹

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

    方法二:

    通过代码将lmdb中的图像信息显示出来,即通过Python代码,将lmdb中的图像在重塑出来,同时也可以观察到图像的信息。具体代码如下:

    1.  
      #coding:utf-8
    2.  
      '''
    3.  
      Created on Aug 9, 2016
    4.  
       
    5.  
      @author: sgg
    6.  
      '''
    7.  
      #加载必要的库
    8.  
      import matplotlib.pyplot as plt
    9.  
      import sys
    10.  
      from caffe.proto import caffe_pb2
    11.  
      import lmdb
    12.  
      import numpy
    13.  
       
    14.  
       
    15.  
      # 编写一个函数,将二进制的均值转换为python的均值
    16.  
      def read_lmdb(path,visualize = False):
    17.  
      env = lmdb.open(path,readonly=True)
    18.  
       
    19.  
      x=[]
    20.  
      y=[]
    21.  
      with env.begin() as txn:
    22.  
      cursor = txn.cursor()
    23.  
       
    24.  
      for key,value in cursor:
    25.  
      print 'key:',key
    26.  
      datum = caffe_pb2.Datum()#datum类型
    27.  
      #转换维datum
    28.  
      datum.ParseFromString(value)
    29.  
      #转换成numpy
    30.  
      #flat_x=numpy.fromstring(datum.dta,dtype=numpy.uint8)
    31.  
      flat_x=numpy.array(bytearray(datum.data))
    32.  
      #reshape大小
    33.  
      img_data = flat_x.reshape(datum.channels,datum.height,datum.width)
    34.  
       
    35.  
      #读取datum数据
    36.  
      print img_data.shape
    37.  
      x.append(img_data)
    38.  
      y.append(datum.label)
    39.  
      if visualize:
    40.  
      img_data=img_data.transpose([1,2,0])
    41.  
      img_data = img_data[:,:,::-1]
    42.  
      plt.imshow(img_data)
    43.  
      plt.show()
    44.  
      print datum.label
    45.  
       
    46.  
       
    47.  
       
    48.  
       
    49.  
      #调用read_lmdb
    50.  
      read_lmdb("/home/sgg/Downloads/caffe-master/examples/sgg_datas/train_lmdb",True)
    51.  
       
    52.  
       
    53.  
       
    54.  
       

    在生成过程中遇到了如下问题:

    1、如果文件夹下含有lmdb格式的文件,那么生成时会出现错误,所以在生成之前需要对create_imagenet.sh 所在文件夹进行检查,删除之前的 lmdb 文件。代码中添加了代码,来辅助完成此检查:

    1.  
      rm -rf $EXAMPLE/train_lmdb
    2.  
      rm -rf $EXAMPLE/val_lmdb #删除已存在的lmdb格式文件,若在已存在lmdb格式的文件夹下再添加lmdb文件,会出现错误
     
    2、在生成lmdb过程中,出现 can not find or open  …//.......jpg 这个错误时, 这个错误中会给出相应的图像路径:

    首先,查看路径是否正确,若路径不正确,则需要更改相应的图像路径。再运行,看问题是否解决。

    若问题还没有解决,则检查train.txt中,路径和标签之间是否只有一个空格!

    在一些程序中,在对图像加标签时,标签与路径之间的空格使用转义字符 “    ”来生成,可是在生成txt中,路径与标签之间的距离往往多于一个空格,所以在生成标签文档时,程序中用空格代替转义字符   。如下方程序所示:

    str1=img+' '+'1'+'
    '
    3、在生成lmdb过程中,出现路径错误

    将文件中的路径换成绝对路径,在尝试。

  • 相关阅读:
    spring使用JdbcDaoSupport中封装的JdbcTemplate进行query
    javascript正则表达式
    Hi java新特性
    jdk 1.5
    jdk 1.6 & 1.7新特性
    core java 10~12(多线程 & I/O & Network网络编程)
    core java 8~9(GUI & AWT事件处理机制)
    core java 7 exception
    core java 5~6(OOP & 高级语言特征)
    响应式布局样例
  • 原文地址:https://www.cnblogs.com/shuimuqingyang/p/13985616.html
Copyright © 2011-2022 走看看