py-faster-rcnn代码roidb.py的解读

roidb是比较复杂的数据结构,存放了数据集的roi信息。原始的roidb来自数据集,在trian.py的get_training_roidb(imdb)函数进行了水平翻转扩充数量,然后prepare_roidb(imdb)【定义在roidb.py】为roidb添加了一些说明性的属性。

在这里暂时记录下roidb的结构信息,后面继续看的时候可能会有些修正:

roidb是由字典组成的list,roidb[img_index]包含了该图片索引所包含到roi信息,下面以roidb[img_index]为例说明:

roidb[img_index]包含的key, value
boxes box位置信息,box_num*4的np array
gt_overlaps 所有box在不同类别的得分,box_num*class_num矩阵
gt_classes 所有box的真实类别,box_num长度的list
flipped 是否翻转
 image 该图片的路径,字符串
width 图片的宽
height  图片的高
max_overlaps 每个box的在所有类别的得分最大值,box_num长度
max_classes 每个box的得分最高所对应的类,box_num长度
bbox_targets 每个box的类别,以及与最接近的gt-box的4个方位偏移
(共5列)

def add_bbox_regression_targets(roidb):"""Add information needed to train bounding-box regressors."""assert len(roidb) > 0assert 'max_classes' in roidb[0], 'Did you call prepare_roidb first?'num_images = len(roidb)# Infer number of classes from the number of columns in gt_overlaps# 类别数,roidb[0]对应第0号图片上的roi,shape[1]多少列表示roi属于不同类上的概率num_classes = roidb[0]['gt_overlaps'].shape[1]for im_i in xrange(num_images):rois = roidb[im_i]['boxes']max_overlaps = roidb[im_i]['max_overlaps']max_classes = roidb[im_i]['max_classes']# bbox_targets:每个box的类别,以及与最接近的gt-box的4个方位偏移roidb[im_i]['bbox_targets'] = \_compute_targets(rois, max_overlaps, max_classes)# 这里config是falseif cfg.TRAIN.BBOX_NORMALIZE_TARGETS_PRECOMPUTED:# Use fixed / precomputed "means" and "stds" instead of empirical values# 使用固定的均值和方差代替经验值means = np.tile(np.array(cfg.TRAIN.BBOX_NORMALIZE_MEANS), (num_classes, 1))stds = np.tile(np.array(cfg.TRAIN.BBOX_NORMALIZE_STDS), (num_classes, 1))else:# Compute values needed for means and stds# 计算所需的均值和方差# var(x) = E(x^2) - E(x)^2# 计数各个类别出现box的数量class_counts = np.zeros((num_classes, 1)) + cfg.EPS  #加上cfg.EPS防止除0出错# 21类*4个位置,如果出现box的类别与其中某一类相同,将该box的4个target加入4个列元素中sums = np.zeros((num_classes, 4)) # 21类*4个位置,如果出现box的类别与其中某一类相同,将该box的4个target的平方加入4个列元素中squared_sums = np.zeros((num_classes, 4))for im_i in xrange(num_images):targets = roidb[im_i]['bbox_targets']for cls in xrange(1, num_classes):cls_inds = np.where(targets[:, 0] == cls)[0]# box的类别与该类匹配,计入if cls_inds.size > 0:class_counts[cls] += cls_inds.sizesums[cls, :] += targets[cls_inds, 1:].sum(axis=0)squared_sums[cls, :] += \(targets[cls_inds, 1:] ** 2).sum(axis=0)means = sums / class_counts # 均值stds = np.sqrt(squared_sums / class_counts - means ** 2) #标准差print 'bbox target means:'print meansprint means[1:, :].mean(axis=0) # ignore bg classprint 'bbox target stdevs:'print stdsprint stds[1:, :].mean(axis=0) # ignore bg class# Normalize targets# 对每一box归一化targetif cfg.TRAIN.BBOX_NORMALIZE_TARGETS:print "Normalizing targets"for im_i in xrange(num_images):targets = roidb[im_i]['bbox_targets']for cls in xrange(1, num_classes):cls_inds = np.where(targets[:, 0] == cls)[0]roidb[im_i]['bbox_targets'][cls_inds, 1:] -= means[cls, :]roidb[im_i]['bbox_targets'][cls_inds, 1:] /= stds[cls, :]else:print "NOT normalizing targets"# 均值和方差也用于预测# These values will be needed for making predictions# (the predicts will need to be unnormalized and uncentered)return means.ravel(), stds.ravel()  # ravel()排序拉成一维def _compute_targets(rois, overlaps, labels):  # 参数rois只含有当前图片的box信息"""Compute bounding-box regression targets for an image."""# Indices目录 of ground-truth ROIs# ground-truth ROIsgt_inds = np.where(overlaps == 1)[0]if len(gt_inds) == 0:# Bail if the image has no ground-truth ROIs# 不存在gt ROI,返回空数组return np.zeros((rois.shape[0], 5), dtype=np.float32)# Indices of examples for which we try to make predictions# BBOX阈值,只有ROI与gt的重叠度大于阈值,这样的ROI才能用作bb回归的训练样本ex_inds = np.where(overlaps >= cfg.TRAIN.BBOX_THRESH)[0]# Get IoU overlap between each ex ROI and gt ROI# 计算ex ROI and gt ROI的IoUex_gt_overlaps = bbox_overlaps(# 变数据格式为floatnp.ascontiguousarray(rois[ex_inds, :], dtype=np.float),np.ascontiguousarray(rois[gt_inds, :], dtype=np.float))# Find which gt ROI each ex ROI has max overlap with:# this will be the ex ROI's gt target# 这里每一行代表一个ex_roi,列代表gt_roi,元素数值代表两者的IoUgt_assignment = ex_gt_overlaps.argmax(axis=1) #按行求最大,返回索引.gt_rois = rois[gt_inds[gt_assignment], :]  #每个ex_roi对应的gt_rois,与下面ex_roi数量相同ex_rois = rois[ex_inds, :]targets = np.zeros((rois.shape[0], 5), dtype=np.float32)targets[ex_inds, 0] = labels[ex_inds]  #第一个元素是labeltargets[ex_inds, 1:] = bbox_transform(ex_rois, gt_rois)  #后4个元素是ex_box与gt_box的4个方位的偏移return targets

