sunnyl95 / R-FCN

制作VOC2007数据集用于R-FCN训练
0 stars 0 forks source link

制作VOC2007数据集用于R-FCN训练 #1

Open sunnyl95 opened 6 years ago

sunnyl95 commented 6 years ago

本文参照: https://blog.csdn.net/sinat_30071459/article/details/50723212

制作VOC2007数据集用于Faster-RCNN训练:VOC2007格式是faster-RCNN中官方给出的用于训练的数据集,把它下载下来用frcnn/tool里的训练程序跑一跑就可以得到自己的训练网络了,首先说明一下我们需要准备的文件:

  1. 训练所需的图片
  2. 图片上ROI标注信息的XML文件
  3. 将数据集分割为三部分分别用于frcnn进行训练,验证,测试等

    第一步:图片的重命名

    VOC2007格式必须为JPG格式,并且图片是统一的六位数字,从000001开始。那我们也需要将所有训练图片重命名为此。Python代码如下: `import os import numpy as np import re import pandas as pd

dire = r'F:\dataset\UAV' a = os.listdir(dire)

mode = re.compile(r'\d+') for i in range(n): ids[i] = mode.findall(a[i])[0] a[i] = dire + '\' + a[i]

b = np.zeros(n).astype(np.str) pos = 6 for i in range(n): c = str(i) ze = pos-len(c) b[i] = '0'*ze+str(i) b[i] = dire +'\'+b[i]+'.jpg'

for i in range(n): os.rename(a[i],b[i])`

