Faster-RCNN系列(一) 制作自己的数据集Pascal_VOC格式

一、数据集准备

我们在做目标识别时,大家都知道要有训练集、验证集以及测试集,当然数据集格式也有很多种,我们这里使用的是pascal_voc数据格式。如下图是voc2007数据集文件夹格式

  • JPEGImages:用来保存你的数据图片,当然,对于faster-rcnn来讲,所有的图片必须是jpg/jpeg格式,其他格式的话要转换一下。另外,一定要对图片进行编号,一般按照voc数据集格式,采用六位数字编码,如000001.jpg、000002.jpg等。
  • Annotations:这里是存放你对所有数据图片做的标注,每张照片的标注信息必须是xml格式。
  • ImageSets:该文件下有一个main文件,main文件下有四个txt文件,分别是train.txt、test.txt、trainval.txt、val.txt,里面都是存放的图片号码,当然,我们现在只关注训练,所以要将所有用做训练的图片号码放入train.txt中,一行一个编号。

这里需要说明一下,如果想训练一个比较好的模型,数据集的量一定要大,自己之前使用了一个1000多张的训练数据集,经过自己验证,无法训练出来一个好的分类器模型。当然,大家想自己制作数据集,并且做标注,这也是一个十分大的工程,具体如何做标注,大家可以参考其他博客。
当然,大家只需要修改voc2007数据集中的这三个文件即可,这样就可以避免一些更繁琐的步骤。

1. 训练所需的图片;

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
# 批量重命名文件

class ImageRename():
    def __init__(self):
        self.path = '/Users/douglaswang/workspace/2019-02/train/train'

    def rename(self):
        filelist = os.listdir(self.path)
        total_num = len(filelist)

        i = 0
        for item in filelist:
            if item.endswith('.jpg'):
                src = os.path.join(os.path.abspath(self.path), item)
                dst = os.path.join(os.path.abspath(self.path), '0000' + format(str(i), '0>3s') + '.jpg')
                os.rename(src, dst)
                os.rename(quad_src, quad_dst)
                print 'converting %s to %s ...' % (src, dst)
                i = i + 1
        print 'total %d to rename & converted %d jpgs' % (total_num, i)

if __name__ == '__main__':
    newname = ImageRename()
    newname.rename()

2. 图片上ROI标注信息的XML文件;

第二步:框定ROI

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

  • pos-all.txt 如下
# 文件名 xmin ymin xmax ymax
1.jpg 132 1769 808 2193
2.jpg 132 1769 808 2193
3.jpg 132 1769 808 2193
4.jpg 132 1769 808 2193
5.jpg 132 1769 808 2193
6.jpg 132 1769 808 2193
……

第三步:产生XML文件

  • txt2xml.py, 将txt转为xml
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys
import os
import codecs
import cv2
reload(sys)
sys.setdefaultencoding('utf8')

path= "/Users/douglaswang/workspace/2019-02/Faster-RCNN_TF/data/VOCdevkit2007/VOC2007/JPEGImages"
root = r'/Users/douglaswang/workspace/2019-02/train'
fp = open('pos-all.txt')
fp2 = open('train.txt', 'w')
uavinfo = fp.readlines()
 
for i in range(len(uavinfo)):
    line = uavinfo[i]
    line = line.strip().split(' ') 
    line[0] = "/Users/douglaswang/workspace/2019-02/train/jpg/"+str(line[0])  
    img = cv2.imread(line[0])
    print 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'/xml/'+ info2 + '.xml', 'w', 'utf-8') as xml:
        xml.write('\n')
        xml.write('\n')
        xml.write('\t' + 'voc2007' + '\n')
        xml.write('\t' + info1 + '\n')
        xml.write('\t' + path+"/"+info1 + '\n')
        xml.write('\t\n')
        xml.write('\t\tThe UAV autolanding\n')
        xml.write('\t\n')
        xml.write('\t\n')
        xml.write('\t\t'+ str(width) + '\n')
        xml.write('\t\t'+ str(height) + '\n')
        xml.write('\t\t' + str(depth) + '\n')
        xml.write('\t\n')
        xml.write('\t\t0\n')
        xml.write('\t\n')
        xml.write('\t\tcat\n')
        xml.write('\t\tUnspecified\n')
        xml.write('\t\t0\n')
        xml.write('\t\t0\n')
        xml.write('\t\t\n')
        xml.write('\t\t\t' + l_pos1 + '\n')
        xml.write('\t\t\t' + l_pos2 + '\n')
        xml.write('\t\t\t' + r_pos1 + '\n')
        xml.write('\t\t\t' + r_pos2 + '\n')
        xml.write('\t\t\n')
        xml.write('\t\n')
        xml.write('')
fp2.close()
  • 生成xml详细内容如下:
    注: object->name,cat为我们的label


	voc2007
	1.jpg
	/Users/douglaswang/workspace/2019-02/Faster-RCNN_TF/data/VOCdevkit2007/VOC2007/JPEGImages/1.jpg
	
		The UAV autolanding
	
	
		1668
		2361
		3
	
		0
	
		bill
		Unspecified
		0
		0
		
			132
			1769
			808
			2193
		
	

3. 将数据集分割为三部分分别用于frcnn进行训练,验证,测试等。

第四步:数据集分割

在自己的VOC2007文件夹下创建.py文件,运行以下程序,可修改trainval_percent和train_percent两个参数,调整用于训练和测试的图片数量

#coding=utf-8
import cv2
import os
import random
 
root = '/Users/douglaswang/workspace/2019-02/train/Main'
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()

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

预训练模型、数据集的具体路径放在:

- Faster-RCNN_TF
    - data
        - VOCdevkit2007
            - VOC2007
                - JPEGImages
                - Annotations
                - ImageSets
        - pretrain_model
            - VGG_imagenet.npy

End

你可能感兴趣的:(深度学习,cv,Faster-RCNN)