制作LMDB格式数据库

LMDB是caffe用来训练图片最常用的数据格式之一,常用于单标签数据,像分类等。
1、数据准备
新建train、val和test三个文件夹,分别包括训练图片、验证图片和测试图片。
在train和val文件夹下面各新建几个文件夹(按分类),把训练数据按分类放在相应文件夹。例如,在train下面新建train_good和train_bad两个文件夹,把良好的图片存放在train_good文件夹下。
2、文件重命名
为了使文件名更加有序和方便查找,将文件名按数列递增进行重命名,第一张图片为0。利用sh文件进行排序。

代码如下

#!/bin/bash
clear
x=0
mkdir new    #防止重命名的文件与后续文件名相同导致后面的文件被覆盖,新建一个新的文件夹在当前目录
for i in `ls *.bmp`    #依次查找
do
mv $i new/$x.bmp    #移动并重命名
x=`expr $x + 1`        #sh中自加
done
3、标签文件.txt文件制作
制作一个train.txt、val.txt文件,这两个文件分别包含了我们上面的训练数据的图片路径,以及其对应的标签。
把好的图片标号为1,坏的图片标记为0。标签数据文件txt的生成可以通过如下代码,通过扫描路径好、坏下面的图片,得到标签文件train.txt和val.txt:
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')	#制作标签数据,如果是好的,标签设置为1,如果是坏的标签为0
imgfile=GetFileList('train/train_good')	#将数据集放在与.py文件相同目录下
for img in imgfile:  
    str1=img+' '+'1'+'\n'
    train_txt.writelines(str1)  
imgfile=GetFileList('train/train_bad')  
for img in imgfile:  
    str2=img+' '+'0'+'\n'  
    train_txt.writelines(str2)  
train_txt.close()   
test_txt=open('val.txt','w')  #制作标签数据,如果是好的,标签设置为1,如果是坏的标签为0
imgfile=GetFileList('val/test_good')
for img in imgfile:  
    str3=img+' '+'1'+'\n'  
    test_txt.writelines(str3)  
imgfile=GetFileList('val/test_bad')  
for img in imgfile:  
    str4=img+' '+'0'+'\n'  
    test_txt.writelines(str4)  
test_txt.close()  
print("success")
将上述代码保存为.py的Python文件,运行该Python代码生成 txt 文件。主要注意实际制作中分类图片的路径以及标签。
4、生成LMDB数据
通过上面的四个文件(两个txt文件列表、train与val两个图库),把图片的数据和其对应的标签打包起来,打包成lmdb数据格式:
将caffe下的imagenet文件夹的create_imagenet.sh复制到caffe下进行修改,进行训练和测试路径的设置,运行该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=My_files/	#生成模型训练数据文件夹
DATA=My_files/data	#python脚本处理数据路径,即生成的文件列表.txt文件所在文件夹
TOOLS=build/tools	#caffe的工具库,不用更改

TRAIN_DATA_ROOT=/home/xx/caffe/My_files/data/	#待处理的训练数据
VAL_DATA_ROOT=/home/xx/caffe/My_files/data/	 #待处理的验证数据

# Set RESIZE=true to resize the images to 256x256. Leave as false if images have
# already been resized using another tool.
RESIZE=true	#是否需要对图片进行resize
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	#删除已存在的lmdb格式文件,若在已存在lmdb格式的文件夹下再添加lmdb文件,会出现错误
rm -rf $EXAMPLE/val_lmdb
GLOG_logtostderr=1 $TOOLS/convert_imageset \
    --resize_height=$RESIZE_HEIGHT \
    --resize_width=$RESIZE_WIDTH \
    --shuffle \
    $TRAIN_DATA_ROOT \
    $DATA/train.txt \
    $EXAMPLE/ilsvrc12_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/ilsvrc12_val_lmdb

echo "Done."

常出现的问题是build/tools/convert_imageset can't found,一般是create_imagenet.sh路径的问题,Linux下不能直接跳转到当前目录的上层进行运行。

参考博客:点击打开链接

你可能感兴趣的:(caffe学习历程)