前言

前面已经演示了如何把图像文件标注成VOC2007数据集,标注完成之后,就要把数据转换成caffe支持的数据格式lmdb。

处理数据

1.在caffe_ssd/data/下新建一个叫VOCdevkit的目录,把标注好的VOC2007目录放到这个目录下面。
在这里插入图片描述
(1)JPEGImage目录下应该有标注过的原图像文件
在这里插入图片描述
(2)Annotations目录有标注的xml文件,这是一一对应的。
在这里插入图片描述
(3)JPEGImages目录下的Main现在应该是空的。
在这里插入图片描述
2.运行以下脚本,把数据集分成训练集、测试集、交叉验证集。这个脚本放在VOC2007目录下面。
(1) createMainTxt.py
脚本里的目录是我的存放目录,要做相应的更改,trainval_percent=0.8 train_percent=0.8这两个参数是训练与验证集的比例,可以自己改动。

import os  
import random   
  
xmlfilepath=r'/home/linux/caffe/caffe_ssd/data/VOCdevkit/VOC2007/Annotations'  
saveBasePath=r"/home/linux/caffe/caffe_ssd/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,'VOC2007/ImageSets/Main/trainval.txt'), 'w')    
ftest = open(os.path.join(saveBasePath,'VOC2007/ImageSets/Main/test.txt'), 'w')    
ftrain = open(os.path.join(saveBasePath,'VOC2007/ImageSets/Main/train.txt'), 'w')    
fval = open(os.path.join(saveBasePath,'VOC2007/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()  

(2)运行完以上脚本,在JPEGImages目录下的Main多出四个文件,关于这四个文件是干吗用的,可以参考前面的博客。
在这里插入图片描述
3.从caffe_ssd/data/VOC0712目录把这三个文件复制到VOC2007目录下。
在这里插入图片描述

在这里插入图片描述
(1)更改create_list.sh脚本,以下我按我自己的目录更改的,具体要改的地方按照前面博客。

#!/bin/bash

root_dir=/home/linux/caffe/caffe_ssd/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 VOC2007
  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/linux/caffe/caffe_ssd/build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"
  fi

  # Shuffle trainval file.
  if [ $dataset == "trainval" ]
  then
    rand_file=$dst_file.random
    cat $dst_file | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' > $rand_file
    mv $rand_file $dst_file
  fi
done

更改之后保存,运行脚本

sudo ./create_list.sh 

出现以下提示代表成功
在这里插入图片描述
此时会VOC2007下多出三个txt文件。
在这里插入图片描述
(2)更改标签文件labelmap_voc.prototxt,自己标注了多少类要改多少类,但0那个类不能改,我自己标注的,总共6类。

item {
  name: "none_of_the_above"
  label: 0
  display_name: "background"
}
item {
  name: "R"
  label: 1
  display_name: "R"
}
item {
  name: "C"
  label: 2
  display_name: "C"
}
item {
  name: "D"
  label: 3
  display_name: "D"
}
item {
  name: "G"
  label: 4
  display_name: "G"
}
item {
  name: "Q"
  label: 5
  display_name: "Q"
}
item {
  name: "J"
  label: 6
  display_name: "J"
}

(3)更改create_data.sh文件,这个文件是生成lmdb数据的,我按我的目录改。

cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
root_dir=/home/linux/caffe/caffe_ssd

cd $root_dir

redo=1
data_root_dir="/home/linux/caffe/caffe_ssd/data/VOCdevkit"
dataset_name="VOC2007"
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
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
done

保存,运行,出现以下信息运行成功。
在这里插入图片描述
在VOC2007目录下多了lmdb的目录。
在这里插入图片描述

结语

以上数据转换完成,接下就是训练了。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