这里怎么标注数据就不说了,labelme,labelImg等都可以标注。
labelImg的标注可以参考博客【DeepLearning】标注工具labelImg的安装和使用。
labelme一张图片对应一个json文件。labelImg一张图片对应一个xml文件。如果用labelme标注,标完之后用脚本将json文件转换成xml文件,因为后面的处理是基于xml文件的。
说一下数据怎么组织。因为用到weiliu89/caffe/data/VOC0712下的两个脚本create_list.sh和create_data.sh两个脚本,所以按照VOC2012数据集的格式组织自己的数据,新建Annotations、ImageSets、JPEGImages三个文件夹。
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
train.txt里面每一行第一列是图片相对于数据集顶层目录的路径,第二列是标注文件相对于数据集顶层目录的路径。
val.txt同train.txt。
train_name_size.txt里面每一行第一列是图片的文件名(不含后缀名),第二列的图片的高,第三列是图片的宽。
仿造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的超链接。