rpn产生proposals_一文读懂RPN和ROI Align

rpn和roi align是two-stage detector中比较关键的两个操作,这两个操作将two-stage detector中的两个stage连接起来,变成end-to-end(端到端)的网络,同时也给整个检测方法的性能带来提升。rpn为roi align提供高质量的候选框,即proposal,关系如图1所示:

下面详细说明一下各个过程,并且配合了代码的说明,其中代码来自facebook的detectron2,其中相关参数的配置文件可以参考detectron2/config/defaults.py

一、RPN

rpn全称是region proposal network,作用是为第二阶段提供高质量的目标候选框,如图1所示,包括了anchor generator、anchor target generator、rpn loss、proposal generator几个关键的步骤,下面分别详细说明。

1,anchor generator

Anchor是根据scale和ratio预先设定的,这些参数在全特征图中共享,如下图所示。左边表示使用stride=16的feature map作为目标检测的特征图,对于输入大小为800*600的图像,该特征图大小为50*38。其中anchor的scale包括为(8,16,32),ratio参数包括(0.5,1,2),故产生9种anchor;右图表示对于50*38大小的特征图,共产生17100个anchor,平铺到原图时,有一部分框会超出图像边界。

步骤及代码实现:

detectron2/modeling/anchor_generator.py:

grid_anchors(self, grid_sizes)

1)根据scale和ratio产生,预先生成n种anchor,这n种anchor所在坐标系为以anchor中心为原点的图像坐标系。

generate_cell_anchors(self, sizes=(32, 64, 128, 256, 512), aspect_ratios=(0.5, 1, 2))

2)在特征图中的每个坐标点处,计算anchor中心与该坐标的偏移

_create_grid_offsets(size, stride, offset, device)

3)通过anchor与生成的相对偏移,计算每张特征图中的所有anchor

anchors.append((shifts.view(-1, 1, 4) + base_anchors.view(1, -1, 4)).reshape(-1, 4))

2,anchor target generator

有了anchor,这些anchor是均匀地平铺在特征图的每个像素处,但是我们不知道哪些anchor是包括真实目标的,因此anchor target layer就完成区分哪些anchor是为正样本(包括真实目标),哪些anchor为负样本(只包括背景)的任务,具体方法是计算anchor与ground truth的IoU,评判标准有3条:对于每一个ground truth,选取一个与之有最大IoU的anchor作为正样

对于每一个anchor,与ground truth的IoU大于某一个阈值t1的anchor,作为正样本。

并不是除了以上两条的anchor为负样本,而是与ground truth的IoU小于某一个阈值t2的anchor为负样本,[t2,t1]之间的样本为“don’t care”样本,既不是正样本也不是负样本,不参与模型优化,即:不计算rpn loss

第一条保证了每个ground truth都有一个anchor与之相对应,第二条保证了在众多的anchor中,可以筛选出一定数据量的anchor作为正样本,保证正负样本的平衡。

步骤及代码实现:

detectron2/modeling/proposal_generator/rpn_outputs.py

detectron2/modeling/matcher.py

_get_ground_truth(self)

1)生成anchor与ground truth的IoU矩阵

match_quality_matrix=retry_if_cuda_oom(pairwise_iou)(gt_boxes_i,anchors_i)

2)根据评判标准,生成2组向量:anchor与ground truth匹配ID,用于bbox(bounding box回归);anchor的label:正样本、负样本、don’t care。

matched_idxs, gt_objectness_logits_i =retry_if_cuda_oom(self.anchor_matcher)(match_quality_matrix )

3)是否删除超过图像大小的anchor

if self.boundary_threshold>= 0:

# Discard anchors that go outof the boundaries of the image

# NOTE: This is legacyfunctionality that is turned off by default in Detectron2

anchors_inside_image =anchors_i.inside_box(image_size_i, self.boundary_threshold)

gt_objectness_logits_i[~anchors_inside_image] = -1

3,RPN Loss

rpn有两个任务:从众多anchor中,判断哪些anchor是正样本,哪些是负样本,即分类任务;对于正样本的anchor,回归获得真正的目标,即回归任务。所以loss由两部分组成,即:

其中分类任务,使用交叉熵loss:

回归任务使用smooth_l1 loss:

