官方给出的faster R-CNN的源码python版:https://github.com/rbgirshick/py-faster-rcnn

先来分析一下 整个文件,根目录下的文件

  • caffe-fast-rcnn

存放caffe框架

  • data

  下面有两个文件夹,第一个是demo,放了5张用于测试的图片。第二个是scripts,里面放了三个脚本文件,分别为下载在VOC2007上训练的Faster R-CNN模型、下载预训练的分类模型(ZF或者VGG16)

和设置数据集的符号链接的脚本文件。

  • experiments

  该文件下又有三个文件夹,第一个是cfg,用来存放faster r-cnn两种训练方式alt_opt和end2end的配置文件,第二个是scripts,下面有三个脚本,分别为用于训练fast rcnn的脚本文件,用alt_opt方式训练faster rcnn的脚本文件,用end2end方式训练faster rcnn的脚本文件

logs:训练的日志文件,在experiments/scripts脚本文件中,每一个脚本都会保存一个日志文件到这个目录下

  • lib

  存放了读取数据库的函数以及faster rcnn中的核心代码,rpn中anchor的生成、极大值抑制筛选anchor等等,之后会分析源码。

  • models

  存放了三个分类的网络,ZF、VGG16和VGG_CNN_M_1024

  • tools

  用于训练、测试、压缩fast rcnn网络

先来看一下datasets下的imbd.py

imdb的实例数据属性

def __init__(self, name):
self._name = name #数据集的名字
self._num_classes = 0 #该数据集要识别的物体类别的个数
self._classes = []    #该数据集的所有类别名称构成的列表
self._image_index = []    #数据集图片索引列表
self._obj_proposer = 'selective_search' #
self._roidb = None #词典列表,含有四个key值,分别为boxs的位置,与gt的重合度,相对应gt的类别,是否翻转
self._roidb_handler = self.default_roidb #
# Use this dict for storing dataset specific config options
self.config = {}

roidb的产生与gt_roidb和box_list有关,gt_roidb的获得在pascal_voc.py中的gt_roidb()方法中,而gt_roidb调用了方法_load_pascal_annotation(index)。类pascal_voc继承于imdb。

 gt_roidb = [self._load_pascal_annotation(index)
for index in self.image_index]

_load_pascal_annotation(index)方法从PASCAL VOC的XML文件中读取image和bounding boxes。从这个方法也可以看到roidb中四个字典的value值是怎么设置的。

   def _load_pascal_annotation(self, index):
filename = os.path.join(self._data_path, 'Annotations', index + '.xml')
tree = ET.parse(filename) #将XML按语法生成一棵树
objs = tree.findall('object') #寻找所有以object为tag的数据
if not self.config['use_diff']: #排除所有标记为difficult的难以识别的目标
non_diff_objs = [
obj for obj in objs if int(obj.find('difficult').text) == 0]
# if len(non_diff_objs) != len(objs):
# print 'Removed {} difficult objects'.format(
# len(objs) - len(non_diff_objs))
objs = non_diff_objs
num_objs = len(objs) #ground-truth的总数 boxes = np.zeros((num_objs, 4), dtype=np.uint16)
gt_classes = np.zeros((num_objs), dtype=np.int32)
overlaps = np.zeros((num_objs, self.num_classes), dtype=np.float32)
# "Seg" area for pascal is just the box area
seg_areas = np.zeros((num_objs), dtype=np.float32) # Load object bounding boxes into a data frame.
for ix, obj in enumerate(objs):
bbox = obj.find('bndbox') #左上角和右下角
x1 = float(bbox.find('xmin').text) - 1 #box的下标是从1开始的,为了建立以0为原点的坐标所以减一
y1 = float(bbox.find('ymin').text) - 1
x2 = float(bbox.find('xmax').text) - 1
y2 = float(bbox.find('ymax').text) - 1
cls = self._class_to_ind[obj.find('name').text.lower().strip()] #去除类别名的首尾空格找到该类别的索引
boxes[ix, :] = [x1, y1, x2, y2]
gt_classes[ix] = cls
overlaps[ix, cls] = 1.0 #gt_roibd所在类别的重合率是1,其他类别为0
seg_areas[ix] = (x2 - x1 + 1) * (y2 - y1 + 1) overlaps = scipy.sparse.csr_matrix(overlaps) #将overlaps的稀疏矩阵压缩 return {'boxes' : boxes,
'gt_classes': gt_classes,
'gt_overlaps' : overlaps,
'flipped' : False,
'seg_areas' : seg_areas}

然后就是box_list是每张image中含有的box

def create_roidb_from_box_list(self, box_list, gt_roidb):
assert len(box_list) == self.num_images, \
'Number of boxes must match number of ground-truth images'
roidb = []
for i in xrange(self.num_images):
boxes = box_list[i]
num_boxes = boxes.shape[0] #该image中含有的box个数
overlaps = np.zeros((num_boxes, self.num_classes), dtype=np.float32) if gt_roidb is not None and gt_roidb[i]['boxes'].size > 0:
gt_boxes = gt_roidb[i]['boxes']
gt_classes = gt_roidb[i]['gt_classes']
gt_overlaps = bbox_overlaps(boxes.astype(np.float),
gt_boxes.astype(np.float))
argmaxes = gt_overlaps.argmax(axis=1) #获得所有boxes重叠率最高的gt_box的类别索引
maxes = gt_overlaps.max(axis=1) #与argmax对应的重叠率
I = np.where(maxes > 0)[0] #去掉重叠率小于1的box
overlaps[I, gt_classes[argmaxes[I]]] = maxes[I] overlaps = scipy.sparse.csr_matrix(overlaps)
roidb.append({
'boxes' : boxes,
'gt_classes' : np.zeros((num_boxes,), dtype=np.int32),
'gt_overlaps' : overlaps,
'flipped' : False,
'seg_areas' : np.zeros((num_boxes,), dtype=np.float32),
})
return roidb

