处理生成VOC的数据格式的test.txt train.txt trainval.txt val.txt 和SSD的imdb数据格式以及ssd的训练

VOC的数据格式就是在VOC文件夹下:准备三个文件夹

1、

Annotations里面放标注好的xml文件使用的这个工具,

参考http://blog.csdn.net/jesse_mx/article/details/53606897。可以直接看博客最后面,下载最新版,下载解压直接用,下载网址:http://tzutalin.github.io/labelImg/(不知道怎么回事,就正常打开了一次,就打不开了,闪退)

然后还是变成博客里面的方法。

先按照博客论文下载annocoda 网址https://www.continuum.io/downloads#windows    下载安装以后   

启动运行annocoda Prompt

在这个环境下,进入labelImg.py的目录下执行python labelImg.py可以打开。
如果想要校正之前已经标注好的文件,先用Ctrl+R加载已经标注好的xml文件。然后在Open Dir打开原始图片的目录,修改以后保存就可以了。

博客里面说路径不要带中文,在ubuntu系统下确实是不能用中文,结果发现在windows下以上的方法可以带中文。


2、

ImageSets  下的Main文件夹里面放 test.txt train.txt trainval.txt val.txt这四个txt文件里面是几种数据集的图片编号

-train.txt 是用来训练的图片文件的文件名列表 
- val.txt是用来验证的图片文件的文件名列表 

- trianval.txt是用来训练和验证的图片文件的文件名列表

- test.txt 是用来测试的图片文件的文件名列表 

这四个文件的生成需要用matlab脚本,具体想生成什么样的,可以改代码。

函数:

function [test_index, trainval_index, train_index,val_index] = getdataset(imagepath)
%imagepath = 'data/stairs';
images_name = dir(imagepath);
len = length(images_name);
for i = 3:len
    name(i-2,1) = {images_name(i).name(1:end-4)};
end
image_orign = name;

len2 = len-2;
index = randperm(len2);  %生成随机的下标
test_num = len2/2;%测试样本数目
trainval_num = len2 - test_num;
train_num = trainval_num/2;%训练样本数目
val_num = trainval_num - train_num;%验证集数目
test_index = image_orign(index(1:test_num),:); %将随机选取后的数列的一半给test,一半给trainval
trainval_index = image_orign(index(test_num+1:end),:);
train_index = image_orign(index(test_num+1:test_num+train_num),:);%将trainval的一半给train,一半给val
val_index = image_orign(index(test_num+train_num+1:end),:);


生成数据集test.txt train.txt trainval.txt val.txt

%将数据集划分为四部分,分别是训练集、测试集、验证集、训练-验证集。
[test_index, trainval_index, train_index,val_index] = getdataset('E:\data\Annotations');%读取所有的数据文件
path = 'E:\data\6_20_训练总数据集\ImageSets\Main\';%划分后的数据集保存路径
name1 = [path,'test.txt'];
name2 = [path,'trainval.txt'];
name3 = [path,'train.txt'];
name4 = [path,'val.txt'];
fid1 = fopen(name1,'w');
fid2 = fopen(name2,'w');
fid3 = fopen(name3,'w');
fid4 = fopen(name4,'w');
for i = 1:length(test_index)
    fprintf(fid1,'%s\n',test_index{i});
end
for i = 1:length(trainval_index)
    fprintf(fid2,'%s\n',trainval_index{i});
end
for i = 1:length(train_index)
    fprintf(fid3,'%s\n',train_index{i});
end
for i = 1:length(val_index)
    fprintf(fid4,'%s\n',val_index{i});
end
fclose all;