下面解读一下这两个函数。

1. _compute_targets(rois, overlaps, labels)

这个函数用来计算roi的偏移量。基本的步骤就是先确认是否含有ground-truth rois,主要通过 ground-truth ROIs的overlaps=1来确认。

然后找到重叠度大于一定阈值的box,再进行计算。


对于满足条件的box,会调用程序bbox_overlaps重新计算box对应于ground-truth box的重叠度,根据最大的重叠度找对应的ground truth box.

这样就可以利用 fast_rcnn.bbox_transform 的bbox_transform计算4个偏移(分别是中心点的x,y坐标,w,d长度偏移)。

输出的是一个二维数组,横坐标是盒子的序号,纵坐标是5维,第一维是类别,第二维到第五维为偏移。

bbox_overlaps的代码如下:

def bbox_overlaps(np.ndarray[DTYPE_t, ndim=2] boxes,np.ndarray[DTYPE_t, ndim=2] query_boxes):"""Parameters----------boxes: (N, 4) ndarray of floatquery_boxes: (K, 4) ndarray of floatReturns-------overlaps: (N, K) ndarray of overlap between boxes and query_boxes"""cdef unsigned int N = boxes.shape[0]cdef unsigned int K = query_boxes.shape[0]cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE)cdef DTYPE_t iw, ih, box_areacdef DTYPE_t uacdef unsigned int k, nfor k in range(K):box_area = ((query_boxes[k, 2] - query_boxes[k, 0] + 1) *(query_boxes[k, 3] - query_boxes[k, 1] + 1))for n in range(N):iw = (min(boxes[n, 2], query_boxes[k, 2]) -max(boxes[n, 0], query_boxes[k, 0]) + 1)if iw > 0:ih = (min(boxes[n, 3], query_boxes[k, 3]) -max(boxes[n, 1], query_boxes[k, 1]) + 1)if ih > 0:ua = float((boxes[n, 2] - boxes[n, 0] + 1) *(boxes[n, 3] - boxes[n, 1] + 1) +box_area - iw * ih)overlaps[n, k] = iw * ih / uareturn overlaps


2. add_bbox_regression_targets

    主要两个两件事: 1. 确定roidb每个图片的box的回归偏移量bbox_targets

                                   2. 对于所有的类别,计算偏移量的均值和方差,这样输出的矩阵是二维,行坐标是种类(这里是21类),纵坐标是偏移量(这里是4).

并且在需要正则化目标项(即cfg.TRAIN.BBOX_NORMALIZE_TARGETS=true)时,使每个偏移都减去均值除以标准差。并返回均值和方差的折叠一维向量,

用于预测(即逆操作,去正则化,则中心化)。


参考:

  • py-faster-rcnn代码阅读3-roidb.py
  • Faster RCNN roidb.py


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 概率分布_python实现概率分布

伯努利分布from scipy import statsimport numpy as npimport matplotlib.pyplot as pltxnp.arange(0,2,1)xarray([0, 1])# 求对应分布的概率:概率质量函数 (PMF)p0.5# 硬币朝上的概率dfstats.bernoulli.pmf(x,p)dfarray([0.5, 0.5])#绘图vlines用于绘制竖直线(vert…

CodeForces 7D Palindrome Degree 字符串hash

题目链接&#xff1a;点击打开链接 #include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #include<string> #include<stdlib…

程序清单8-9 回送所有命令行参数和所有环境字符串

1 /*2 3 Name : test.c4 Author : blank5 Version :6 Copyright : Your copyright notice7 Description : 程序清单8-9 回送所有命令行参数和所有环境字符串8 9 */ 10 11 #include "ourhdr.h" 12 13 int main(int argc, char *argv[]) 14…

SQL快速入门

关系化数据库保存关系模式数据的容器关系模式是对业务对象实体&#xff0c;属性以及关系的抽象&#xff0c;提炼需求的名词是建立实体关系模型常用的方法。要了解E-R实体关系图的绘制。常用关系数据库Microsoft SQL Server&#xff1b;微软公司产品&#xff0c;中等规模数据库&…

Faster RCNN minibatch.py解读

minibatch.py 的功能是&#xff1a; Compute minibatch blobs for training a Fast R-CNN network. 与roidb不同的是&#xff0c; minibatch中存储的并不是完整的整张图像图像&#xff0c;而是从图像经过转换后得到的四维blob以及从图像中截取的proposals&#xff0c;以及与之对…

oracle精简版_使用Entity Framework Core访问数据库(Oracle篇)

前言哇。。看看时间 真的很久很久没写博客了 将近一年了。最近一直在忙各种家中事务和公司的新框架 终于抽出时间来更新一波了。本篇主要讲一下关于Entity Framework Core访问oracle数据库的采坑。。强调一下&#xff0c;本篇文章发布之前 关于Entity Framework Core访问oracl…

interrupt、interrupted 、isInterrupted 区别

interrupt&#xff1a;调用方法&#xff0c;是线程处于中断状态&#xff0c;但是这个方法只是让线程设置为中断状态&#xff0c;并不会真正的停止线程。支持线程中断的方法就是在坚持线程中断状态&#xff0c;一旦线程中断状态被设置为中断&#xff0c;就会抛出异常。interrupt…

java String部分源码解析

String类型的成员变量 /** String的属性值 */ private final char value[];/** The offset is the first index of the storage that is used. *//**数组被使用的开始位置**/private final int offset;/** The count is the number of characters in the String. *//**String中…

python在材料模拟中的应用_基于Python的ABAQUS二次开发及在板料快速冲压成形模拟中的应用...

2009doi:1013969/j1issn1100722012120091041013基于Python的ABAQUS二次开发及在板料快速冲压成形模拟中的应用(北京航空航天大学飞行器制造工程系,北京100191)吴向东刘志刚万敏王文平黄霖摘要:采用Python脚本语言对ABAQUS的前处理模块进行二次开发,讨论了Python脚本在ABAQUS二次…

Doxygen简介

&#xff08;转自&#xff1a;http://www.cnblogs.com/liuliunumberone/archive/2012/04/10/2441391.html&#xff09; 一&#xff0e;什么是Doxygen? Doxygen 是一个程序的文件产生工具&#xff0c;可将程序中的特定批注转换成为说明文件。通常我们在写程序时&#xff0c;或多…

javascript之闭包理解以及应用场景

1 function fn(){2 var a 0;3 return function (){4 return a;5 } 6 }如上所示&#xff0c;上面第一个return返回的就是一个闭包&#xff0c;那么本质上说闭包就是一个函数。那么返回这个函数有什么用呢&#xff1f;那是因为这个函数可以调用到它外部的a…

faster rcnn学习之rpn、fast rcnn数据准备说明

在上文《 faster-rcnn系列学习之准备数据》,我们已经介绍了imdb与roidb的一些情况&#xff0c;下面我们准备再继续说一下rpn阶段和fast rcnn阶段的数据准备整个处理流程。 由于这两个阶段的数据准备有些重合&#xff0c;所以放在一起说明。 我们并行地从train_rpn与train_fas…

sql server规范

常见的字段类型选择 1.字符类型建议采用varchar/nvarchar数据类型2.金额货币建议采用money数据类型3.科学计数建议采用numeric数据类型4.自增长标识建议采用bigint数据类型 (数据量一大&#xff0c;用int类型就装不下&#xff0c;那以后改造就麻烦了)5.时间类型建议采用为dat…

关于标准库中的ptr_fun/binary_function/bind1st/bind2nd

http://www.cnblogs.com/shootingstars/archive/2008/11/14/860042.html 以前使用bind1st以及bind2nd很少&#xff0c;后来发现这两个函数还挺好玩的&#xff0c;于是关心上了。在C Primer对于bind函数的描述如下&#xff1a;“绑定器binder通过把二元函数对象的一个实参绑定到…

CSS伪类

一、首字母的颜色字体写法 p:first-letter 二、文本的特殊样式设置 first-line css伪类可与css类配合使用 伪元素只能用于块级元素 转载于:https://www.cnblogs.com/boyblog/p/4623374.html

php 结构体_【开发规范】PHP编码开发规范下篇:PSR-2编码风格规范

之前的一篇文章是对PSR-1的基本介绍接下来是PSR-2 编码风格规范&#xff0c;它是 PSR-1 基本代码规范的继承与扩展。PSR-1 和PSR-2是PHP开发中基本的编码规范&#xff0c;大家其实都可以参考学习下&#xff0c;虽然说每个开发者都有自己熟悉的一套开发规范&#xff0c;但是我觉…

faster rcnn学习之rpn训练全过程

上篇我们讲解了rpn与fast rcnn的数据准备阶段&#xff0c;接下来我们讲解rpn的整个训练过程。最后 讲解rpn训练完毕后rpn的生成。 我们顺着stage1_rpn_train.pt的内容讲解。 name: "VGG_CNN_M_1024" layer {name: input-datatype: Pythontop: datatop: im_infotop: …

BitMapData知识 转

Bitmap和BitmapData 2010.5.25 smartblack整理 一、flash.display.Bitmap类及其两个子类 1、继承自DisplayObject&#xff0c;和InteractiveObject平级&#xff0c;所以无法调度鼠标事件&#xff0c;可以使用额外的包装容器(Sprite)来实现侦听。 2、只支持GIF、JPEG、PNG格式&a…

Android学习之高德地图的通用功能开发步骤(二)

周一又来了&#xff0c;我就接着上次的开发步骤&#xff08;一&#xff09;来吧&#xff0c;继续把高德地图的相关简单功能分享一下 上次写到了第六步&#xff0c;接着写第七步吧。 第七步&#xff1a;定位 地图选点 路径规划 实时导航 以下是我的这个功能NaviMapActivity的…

Oracle中分区表中表空间属性

Oracle中的分区表是Oracle中的一个很好的特性&#xff0c;可以把大表划分成多个小表&#xff0c;从而提高对于该大表的SQL执行效率&#xff0c;而各个分区对应用又是透明的。分区表中的每个分区有独立的存储特性&#xff0c;包括表空间、PCT_FREE等。那分区表中的各分区表空间之…