【目标检测实战】目标检测实战之一--手把手教你LMDB格式数据集制做!

文章目录python

1 目标检测简介
2 lmdb数据制做
    2.1 VOC数据制做
    2.2 lmdb文件生成

lmdb格式的数据是在使用caffe进行目标检测或分类时,使用的一种数据格式。这里我主要以目标检测为例讲解lmdb格式数据的制做。git


1 目标检测简介

【1】目标检测主要有两个任务:github

  1. 判断图像中对象的类别
  2. 类别的位置

【2】目标检测须要的数据:bash

  1. 训练所需的图像数据,能够是jpg、png等图片格式
  2. 图像数据对应的类别信息和类别框的位置信息。

2 lmdb数据制做

caffe通常使用lmdb格式的数据,在制做数据以前,咱们须要对数据进行标注,可使用labelImg对图像进行标注(https://github.com/tzutalin/labelImg),这里就很少赘述数据标注的问题。总之,咱们获得了图像的标注Annotations数据。lmdb数据制做,首先须要将annotations数据和图像数据制做为VOC格式,而后将其生成LMDB文件便可。下边是详细的步骤:dom

2.1 VOC数据制做

这里我以caffe环境的Mobilenet+YOLOv3模型的代码为例(https://github.com/eric612/MobileNet-YOLO),进行lmdb数据制做,而且也假设你已经对其配置编译成功(如没成功,能够参考博文进行配置),因此咱们的根目录为:caffe-Mobilenet-YOLO-master,下边为详细步骤:测试

【1】VOC格式目录创建:ui

VOC格式目录主要包含为:
在这里插入图片描述
其中,Annotations里存储的是xml标注信息,JPEGImages存储的是图片,ImageSets则是训练和测试的txt列表等信息,下边咱们就要安装如上的目录进行创建咱们本身的数据目录。spa

建立Annotations、JPEGImages、ImageSets/Main等文件,命令以下(也可直接界面操做哈):3d

注:建议新手按照个人名称,对于后续文件修改容易!!!code

cd ~/   # 进入home目录
cd Documents/  # 进入Documents目录
cd caffe-Mobilenet-YOLO-master/  # 进入咱们的根目录
cd data         # 进入data目录内
mkdir VOCdevkit   # 建立存储咱们本身的数据的文件夹
cd VOCdevkit
mkdir MyDataSet  # 建立存储voc的目录
cd MyDataSet   
# 建立VOC格式目录
mkdir Annotations
mkdir JPEGImages
mkdir ImageSets
cd ImageSets
mkdir Main

好啦,咱们的文件夹就创建好了,以下图所示:
在这里插入图片描述
【2】将全部xml文件考入至Annotations文件夹内
【3】将全部图片考入至JPEGImages文件夹内
【4】划分训练接、验证集合测试集,以下为Python代码,须要修改的地方注释已标明:

import os  
import random 
# 标注文件的路径,须要你本身修改
xmlfilepath=r'/home/Documents/caffe-Mobilenet-YOLO-master/data/VOCdevkit/MyDataSet/Annotations/'      
# 这里是存储数据的本目录,须要改成你本身的目录              
saveBasePath=r"/home/Documents/caffe-Mobilenet-YOLO-master/data/VOCdevkit/"                        
trainval_percent=0.8            # 表示训练集和验证集所占比例,你须要本身修改,也可选择不修改
train_percent=0.8               # 表示训练集所占训练集验证集的比例,你须要本身修改,也可选择不修改       
total_xml = os.listdir(xmlfilepath)
num=len(total_xml)    
list=range(num)    
tv=int(num*trainval_percent)    
tr=int(tv*train_percent)    
trainval= random.sample(list,tv)    
train=random.sample(trainval,tr)    
  
print("train and val size",tv)  
print("traub suze",tr)  
ftrainval = open(os.path.join(saveBasePath,'MyDataSet/ImageSets/Main/trainval.txt'), 'w')    
ftest = open(os.path.join(saveBasePath,'MyDataSet/ImageSets/Main/test.txt'), 'w')    
ftrain = open(os.path.join(saveBasePath,'MyDataSet/ImageSets/Main/train.txt'), 'w')    
fval = open(os.path.join(saveBasePath,'MyDataSet/ImageSets/Main/val.txt'), 'w')    
  
for i  in list:    
    name=total_xml[i][:-4]+'\n'    
    if i in trainval:    
        ftrainval.write(name)    
        if i in train:    
            ftrain.write(name)    
        else:    
            fval.write(name)    
    else:    
        ftest.write(name)    
    
ftrainval.close()    
ftrain.close()    
fval.close()    
ftest .close()

上述代码修改以后,在根目录caffe-Mobilenet-YOLO-master执行上述代码便可,
在data/VOCdevkit/MyDataSet/ImageSets下生成trainval.txt、test.txt、train.txt、val.txt等所需的txt文件,以下图所示:
在这里插入图片描述
这些TXT文件会包含图片的名字,不带路径,以下图所示:
在这里插入图片描述

2.2 lmdb文件生成

【1】执行以下命令,将生成lmdb所需的脚本复制至data/VOCdevkit/MyDataSet文件夹内:

cp data/VOC0712/create_* data/MyDataSet/                # 把create_list.sh和create_data.sh复制到MyDataSet目录                  
cp data/VOC0712/labelmap_voc.prototxt data/MyDataSet/   # 把labelmap_voc.prototxt复制到MyDataSet目录

在这里插入图片描述
【2】修改create_list.sh文件:

1 第3行修改目录路径,截止到VOCdevkit便可
在这里插入图片描述
2 第13行修改成for name in MyDataSet(VOCdevkit下本身创建的文件夹名字)
在这里插入图片描述
3 第15-18行注释掉
在这里插入图片描述
4 第41行get_image_size修改成本身的路径(注意,这里是build caffe_mobilenet_yolo以后才会造成的):
在这里插入图片描述

#!/bin/bash
# 若是严格安装我上述的步骤,就能够不用修改路径位置。
# 须要修改的位置也使用注释进行了标注和解释

# 这里须要更改,你数据的根目录位置,须要修改的地方!!!!
root_dir="/home/Documents/Caffe_Mobilenet_YOLO/data/VOCdevkit/"   
sub_dir=ImageSets/Main
bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
for dataset in trainval test
do
  dst_file=$bash_dir/$dataset.txt
  if [ -f $dst_file ]
  then
    rm -f $dst_file
  fi
  for name in MyDataSet  # 若是你创建的不是MyDataSet,这里须要修改成你本身的名字
  do
    # 这里须要修改,注释掉便可
    #if [[ $dataset == "test" && $name == "VOC2012" ]]
    #then
    #  continue
    #fi
    echo "Create list for $name $dataset..."
    dataset_file=$root_dir/$name/$sub_dir/$dataset.txt

    img_file=$bash_dir/$dataset"_img.txt"
    cp $dataset_file $img_file
    sed -i "s/^/$name\/JPEGImages\//g" $img_file
    sed -i "s/$/.jpg/g" $img_file

    label_file=$bash_dir/$dataset"_label.txt"
    cp $dataset_file $label_file
    sed -i "s/^/$name\/Annotations\//g" $label_file
    sed -i "s/$/.xml/g" $label_file

    paste -d' ' $img_file $label_file >> $dst_file

    rm -f $label_file
    rm -f $img_file
  done

  # Generate image name and size infomation.
  if [ $dataset == "test" ]
  then
    home/Documents/Caffe_Mobilenet_YOLO/caffe-MobileNet-YOLO-master/build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"

【3】creat_data.sh修改:

1 第2行修改成本身的路径:root_dir="/home/Documents/caffe-MobileNet-YOLO-master/"
在这里插入图片描述
2 第7行修改成:data_root_dir="/home/Documents/caffe-MobileNet-YOLO-master/data/VOVdevkit/
在这里插入图片描述
3 第8行修改成:dataset_name="MyDataSet"
在这里插入图片描述
4 第9行修改成:mapfile="\(root_dir/data/VOCdevkit/\)dataset_name/labelmap_voc.prototxt"
在这里插入图片描述
5 第26行修改成\(root_dir/data/VOCdevkit/\)dataset_name/$subset.txt
在这里插入图片描述

cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
# 修改成本身的路径
root_dir="/home/Documents/Caffe_Mobilenet_YOLO/caffe-MobileNet-YOLO-master/"

cd $root_dir

redo=1
# 这里须要修改成本身的路径
data_root_dir="/home/Documents/Caffe_Mobilenet_YOLO/caffe-MobileNet-YOLO-master/data/VOCdevkit/"
dataset_name="MyDataSet"  # 修改成本身的名字
mapfile="$root_dir/data/VOCdevkit/$dataset_name/labelmap_voc.prototxt"  # 修改成本身的路径
anno_type="detection"
db="lmdb"
min_dim=0
max_dim=0
width=0
height=0

extra_cmd="--encode-type=jpg --encoded"
if [ $redo ]
then
  extra_cmd="$extra_cmd --redo"
fi
for subset in test trainval
# subset.txt路径须要修改
do
  python $root_dir/scripts/create_annoset.py --anno-type=$anno_type \
  --label-map-file=$mapfile --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width \
  --resize-height=$height --check-label $extra_cmd $data_root_dir $root_dir/data/VOCdevkit/$dataset_name/$subset.txt \
  $data_root_dir/$dataset_name/$db/$dataset_name"_"$subset"_"$db examples/$dataset_name

【3】修改labelmap_voc.prototxt文件:

除了第一个背景标签部分不要修改,其余改为本身的标签就行,多的删掉,少了添加进入就行

【4】最后在caffe-MobileNet-YOLO-master/examples文件夹内新建一个MyDataSet文件夹(空的)

【5】运行create_list.sh脚本: ./data/VOCdevkit/MyDataSet/create_list.sh,运行完后,会在本身建的VOCdevkit/MyDataSet/目录内生成trainval.txt, test.txt, test_name_size.txt。

【6】运行create_data.sh脚本: ./data/VOCdevkit/MyDataSet/create_data.sh

运行此命令时,提示:bash:./data/VOCdevkit/MyDataSet/create_list.sh:Permission denied,没有权限,须要执行以下命令赋予执行命令:

chmod u+x data/VOCdevkit/MyDataSet/create_data.sh

出现了错误:ValueError: need more than 2 values to unpack,
在这里插入图片描述
须要将create_annoset.py中第88行的seg去掉,由于咱们的Annotations只有两个值,img_file和anno。

运行完后,会在会在本身建的VOCdevkit/MyDataSet目录内生成lmdb文件夹:
在这里插入图片描述

lmdb对应训练集和测试集的lmdb格式的文件夹:
在这里插入图片描述
在这里插入图片描述*** 好啦,今天的教程就到这里,若有疑问,可关注公众号【计算机视觉联盟】私信我或留言交流!!