对roidb进行翻转操作,如果想扩充自己的数据集,可以在这个方法上添加修改

def append_flipped_images(self):
num_images = self.num_images
widths = self._get_widths()
for i in xrange(num_images):
boxes = self.roidb[i]['boxes'].copy()
oldx1 = boxes[:, 0].copy()
oldx2 = boxes[:, 2].copy()
boxes[:, 0] = widths[i] - oldx2 - 1
boxes[:, 2] = widths[i] - oldx1 - 1
assert (boxes[:, 2] >= boxes[:, 0]).all()
entry = {'boxes' : boxes,
'gt_overlaps' : self.roidb[i]['gt_overlaps'],
'gt_classes' : self.roidb[i]['gt_classes'],
'flipped' : True}
self.roidb.append(entry)
self._image_index = self._image_index * 2

继续来看pascal_voc.py,这个类是继承于imbd的。

在这个类中image是通过索引获得的,图片的命名形式如下:

        self._devkit_path = self._get_default_path() if devkit_path is None \
else devkit_path
self._data_path = os.path.join(self._devkit_path, 'VOC' + self._year)
     image_path = os.path.join(self._data_path, 'JPEGImages',
index + self._image_ext)

_year和devkit_path都是初始化实例时传进的字符串,_image_ext属性是图片的后缀名,默认为“.jpg”。

函数

py-faster R-CNN 用于训练自己的数据(1)的更多相关文章

  1. faster r-cnn 在CPU配置下训练自己的数据

    因为没有GPU,所以在CPU下训练自己的数据,中间遇到了各种各样的坑,还好没有放弃,特以此文记录此过程. 1.在CPU下配置faster r-cnn,参考博客:http://blog.csdn.net ...

  2. caffe学习三:使用Faster RCNN训练自己的数据

    本文假设你已经完成了安装,并可以运行demo.py 不会安装且用PASCAL VOC数据集的请看另来两篇博客. caffe学习一:ubuntu16.04下跑Faster R-CNN demo (基于c ...

  3. MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(三)

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前两篇文章MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网 ...

  4. py faster rcnn+ 1080Ti+cudnn5.0

    看了py-faster-rcnn上的issue,原来大家都遇到各种问题. 我要好好琢磨一下,看看到底怎么样才能更好地把GPU卡发挥出来.最近真是和GPU卡较上劲了. 上午解决了g++的问题不是. 然后 ...

  5. caffe 用faster rcnn 训练自己的数据 遇到的问题

    1 . 怎么处理那些pyx和.c .h文件 在lib下有一些文件为.pyx文件,遇到不能import可以cython 那个文件,然后把lib文件夹重新make一下. 遇到.c 和 .h一样的操作. 2 ...

  6. py-faster-rcnn 训练自己的数据

    转载:http://blog.csdn.net/sinat_30071459/article/details/51332084  Faster-RCNN+ZF用自己的数据集训练模型(Python版本) ...

  7. YOLO2解读,训练自己的数据及相关转载以供学习

    https://pjreddie.com/darknet/yolo/ 具体安装及使用可以参考官方文档https://github.com/pjreddie/darknet https://blog.c ...

  8. 利用YOLOV3训练自己的数据

    写在前面:YOLOV3只有修改了源码才需要重新make,而且make之前要先make clean. 一.准备数据 在/darknet/VOCdevkit1下建立文件夹VOC2007. voc2007文 ...

  9. YOLOv3:训练自己的数据(附优化与问题总结)

    环境说明 系统:ubuntu16.04 显卡:Tesla k80 12G显存 python环境: 2.7 && 3.6 前提条件:cuda9.0 cudnn7.0 opencv3.4. ...

随机推荐

  1. springmvc通过ajax异步请求返回json格式数据

    jsp 首先创建index.jsp页面 <script type="text/javascript"> $(function () { $("#usernam ...

  2. 【Python】【函数式编程】

    #[练习] 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程: ax2 + bx + c = 0 的两个解. 提示:计算平方根可以调用math.sqrt()函数: & ...

  3. OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000083e80000, 1366294528, 0) failed;

    我是在手动搭建nexus时遇到的 安装nexus时 启动命令的时候会报OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000 ...

  4. mysql 5.7.18 winx64安装配置方法

    在mysql-5.7.18-winx64文件夹下新建my.ini文件 [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] #设置 ...

  5. 《剑指offer》第五十七题(为s的连续正数序列)

    // 面试题57(二):为s的连续正数序列 // 题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数). // 例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结 ...

  6. 虹软人脸识别 arcface2.0 安卓版本

    虹软官方网站提供了  AndroidStudio 版本的arcface2.0,我花了 几天的时间整理了一个 ADT版本的源码, 是自己从  官方 2.0 android版本中转换而来的.已经测试了,可 ...

  7. x1c 2018 静音调教

    折腾快1周,在去intel官网手动下载最新显卡驱动,手动卸载老驱动,断网,重启,手动安装之后(还要再禁用点和散热相关的设备).终于不卡了.开始工作,但又遇到一个问题:太TM吵了! 经过调教,基本保障看 ...

  8. 修改Anaconda中的Jupyter Notebook默认工作路径

    这二天,安装了anaconda想更改jupyter的工作路径,在网上找了一下 方式1. 打开Windows的cmd,在cmd中输入jupyter notebook --generate-config如 ...

  9. Java 8新特性探究(二)深入解析默认方法

    什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是 ...

  10. vue 里面引入高德地图

    效果图: 实现: 一:引入 高德,web-sdk (两种方式) 1:在html 中引入(我用的这一种) <script type="text/javascript" src= ...