热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

1.标注这里怎么标注数据就不说了,labelme,labelImg等都可以标注。labelImg的标注可以参考博客【DeepLearning】标注工具labelImg的安装和使用。
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】制作自己的训练数据集》

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()

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

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】制作自己的训练数据集》

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
--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-_"$subset"_"$db examples/$dataset_name
done

生成了lmdb文件。

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

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

 


推荐阅读
author-avatar
mc_yang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有