代码实现:

detectron2/modeling/proposal_generator/rpn_outputs.py

detectron2/modeling/box_regression.py

losses(self)

1)分类loss

objectness_loss =F.binary_cross_entropy_with_logits(

pred_objectness_logits[valid_masks],

gt_objectness_logits[valid_masks].to(torch.float32),

reduction="sum",

)

2)回归loss

localization_loss =smooth_l1_loss(

pred_anchor_deltas[pos_masks],gt_anchor_deltas[pos_masks], smooth_l1_beta, reduction="sum"

)

4,proposal generator

获得候选框的目的是为了给第二阶段提供优质的roi框,首先通过rpn_cls_prob筛选出topk_rpn_pre_nms个框,然后再经过nms得到topk_rpn_post_nms个框,最终输出给roi align。主要流程如下图。

主要步骤和相应代码实现如下:

detectron2/modeling/proposal_generator/rpn_outputs.py

find_top_rpn_proposals(

proposals,

pred_objectness_logits,

images,

nms_thresh,

pre_nms_topk,

post_nms_topk,

min_box_side_len,

training,

)

1)获取top_k_pre_nms个候选框

logits_i, idx =logits_i.sort(descending=True, dim=1)

topk_scores_i = logits_i[batch_idx,:num_proposals_i]

topk_idx = idx[batch_idx,:num_proposals_i]

# each is N x topk

topk_proposals_i =proposals_i[batch_idx[:, None], topk_idx] # N x topk x 4

2)对候选框做一些后处理,如:截断超出图像范围的框;删除非常小的框。

boxes.clip(image_size)

# filter empty boxes

keep =boxes.nonempty(threshold=min_box_side_len)

3)nms筛选得到更可信的top_k_post_nms个候选框作为roi

keep = batched_nms(boxes.tensor, scores_per_img, lvl, nms_thresh)

keep = keep[:post_nms_topk]

二、ROI Align

这个阶段是在rpn提供的proposal的基础上,筛选出第二阶段的训练样本,并提取相应的特征,用于组建第二阶段的训练网络,主要包括两个部分:proposal target generator、feature crop and pooling

1,proposal target generator

这个操作的主要目的是: 在rpn产生的proposal的基础上,选择一定量(min_batch: 一般每张图选择256个proposal,或者512个proposal)的roi,作为训练第二阶段的样本,并且要设定该min_batch中正负样本的比例,如正:负=1:3。

主要步骤与代码实现如下:

detectron2/modeling/roi_heads/roi_heads.py

detectron2/modeling/sampling.py

label_and_sample_proposals(

self, proposals: List[Instances], targets: List[Instances]

) -> List[Instances]:

1)判断proposal中,哪些是正样本,哪些是负样本

match_quality_matrix =pairwise_iou(

targets_per_image.gt_boxes,proposals_per_image.proposal_boxes

)

matched_idxs, matched_labels =self.proposal_matcher(match_quality_matrix)

2)筛选min_batch的样本,并给正样本赋予正确的目标类别

sampled_idxs, gt_classes =self._sample_proposals(

matched_idxs, matched_labels,targets_per_image.gt_classes

)

# Set target attributes of thesampled proposals:

proposals_per_image =proposals_per_image[sampled_idxs]

proposals_per_image.gt_classes =gt_classes

gt_boxes = Boxes(

targets_per_image.gt_boxes.tensor.new_zeros((len(sampled_idxs), 4))

)

proposals_per_image.gt_boxes =gt_boxes

2,feature crop and pooling

得到roi之后,根据roi大小,需要选择合适的特征层crop并pooling得到固定大小的feature map,这个过程称为roi align。原始的roi pooling也可以完成这个操作,但是由于计算过程使用取整操作,造成特征粗糙,对小目标检测效果不好,取整操作主要体现在以下两步:将roi边界量化为整数点坐标值,然后再选择合适feature map进行crop。

将crop得到的区域平均分割成 k x k 个单元(bin),在获取每个单元的左右边界时取整

Roi align的步骤及相应代码如下,其中所有操作均为浮点数操作:

detectron2/modeling/roi_heads/roi_heads.py

detectron2/modeling/poolers.py

detectron2/layers/roi_align.py

1)计算rpn得到的ro­i­([x1, y1, x2, y2])在相应的特征层box,即:[x1, y1, x2, y2]/stride。stride为特征图相对输入图像缩小的倍数。

pooler_fmt_boxes= convert_boxes_to_pooler_format(box_lists)

2)特征crop并pooling得到目标大小输出的特征图。

output[inds] =pooler(x_level, pooler_fmt_boxes_level)

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

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

相关文章

多个相同参数表单提交

前情提要: 现在需要使用异步提交表单数据(QueryString方式),但数据个数比较多,一个个拼接比较麻烦,这时可以使用jQuery的方法$("form").serialize()对表单进行序列化。但是如果这时&#xff0c…

简单仿百度自动搜索框

body中 <body> 请输入搜索内容:<input type"text" name"name" value"" id"txt" style"border:1px solid gray;margin:0;padding:0; width:200px;" /></body> View Code<script>中 <script type&…

layui上传文件请求接口异常_SpringMVC实现文件上传与下载,拦截器,异常处理

第一章&#xff1a;响应数据和结果视图1. 返回字符串Controller方法返回字符串可以指定逻辑视图的名称&#xff0c;根据视图解析器为物理视图的地址。RequestMapping(value"/hello")public String sayHello() {System.out.println("Hello SpringMVC!!");//…

球星测试软件,2KOL球星测评丨篮球之神,迈克尔.乔丹(96版)

迈克尔.乔丹(96版)迈克尔乔丹在在1984年NBA选秀中于第1轮第3位被芝加哥公牛队选中。(他的前面两位分别是哈基姆奥拉朱旺和萨姆鲍伊)91-93赛季&#xff0c;乔丹连续2次荣膺常规赛MVP和3次总决赛FMVP &#xff0c;并率领芝加哥公牛队首夺3连冠。 93年10月6日因父亲被害而宣布退役…

iphone无线充电充电测试软件,瞎折腾星人的测评 篇一:想体验iPhone的无线充电?这可能是最具性价比的选择了!...

瞎折腾星人的测评 篇一&#xff1a;想体验iPhone的无线充电&#xff1f;这可能是最具性价比的选择了&#xff01;2018-11-28 00:26:032点赞2收藏0评论最近恰逢更换新手机&#x1f4f1;iPhone XS Max的重大活动&#xff0c;功臣iPhone 7退居二线&#xff0c;女票突然脑子一热要给…

Gson读写JSON 数据

一、创建实体&#xff1b; package com.bo.entity;public class ShiTiInFo {private String shitia; //试题名称private String shitib; //大题名称private String shitic; //小题名称private String shitid; //试题题号private int shitie; //试题小号public String getShitia…

poj 2431

大意&#xff1a; 有n个加油点&#xff0c;给出每个加油点距离终点的位置和能加多少油&#xff0c;最后一行给出总长度和最初的油量。求最少加几次油能到终点&#xff0c;不能到的话输出-1. Sample Input 4 4 4 5 2 11 5 15 10 25 10Sample Output 2分析&#xff1a; 一开始打算…

cts游戏手机版_cts游戏

cts游戏是一款非常逼真的驾驶模拟游戏&#xff0c;它以经典的驾驶和运输为主题&#xff0c;通往不同城市拥有不同的运输路线玩家们可以在驾驶过程中欣赏风景&#xff0c;感受全新的天气变化&#xff0c;当天气不好会影响驾驶&#xff0c;玩家需要小心驾驶。确保货物安全发送到指…

服务器系统server 2008,windows server 2008 R2 操作系统

您好&#xff0c;您的问题解决了吗&#xff1f;如果回复对您有所帮助&#xff0c;请记住将其标记为答案。如果否&#xff0c;请回复并告诉我们当前情况&#xff0c;以便提供进一步的帮助。Best regard,SylviaPlease remember to mark the replies as answers if they help. &qu…

MVC5+EF6 入门完整教程四

MVC5EF6 入门完整教程四 原文:MVC5EF6 入门完整教程四上篇文章主要讲了如何配置EF, 我们回顾下主要过程&#xff1a; 创建Data Model 创建Database Context 创建databaseInitializer配置entityFramework的context配置节。 对这个过程还有疑问的可以去上篇再看一下。 本次我…

android js调试

http://blog.allenm.me/ 其他平台去这篇文章看 1 //js调试调试功能支持4.4版本以上的2 if(Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {3 WebView.setWebContentsDebuggingEnabled(true);4 }5 //j…

python 比赛成绩预测_利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!值得,涨知识了!...

Mika 来源 | 头图 |CSDN自东方IC今天教大家用Python预测英雄联盟比赛胜负。Show me data&#xff0c;用数据说话今天我们聊一聊 Python预测LOL胜负目前&#xff0c;英雄联盟S10全球总决赛正在火热进行中&#xff0c;最终决赛于10月31日在浦东足球场举行。作为当下最火热的电竞赛…

服务器2003蓝屏A5修复,0x000000a5蓝屏完美解决方法 Win7

0x000000a5蓝屏怎么办&#xff1f;在Win7系统下遭遇开机时出现蓝屏代码0x000000a5非常多&#xff0c;由于根据代码我们并不能分析出故障原因&#xff0c;那么只能求助于网络上大家分享的经验了&#xff0c;下面小编给大家分享下0x000000a5蓝屏完美解决方法&#xff0c;适用于Wi…

openfiler与OVM结合过程遇见的问题

1、openfiler利用drbd corosync实现HA&#xff0c;产生2个lun分别给ovm使用。2、openfiler搭建成功后&#xff0c;只输出了一个lun&#xff0c;以至于ovm创建pool的时候发现不了iscsi存储问题原因的寻找过程&#xff1a;因为openfiler产出的为iscsi存储&#xff0c;所以采用isc…

NUI相关术语

分享一下微软资深企业架构师、应用开发专家余涛先生书中所谈到的相关术语&#xff0c;以便查阅&#xff0c;部分术语根据个人理解加入了细化内容&#xff1a; 1、波束形成算法&#xff08;BeamformingAlgorithm&#xff09; 基于现行阵列的阵列信号模型&#xff0c;用于确定在水…

能设值多个rowkey吗_顶楼送了露台,悄悄搭建阳光房,偏偏我家露台多个帽子,能拆吗?...

你们有没有发现现在楼顶上都会有几个这样的“帽子"&#xff0c;呼呼直转&#xff0c;但大多数人并不是很明白这个东西是干嘛用的。昨天有网友私信&#xff1a;小区顶楼露台上这个不锈钢帽子可以加高吗&#xff1f;感觉每次去楼顶都会闻到一股油烟味。业主表示自己是住在顶…

金山云服务器内网带宽,金山云-文档中心-配置弹性网卡

本文为您介绍绑定弹性网卡后虚机中如何配置弹性网卡。挂载辅网卡后&#xff0c;Windows操作系统主机即可正常使用&#xff0c;不需要额外操作。如果实例使用以下几种镜像&#xff0c;则可以跳过网卡手动配置&#xff0c;直接进行路由配置。CentOS 7.6 64位CentOS 7.7 64位CentO…

Atom飞行手册翻译: 2.7 ~ 2.10

自动补全 如果你仍旧希望节约一些打字时间&#xff0c;Atom自带简单的自动补全功能。 通过使用ctrl-space&#xff0c;自动补全工具可以让你看到并插入可选的完整单词。 通常&#xff0c;自动补全工具会浏览当前打开的整个文档&#xff0c;寻找匹配你开始打出来的单词。 如果你…

Flash游戏开发实战(一)

我不得不承认&#xff0c;我不是植物大战僵尸的骨灰玩家&#xff0c;所以&#xff0c;如果你发现这个系列的教程有什么地方错误的&#xff0c;请告诉我。 定义游戏的主要结构 植物大战僵给了我们很好的视觉和感觉上的享受。你得保护你的房子以免被吃脑的僵尸入侵&#xff0c;这…

如何做相册_手机里的照片太多,不得已只能删除?那就试试制作电子相册吧

许多人都喜欢使用手机拍照&#xff0c;这也就导致自己手机相册中保存的照片越来越多&#xff0c;到后面想要再拍照片的话&#xff0c;就不得不删除之前的照片&#xff0c;如何解决这个办法呢&#xff1f;那就试试用【迅捷视频转换器】将其制作成电子相册吧。制作电子相册打开软…