%将新标注的文件(“新加类别原始文件”)作为训练集
path_label_new='E:\数据集重新标注\新加类别原始文件';%新标记的标签
path_data_merge = 'E:\数据集重新标注\data_更新\';
label_files_all=dir(path_label_new);
for i = 3:length(label_files_all)
    label_i_dir = strcat(path_label_new,'\',label_files_all(i).name,'\001');
    label_i_files = dir(label_i_dir);
    for j = 3:length(label_i_files)
        train_index_j = label_i_files(j).name(1:end-4);
        trainval_index_j = label_i_files(j).name(1:end-4);
        name2 = [path_data_merge,label_files_all(i).name,'_trainval.txt'];
        name3 = [path_data_merge,label_files_all(i).name,'_train.txt'];
        fid2 = fopen(name2,'a+');
        fid3 = fopen(name3,'a+');
        fprintf(fid2,'%s\n',train_index_j);
        fprintf(fid3,'%s\n',trainval_index_j);
        fclose all;
    end
end
fprintf('done!\n');



JPEGImages 下放没处理的原始图片。


准备好Annotations ImageSets ImageSets这三个文件夹以后, 用VOC里面自带的脚本来生成lmdb格式的数据。


把/data/VOC0712(没有这个文件夹的返回下载caffe那里,执行git checkout ssd)目录下的create_list.sh 、create_data.sh、labelmap_voc.prototxt 这三个文件拷贝到/mydataset下

然后把准备好的数据也拷贝到这个文件夹下。

执行以下两条命令

./data/mydataset/create_list.sh

./data/mydataset/create_data.sh

生成最终的imdb格式数据

对这三个文件进行说明一下:labelmap_voc.prototxt打开是进行设置标签的,要检测识别的内容设置。

create_list.sh生成训练数据的list

root_dir=$HOME/data/VOCdevkit/ 改成你数据的存放路径根目录的上一层
sub_dir=ImageSets/Main为根目录下的副目录路径
$bash_dir/../../这里也要根据自己的路径改好
就是哪里报错找不到然后定位改那里。

把下面这一段
do
dst_file=$bash_dir/$dataset.txt
if [ -f $dst_file ]
then
rm -f $dst_file
fi
for name in VOC2007 VOC2012
do
if [[ $dataset == "test" && $name == "VOC2012" ]]
then
continue
fi
echo "Create list for $name $dataset..."
改成你需要的文件夹部分
do
dst_file=$bash_dir/$dataset.txt
if [ -f $dst_file ]
then
rm -f $dst_file
fi
name=mydata
echo "Create list for $name $dataset..."
或者直接删掉下面这些代码,还有最后的那个done
fi
for name in VOC2007 VOC2012
do
if [[ $dataset == "test" && $name == "VOC2012" ]]
then
continue
fi
然后运行create_list.sh 生成test.txt test_name_size.txt trainval.txt
test.txt和trainval.txt的内容是,转成一张图片的名称+图片对应.xml的格式
遇到的问题:
E0824 18:30:38.277745  2376 io.cpp:187] Could not open or find file /home/ssd/caffe/data/idcard/mydata/JPEGImages/496id
E0824 18:30:38.278219  2376 io.cpp:187] Could not open or find file /home/ssd/caffe/data/idcard/mydata/Annotations/496id

出现这个问题的原因是:

/ImageSets/Main/下的训练文件 test.txt,trainval.txt(我在windows下用程序生成的)的分行符是windows格式的换行(0d0a)(\r\n),而create_list.sh则按unix格式换行(0a)(\n)来处理的,导致生成的临时文件(caffe/data/VOC0712/test.txt,val.txt)的换行都是错的。

解决方法:在ubuntu环境下再把Main下的几个文件内容复制一遍到新文件里。





create_data.sh 的作用是生成imdb格式的数据

需要修改的地方还是路径

root_dir=$cur_dir/../..
data_root_dir这是存放上一步生成的 test.txt test_name_size.txt trainval.txt的目录
dataset_name=mydataset是数据集的名字。
然后生成lmdb的文件。
这样自己的数据就算生成了


下一步修改ssd_pascal.py进行训练。

需要修改的地方就是训练和测试数据imdb的路径

train_data =
test_data =
job_dir=存储训练过程中的日志文件的路径
等等路径吧,需要改的都改一下。
有些参数也需要改:
num_classes 检测类别
gpus是gpu编号
batch_size accum_batch_size 改小一点,我改成8
'stepvalue'等参数根据自己情况设置一下。
num_test_image测试图片数量
560行建议把caffe的bin文件改成绝对路径
执行ssd_pascal.py
报错:
from: can't read /var/mail/__future__
from: can't read /var/mail/caffe.model_libs
from: can't read /var/mail/google.protobuf
解决:
脚本前面加上:#!/usr/bin/env python











你可能感兴趣的:(处理生成VOC的数据格式的test.txt train.txt trainval.txt val.txt 和SSD的imdb数据格式以及ssd的训练)