第二步:框定ROI

  利用图片标注工具lableImg进行标注,具体参照 
  [https://blog.csdn.net/jesse_mx/article/details/53606897]

第三步:保存xml到Annotations

 新建一个文件夹,名字为Annotations,将xml文件全部放到该文件夹里。

第四步:将训练图片放到JPEGImages

 新建一个文件夹,名字为JPEGImages,将所有的训练图片放到该文件夹里。

第五步:ImageSets\Main里的四个txt文件

 新建文件夹,命名为ImageSets,在ImageSets里再新建文件夹,命名为Main
我们可以通过xml名字(或图片名),生成四个txt文件,即:
 train.txt    test.txt    trainval.txt    val.txt
 内容:
  000001 
  000002
   ........
   即图片名字(无后缀),test.txt是测试集,train.txt是训练集,val.txt是验证集, 
   trainval.txt是训练和验证集.VOC2007中,trainval大概是整个数据集的50%,test也大概 
   是整个数据集的50%;train大概是trainval的50%,val大概是trainval的50%。

%%
%该代码根据已生成的xml,制作VOC2007数据集中的trainval.txt;train.txt;test.txt和val.txt
%trainval占总数据集的50%,test占总数据集的50%;train占trainval的50%,val占trainval的50%;
%上面所占百分比可根据自己的数据集修改,如果数据集比较少,test和val可少一些
%%
%注意修改下面四个值
xmlfilepath='E:\Annotations';
txtsavepath='E:\ImageSets\Main\';
trainval_percent=0.5;%trainval占整个数据集的百分比,剩下部分就是test所占百分比
train_percent=0.5;%train占trainval的百分比,剩下部分就是val所占百分比

%%
xmlfile=dir(xmlfilepath);
numOfxml=length(xmlfile)-2;%减去.和.. 总的数据集大小

trainval=sort(randperm(numOfxml,floor(numOfxml*trainval_percent)));
test=sort(setdiff(1:numOfxml,trainval));

trainvalsize=length(trainval);%trainval的大小
train=sort(trainval(randperm(trainvalsize,floor(trainvalsize*train_percent))));
val=sort(setdiff(trainval,train));

ftrainval=fopen([txtsavepath 'trainval.txt'],'w');
ftest=fopen([txtsavepath 'test.txt'],'w');
ftrain=fopen([txtsavepath 'train.txt'],'w');
fval=fopen([txtsavepath 'val.txt'],'w');

for i=1:numOfxml
if ismember(i,trainval)
fprintf(ftrainval,'%s\n',xmlfile(i+2).name(1:end-4));
if ismember(i,train)
fprintf(ftrain,'%s\n',xmlfile(i+2).name(1:end-4));
else
fprintf(fval,'%s\n',xmlfile(i+2).name(1:end-4));
end
else
fprintf(ftest,'%s\n',xmlfile(i+2).name(1:end-4));
end
end
fclose(ftrainval);
fclose(ftrain);
fclose(fval);
fclose(ftest);

这四个txt放在ImageSets\Main中。

这样,数据集就基本做好了。然后新建文件夹,名字为logos(第0步确定的名字),将上面三个文件夹放到这里,即logos文件夹里有三个文件夹:

将logos文件夹拷贝到datasets\VOCdevkit2007里就可以了。 (或者替换voc2007数据集中的Annotations、ImageSets和JPEGImages,免去一些训练的修改)

sunnyl95 commented 6 years ago

本文参照:https://blog.csdn.net/sloanqin/article/details/51537713

  准备R-FCN训练数据——imdb、roidb
   基本上就是设置了imdb的一些属性,比如图片的路径,图片名称的索引,并没有把真 
   实的图片数据放进来
sunnyl95 commented 6 years ago

本文参照:https://blog.csdn.net/qq_26898461/article/details/52442196

faster rcnn源码解读(四)之数据类型imdb.py和pascal_voc.py(主要是imdb和roidb数据类 型的解说) `get_imdb->factory->pascal_voc->(继承)imdb

factory

year = ['2007', '2012']

split = ['train', 'val', 'trainval', 'test']

imdb

image_set: split

devkit_path: config.DATA_DIR(root/data/) + VOCdevkit + year

data_path: devkit_path + '/' + 'VOC' + year

image_index: a list read image name from

  例如,root/data + /VOCdevkit2007/VOC2007/ImageSets/Main/{image_set}.txt

roidb: gt_roidb得到(cfg.TRAIN.PROPOSAL_METHOD=gt导致了此操作)

classes: 类别定义

num_classes: 类别的长度

class_to_ind:{类别名:类别索引}字典

num_images(): image_index'length,数据库中图片个数

image_path_at(index): 得到第index图片的地址,data_path + '/' + 'JPEGImages' + image_index[index] + image_ext(.jpg)

在train_faster_rcnn_alt_opt.py的imdb.set_proposal_method之后一旦用imdb.roidb都会用gt_roidb读取xml中的内容中得到部分信息

xml的地址:data_path + '/' + 'Annotations' + '/' + index + '.xml'

      (root/data/) + VOCdevkit + year  + '/' + 'VOC' + year + '/' + 'Annotations' + '/' + index + '.xml'

get_training_roidb: 对得到的roi做是否反转(参见roidb的flipped,为了扩充数据库)和到roidb.py的prepare_roidb中计算得到roidb的其他数据

一张图有一个roidb,每个roidb是一个字典

roidb:

boxes: four rows.the proposal.left-up,right-down

gt_overlaps: len(box)*类别数(即,每个box对应的类别。初始化时,从xml读出来的类别对应类别值是1.0,被压缩保存)

gt_classes: 每个box的类别索引

flipped: true,代表图片被水平反转,改变了boxes里第一、三列的值(所有原图都这样的操作,imdb.image_index*2)(cfg.TRAIN.USE_FLIPPED会导致此操作的发生,见train.py 116行)

seg_areas: box的面积

(下面的值在roidb.py的prepare_roidb中得到)

image:image_path_at(index),此roi的图片地址

width:此图片的宽

height: 高

max_classes: box的类别=labels(gt_overlaps行最大值索引)

max_overlaps: (gt_overlaps行最大值)(max_overlaps=0,max_classes=0,即都是背景,否则不正确)

output_dir: ROOT_DIR + 'output' + EXP_DIR('faster_rcnn_alt_opt') + imdb.name("voc_2007_trainval" or "voc_2007_test")`

sunnyl95 commented 6 years ago

相关链接:https://blog.csdn.net/xiamentingtao/article/details/78449751