【Caffe】制作自己的训练数据集

1. 标注

这里怎么标注数据就不说了,labelme,labelImg等都可以标注。

labelImg的标注可以参考博客【DeepLearning】标注工具labelImg的安装和使用。

labelme一张图片对应一个json文件。labelImg一张图片对应一个xml文件。如果用labelme标注,标完之后用脚本将json文件转换成xml文件,因为后面的处理是基于xml文件的。

2. 文件组织

说一下数据怎么组织。因为用到weiliu89/caffe/data/VOC0712下的两个脚本create_list.sh和create_data.sh两个脚本,所以按照VOC2012数据集的格式组织自己的数据,新建Annotations、ImageSets、JPEGImages三个文件夹。

【Caffe】制作自己的训练数据集_第1张图片

3. 生成辅助文件

Annotations文件夹存放的是标注的xml文件,ImageSets内含Main文件夹,由下面的代码生成train.txt和val.txt,txt文件的内容是图片的名字(每行一个,不含后缀名)。

import os  
import random  

train_percent = 0.8
xmlfilepath = 'Annotations/'
txtsavepath = 'ImageSets/Main'  
total_xml = os.listdir(xmlfilepath)  

num = len(total_xml)  
list = range(num)  
train_num = int(num*train_percent)
val_num = num - train_num
train = random.sample(list,train_num)  


ftrain = open(txtsavepath+'/train.txt', 'w')  
fval = open(txtsavepath+'/val.txt', 'w')  

for i in list:  
    name = total_xml[i][:-4]+'\n'  
    if i in train:  
        ftrain.write(name)  
    else:  
        fval.write(name)  

ftrain.close()  
fval.close() 

JPEGImages文件夹下存放的是用于训练的图片。

下面要生成和上面新建的三个文件夹同级目录的四个txt文件train.txt、train_name_size.txt、val.txt、val_name_size.txt。

将weiliu89/caffe/data/VOC0712/create_list.sh修改一下以适配自己的数据集。

#!/bin/bash

root_dir=$HOME/data/
name=mydataset
sub_dir=ImageSets/Main
bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
for dataset in train val
do
  dst_file=$bash_dir/$dataset.txt
  if [ -f $dst_file ]
  then
    rm -f $dst_file
  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

  # Generate image name and size infomation.
  if [ $dataset == "test" ]
  then
    $bash_dir/../../build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"
  fi

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

【Caffe】制作自己的训练数据集_第2张图片

train.txt里面每一行第一列是图片相对于数据集顶层目录的路径,第二列是标注文件相对于数据集顶层目录的路径。

val.txt同train.txt。

train_name_size.txt里面每一行第一列是图片的文件名(不含后缀名),第二列的图片的高,第三列是图片的宽。

4. 生成lmdb文件

仿造weiliu89/caffe/data/VOC0712/labelmap_voc.prototxt写一个自己数据集的xxx.prototxt文件,label 0是background,自己的数据从1开始。

item {
  name: "none_of_the_above"
  label: 0
  display_name: "background"
}
item {
  name: "aeroplane"
  label: 1
  display_name: "aeroplane"
}
item {
  name: "bicycle"
  label: 2
  display_name: "bicycle"
}
item {
  name: "bird"
  label: 3
  display_name: "bird"
}
item {
  name: "boat"
  label: 4
  display_name: "boat"
}
item {
  name: "bottle"
  label: 5
  display_name: "bottle"
}

将weiliu89/caffe/data/VOC0712/create_data.sh修改一下以适配自己的数据集。

cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
root_dir=$cur_dir/../..

cd $root_dir

redo=1
data_root_dir="$HOME/data/"
dataset_name="mydataset"
mapfile="$root_dir/data/$dataset_name/labelmap_mydataset.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 train val
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 $data_root_dir/$dataset_name/$subset.txt $data_root_dir/$dataset_name/$db/$dataset_name"_"$subset"_"$db examples/$dataset_name
done

生成了lmdb文件。

另外会在weiliu89/caffe/examples/下生成train和val lmdb的超链接。

 

你可能感兴趣的:(深度学习,Caffe)