下面就是用别人的框架训练自己的数据了
(1) 依旧是在源码 https://github.com/dBeker/Faster-RCNN-TensorFlow-Python3.5的基础之上进行改进
(2) 准备数据集:
需要:在masteràdata 下创建一个自己的存放数据的文件夹,如:VOCdevkit2007在该文件夹下:
a. 创建文件夹Annotations---用于存放使用label image生成的xml 文件
b. ImageSets---用于存放trian.txt test.txt trainval.txt val.txt(图片的名称)
c. JPEGImages—你所有的jpg格式的图片(包括训练测试等,txt文件中可以区分)
补充:对图片处理的 py code
批量修改图片名称,以及XML名称:
import os
import glob
import shutil
# 目录名称,你要自己修改
_dir = "H:/mypic/"
file_name = os.listdir(_dir)
print(file_name)
n=1
for file in file_name:
pic_name = os.listdir(_dir+file)
#print(pic_name)
for pic in pic_name:
if os.path.isdir(_dir+file+'/'+pic):
xml_name=os.listdir(_dir+file+"/"+pic)
for xml in xml_name:
shutil.copy( _dir+file+'/'+pic+"/"+xml, 'G:/data/VOCdevkit2007/VOC2007/Annotations/')
# print(pic)
#修改个别XML名称
# if xml == '1000010.xml':
#print(dir + file + '/' + pic)
# os.rename(_dir+file + '/' + pic + '/' + xml, _dir + file + '/' + pic + "/" + "100010.xml")
# oldname = _dir+file+'/'+pic+"/"+xml
# newname = _dir+file+'/'+pic+"/"+ str(n).zfill(6) + ".xml"
#os.rename(oldname, newname)
#n = n + 1
# print(oldname, '--->', newname)
# zfill是一个自动补零的函数 6 就是一共六位 不足的补零 只有字符串才有这个函数 所以转换了
# newname = _dir+str(xml_name.index(xml)+1).zfill(6)+".xml"
"""
#批量修改图片的名称
n=1
for file in file_name:
pic_name = os.listdir(_dir+file)
print(pic_name)
for pic in pic_name:
oldname = _dir+file+"/"+pic
newname = _dir+file+"/" + str(n).zfill(6) + ".jpg"
os.rename(oldname, newname)
n = n + 1
print(oldname, '--->', newname)
# zfill是一个自动补零的函数 6 就是一共六位 不足的补零 只有字符串才有这个函数 所以转换了
# newname = _dir+str(xml_name.index(xml)+1).zfill(6)+".xml"
"""
import os
import re
_dir = "G:/Annotations/"
xmlList = os.listdir(_dir)
n = 1
for xml in xmlList:
#f = open(_dir + xml, "r")
f = open(_dir + xml, "r", encoding='utf-8')
xmldata = f.read()
xmldata = re.sub('\(.*?)\ ', 'G:/data/VOCdevkit2007/VOC2007/JPEGImages/' + str(n).zfill(6) + '.jpg ', xmldata)
f.close()
f = open(_dir + xml, "w")
f.write(xmldata)
f.close()
n += 1
faster rcnn训练需要图像的bounding box信息作为监督(ground truth),所以你需要将你的所有可能的object使用框标注,并写上坐标,最终是一个XML格式的文件,一个训练图片对应Annotations下的一个同名的XML文件
(3) *修改…\data\VOCdevkit2007\VOC2007\ImageSets\Main 里面的train trainval test val 的txt!
(4) Pascal_VOC.py是主要读取数据的接口,修改自己的标注的类别。
self.__classes=('__background__', # always index 0,’people’,’cat’)//改成自己的类别
(5)
一些解释说明
打开faster R-CNN
à
lib
à
datasets 主要的而修改也是在这里面
a. factory.py学过设计模式的应该知道这是个工厂类,用类生成imdb类并且返回数据库共网络训练和测试使用
b. imdb.py这里是数据库读写类的基类,分装了许多db的操作,但是具体的一些文件读写需要继承继续读写
c. pascal_voc.pyRoss在这里用pascal_voc.py这个类来操作
备注: pasca_voc.py中:
def init(self, image_set, year,devkit_path=None)
/*这个是初始化函数,它对应着的是pascal_voc的数据集访问格式,其实我们将其接口修改的更简单一点*/
def image_path_at(self, i)
/*根据第i个图像样本返回其对应的path,其调用了image_path_from_index(self, index)作为其具体实现*/
def image_path_from_index(self, index)
//实现了 image_path的具体功能
def _load_image_set_index(self)
//加载了样本的list文件
def _get_default_path(self)
//获得数据集地址
def gt_roidb(self)
//读取并返回ground_truth(真实值,设定的一个正确的基准)的db
def selective_search_roidb
//读取并返回ROI的db
def _load_selective_search_roidb(self, gt_roidb)
//加载预选框的文件
def selective_search_IJCV_roidb(self)
//在这里调用读取Ground_truth和ROI db并将db合并
def _load_selective_search_IJCV_roidb(self, gt_roidb)
//这里是专门读取作者在IJCV上用的dataset
def _load_pascal_annotation(self, index)
//这个函数是读取gt的具体实现
def _write_voc_results_file(self, all_boxes)
//voc的检测结果写入到文件
def _do_matlab_eval(self, comp_id, output_dir='output')
//根据matlab的evluation接口来做结果的分析
def evaluate_detections
//其调用了_do_matlab_eval
def competition_mode
//设置competitoin_mode,加了一些噪点
有什么不对的地方,欢迎大家指出!!!!!么么哒~~
参考文献:http://www.cnblogs.com/louyihang-loves-baiyan/p/4903231.html
long way to go ~~~~