【深度学习】制作VOC2007数据集用于Faster-RCNN训练

制作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

针对需要训练的图像,我们需要将ROI输出,如下图所示,位置信息包含四个值,分别为ROI左上角的X,Y值与右下角的X,Y值。那个问题来了,针对大批量的数据集如何快速提取ROI呢,在网上搜索半天发现原来Matlab2014已经有了这个功能。
这里要注意的是,matlab打框产生的ROI产生的4个值,分别为ROI左上角的X,Y值与ROI的宽和高。这里推荐可以用Eexcel处理一下。

è¿éåå¾çæè¿°

第三步:产生XML文件

把上一步得到的txt文档转换为XML文件,python代码如下,我的需要训练识别的物体只有一个,如果要识别多个目标,那需要略微修改一下如下代码。

#encoding=utf-8
 
import sys
import os
import codecs
import cv2
 
root = r'F:\dataset\xml'
fp = open('F:\dataset\pos-all.txt')
fp2 = open('train.txt', 'w')
uavinfo = fp.readlines()
 
for i in range(len(uavinfo)):
    line = uavinfo[i]
    line = line.strip().split('\t')   
    img = cv2.imread(line[0])
    sp = img.shape
    height = sp[0]
    width = sp[1]
    depth = sp[2]
    info1 = line[0].split('\\')[-1]
    info2 = info1.split('.')[0]
 
    l_pos1 = line[1]
    l_pos2 = line[2]
    r_pos1 = line[3]
    r_pos2 = line[4]
    fp2.writelines(info2 + '\n')
    with codecs.open(root +r'\\'+ info2 + '.xml', 'w', 'utf-8') as xml:
        xml.write('\n')
        xml.write('\t<folder>' + 'UAV_data' + '</folder>\n')
        xml.write('\t<filename>' + info1 + '</filename>\n')
        xml.write('\t<source>\n')
        xml.write('\t\t<database>The UAV autolanding</database>\n')
        xml.write('\t\tUAV AutoLanding</annotation>\n')
        xml.write('\t\t<img src="" style="display: none;"><img alt="加载中..." title="图片加载中..." src="http://statics.2cto.com/images/s_nopic.gif">flickr\n')
        xml.write('\t\t<flickrid>NULL</flickrid>\n')
        xml.write('\t\n')
        xml.write('\t<owner>\n')
        xml.write('\t\t<flickrid>NULL</flickrid>\n')
        xml.write('\t\t<name>XuSenhai</name>\n')
        xml.write('\t</owner>\n')
        xml.write('\t<size>\n')
        xml.write('\t\t<width>'+ str(width) + '</width>\n')
        xml.write('\t\t<height>'+ str(height) + '</height>\n')
        xml.write('\t\t<depth>' + str(depth) + '</depth>\n')
        xml.write('\t</size>\n')
        xml.write('\t\t<segmented>0</segmented>\n')
        xml.write('\t<object>\n')
        xml.write('\t\t<name>uav</name>\n')
        xml.write('\t\t<pose>Unspecified</pose>\n')
        xml.write('\t\t<truncated>0</truncated>\n')
        xml.write('\t\t<difficult>0</difficult>\n')
        xml.write('\t\t<bndbox>\n')
        xml.write('\t\t\t<xmin>' + l_pos1 + '</xmin>\n')
        xml.write('\t\t\t<ymin>' + l_pos2 + '</ymin>\n')
        xml.write('\t\t\t<xmax>' + r_pos1 + '</xmax>\n')
        xml.write('\t\t\t<ymax>' + r_pos2 + '</ymax>\n')
        xml.write('\t\t</bndbox>\n')
        xml.write('\t</object>\n')
        xml.write('</annotation>')
fp2.close()

第四步:数据集分割

在实际训练过程中,需要四个文件,分别为test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集。每个文件为对于图片的名字。在VOC2007中,trainval大概是整个数据集的50%,test也大概是整个数据集的50%;train大概是trainval的50%,val大概是trainval的50%。可参考以下代码:

#coding=utf-8
import cv2
import os
import random
 
root = 'F:\dataset'
fp = open(root + '\\'+'name_list.txt')
fp_trainval = open(root + '\\'+'trainval.txt', 'w')
fp_test = open(root + '\\'+'test.txt', 'w')
fp_train = open(root + '\\'+'train.txt', 'w')
fp_val = open(root + '\\'+'val.txt', 'w')
 
filenames = fp.readlines()
for i in range(len(filenames)):
    pic_name = filenames[i]
    pic_name = pic_name.strip()
    x = random.uniform(0, 1)
    pic_info = pic_name.split('.')[0]
 
    if x >= 0.5:
        fp_trainval.writelines(pic_info + '\n')
 
    else:
        fp_test.writelines(pic_info + '\n')
 
fp_trainval.close()
fp_test.close()
 
 
 
fp = open(root + '\\' +'trainval.txt')
filenames = fp.readlines()
for i in range(len(filenames)):
    pic_name = filenames[i]
    pic_name = pic_name.strip()
    pic_info = pic_name.split('.')[0]
    x = random.uniform(0, 1)
    if x >= 0.5:
        fp_train.writelines(pic_info + '\n')
    else:
        fp_val.writelines(pic_info + '\n')
fp_train.close()
fp_val.close()

第五步:将得到的文件放置正确路径

1. 将训练图片放置于 faster-rcnn/data/VOCdevkit2007/VOC2007/JPEGImages 中;

2. 将得到的xml文件放置于 faster-rcnn/data/VOCdevkit2007/VOC2007/Annotations 中;

3. 将得到的test.txt,train.txt,val.txt,trainval.txt 放置于 faster-rcnn/data/VOCdevkit2007/VOC2007/ Annotations/ImageSets/Main 。

原文链接:制作VOC2007数据集用于Faster-RCNN训练

猜你喜欢

转载自blog.csdn.net/guduruyu/article/details/81083247