系统环境
ubuntu14.04
python2.7
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
说明:基于cpu环境的py-faster-rcnn具体配置过程可以看我的另一篇文章点击打开链接
下面我将从制作做数据集开始讲解利用py-faster-rcnn训练自己的数据模型的过程。
制作数据集
在制作自己的数据集之前,我们先下载VOC2007数据集。
百度云地址:http://pan.baidu.com/s/1gfdSFRX
解压,然后,将该数据集放在py-faster-rcnn-master\data目录下。(后面你将用你的训练数据集替换VOC2007数据集。(替换Annotations,ImageSets和JPEGImages)
(用你的Annotations,ImagesSets和JPEGImages替换py-faster-rcnn\data\VOCdevkit2007\VOC2007中对应文件夹)
文件结构如下所示:
Annotations中是所有的xml文件
JPEGImages中是所有的训练图片
Main中是4个txt文件,其中test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集
(一)图片命名
我们需要将自己的数据集做成VOC2007格式用于训练,那么我们应该首先将图片重新命名为“000001.jpg”这种格式,这是VOC2007标准格式。我们首先将训练图片全部放入同一个文件夹下,如我刚开始做测试时将图片放在了下面路径下:/home/wlw/VS_code_projects/cat_dog_picture。下面利用python将这些图片进行批量重命名。
#_*_coding:utf-8
import os
pic_path="/home/wlw/VS_code_projects/cat_dog_picture"
def rename():
piclist=os.listdir(pic_path)
total_num=len(piclist)
i=1
for pic in piclist:
if pic.endswith(".jpg"):
old_path=os.path.join(os.path.abspath(pic_path),pic)#os.path.abspath获得绝对路径
new_path=os.path.join(os.path.abspath(pic_path),'000'+format(str(i),'0>3')+'.jpg')
os.renames(old_path,new_path)
print u"把原图片命名格式:"+old_path+u"转换为新图片命名格式:"+new_path
#print "把原图片路径:%s,转换为新图片路径:%s" %(old_path,new_path)
i=i+1
print "总共"+str(total_num)+"张图片被重命名为:" "000001.jpg~"+'000'+format(str(i-1),'0>3')+".jpg形式"
rename()
效果如下:
(二)画目标包围框并自动生成XML文件
这里我利用了labelimg工具点击打开链接,可以利用它自定义绘制目标包围框,并自动生成xml文件
(三)利用python将XML文件生成ImageSets\Main里的四个txt文件
txt文件里的内容为:
即图片名(无后缀),test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集。这里我设定,trainval大概是整个数据集的80%,test也大概是整个数据集的20%;train大概是trainval的80%,val大概是trainval的20%。python 代码如下:
#_*_coding:utf-8
import os
import random
#import numpy as np
#from sklearn.model_selection import train_test_split
xmlfilepath="/home/wlw/VS_code_projects/pic_xml"
txtsavepath="/home/wlw/VS_code_projects/pic_txt"
trainval_percent=0.8 #traincal占整个数据集的80%,剩下的就是test所占的百分比
train_percent=0.8 #train占trainval的百分比,剩下的就是val所占百分比
def xml_to_txt():
xmllist=os.listdir(xmlfilepath)#xml文件列表
xml_num=len(xmllist)#xml文件数量
num_list=range(xml_num)#将xml文件分别用数字表示
# trainval=xmllist[:int(num_