您的位置:首页 > 其它

windows+tensorflow+fasterRcnn---3

2017-08-31 17:28 369 查看
下面就是用别人的框架训练自己的数据了

(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"
"""



由于我的图片是000001,000002....的顺序,我的用labelImage 进行标注的时候,没有修改图片名称,因此XML中文件的图片的路径名称就需要要修改,所以可用以下代码批量修改XML文件中图片路径名称,注意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('\<path>(.*?)\</path>', '<path>G:/data/VOCdevkit2007/VOC2007/JPEGImages/' + str(n).zfill(6) + '.jpg</path>', 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 ~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: