人工智能/模式识别/机器学习精华专题大数据,机器学习,人工智能人工智能(语言识别&图像识别)

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

2019-02-18  本文已影响3人  流光易抛

一、数据集准备

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

这里需要说明一下,如果想训练一个比较好的模型,数据集的量一定要大,自己之前使用了一个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处理一下。

# 文件名 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文件

#!/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('<?xml version="1.0" encoding="UTF-8"?>\n')
        xml.write('<annotation>\n')
        xml.write('\t<folder>' + 'voc2007' + '</folder>\n')
        xml.write('\t<filename>' + info1 + '</filename>\n')
        xml.write('\t<path>' + path+"/"+info1 + '</path>\n')
        xml.write('\t<source>\n')
        xml.write('\t\t<database>The UAV autolanding</database>\n')
        xml.write('\t</source>\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>cat</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()
<?xml version="1.0" encoding="UTF-8"?>
<annotation>
    <folder>voc2007</folder>
    <filename>1.jpg</filename>
    <path>/Users/douglaswang/workspace/2019-02/Faster-RCNN_TF/data/VOCdevkit2007/VOC2007/JPEGImages/1.jpg</path>
    <source>
        <database>The UAV autolanding</database>
    </source>
    <size>
        <width>1668</width>
        <height>2361</height>
        <depth>3</depth>
    </size>
        <segmented>0</segmented>
    <object>
        <name>bill</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>132</xmin>
            <ymin>1769</ymin>
            <xmax>808</xmax>
            <ymax>2193</ymax>
        </bndbox>
    </object>
</annotation>

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

上一篇 下一篇

猜你喜欢

热点阅读