我们在做目标识别时,大家都知道要有训练集、验证集以及测试集,当然数据集格式也有很多种,我们这里使用的是pascal_voc数据格式。如下图是voc2007数据集文件夹格式
这里需要说明一下,如果想训练一个比较好的模型,数据集的量一定要大,自己之前使用了一个1000多张的训练数据集,经过自己验证,无法训练出来一个好的分类器模型。当然,大家想自己制作数据集,并且做标注,这也是一个十分大的工程,具体如何做标注,大家可以参考其他博客。
当然,大家只需要修改voc2007数据集中的这三个文件即可,这样就可以避免一些更繁琐的步骤。
图片重命名
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()
第二步:框定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('\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\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(' ')
fp2.close()
注: object->name,cat为我们的label
voc2007
1.jpg
/Users/douglaswang/workspace/2019-02/Faster-RCNN_TF/data/VOCdevkit2007/VOC2007/JPEGImages/1.jpg
1668
2361
3
0
第四步:数据集分割
在自己的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