【论文阅读笔记】faster rcnn 代码阅读细节
faster rcnn细节
- bounding box regression原理
- 理论
- faster rcnn
- 代码
- box_coder.py
参考: https://zhuanlan.zhihu.com/p/31426458
https://www.cnblogs.com/dudumiaomiao/p/6560841.html
bounding box regression原理
如图所示绿色框为飞机的Ground Truth(GT),红色为提取的positive anchors,即便红色的框被分类器识别为飞机,但是由于红色的框定位不准,这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调,使得positive anchors和GT更加接近。
理论
对于窗口一般使用四维向量(x,y,w,h)(x,y,w,h)(x,y,w,h)表示,分别表示窗口的中心点坐标和宽高。
对下图,红色的框A代表原始的positive Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G’,即:
- 给定anchor A=(Ax,Ay,Aw,Ah)A=(A_x,A_y,A_w,A_h)A=(Ax,Ay,Aw,Ah)和GT G=[Gx,Gy,Gw,Gh]G=[G_x,G_y,G_w,G_h]G=[Gx,Gy,Gw,Gh]
- 寻找一种变换F,使得F(Ax,Ay,Aw,Ah)=(Gx‘,Gy‘,Gw‘,Gh‘)F(A_x,A_y,A_w,A_h)=(G^‘_x,G^‘_y,G^‘_w,G^‘_h)F(Ax,Ay,Aw,Ah)=(Gx‘,Gy‘,Gw‘,Gh‘),其中(Gx‘,Gy‘,Gw‘,Gh‘)≈(Gx,Gy,Gw,Gh)(G^‘_x,G^‘_y,G^‘_w,G^‘_h)≈(G_x,G_y,G_w,G_h)(Gx‘,Gy‘,Gw‘,Gh‘)≈(Gx,Gy,Gw,Gh)
那么这个变换F应该怎么寻找呢,比较简单的思路就是先做平移再做缩放 - 先做平移
- 再做缩放
观察上面4个公式发现,需要学习的是 dx(A),dy(A),dw(A),dh(A)d_x(A),d_y(A),d_w(A),d_h(A)dx(A),dy(A),dw(A),dh(A)这四个变换。当输入的anchor A与GT相差较小时,可以认为这种变换是一种线性变换, 那么就可以用线性回归来建模对窗口进行微调(注意,只有当anchors A和GT比较接近时,才能使用线性回归模型,否则就是复杂的非线性问题了。
接下来的问题就是如何通过线性回归获得dx(A),dy(A),dw(A),dh(A)d_x(A),d_y(A),d_w(A),d_h(A)dx(A),dy(A),dw(A),dh(A)。
线性回归就是给定输入的特征向量X, 学习一组参数W, 使得经过线性回归后的值跟真实值Y非常接近,即Y=WXY=WXY=WX。
对于该问题,输入X是cnn feature map,定义为Φ;同时还有训练传入A与GT之间的变换量,即tx,ty,tw,tht_x,t_y,t_w,t_htx,ty,tw,th。输出是dx(A),dy(A),dw(A),dh(A)d_x(A),d_y(A),d_w(A),d_h(A)dx(A),dy(A),dw(A),dh(A)四个变换。那么目标函数可以表示为:
其中 Φ(A)是对应anchor的feature map组成的特征向量, W∗W_*W∗是需要学习的参数, d∗(A)d_*(A)d∗(A)是得到的预测值(*表示 x,y,w,h,也就是每一个变换对应一个上述目标函数)。
为了让预测值d∗(A)d_*(A)d∗(A)与真实值 t∗t_*t∗ 差距最小,设计L1损失函数:
函数优化目标为
为了方便描述,这里以L1损失为例介绍,而真实情况中一般使用soomth-L1损失。
需要说明,只有在GT与需要回归框位置比较接近时,才可近似认为上述线性变换成立。
faster rcnn
说完原理,对应于Faster RCNN原文,positive anchor与ground truth之间的平移量 (tx,ty)(t_x,t_y)(tx,ty) 与尺度因子tw,tht_w,t_htw,th如下:
对于训练bouding box regression网络回归分支,输入是cnn feature Φ,监督信号是Anchor与GT的差距 tx,ty,tw,tht_x,t_y,t_w,t_htx,ty,tw,th,即训练目标是:输入 Φ的情况下使网络输出与监督信号尽可能接近。那么当bouding box regression工作时,再输入Φ时,回归网络分支的输出就是每个Anchor的平移量和变换尺度 tx,ty,tw,tht_x,t_y,t_w,t_htx,ty,tw,th,显然即可用来修正Anchor位置了。
代码
box_coder.py
/home/flora/maskrcnn-benchmark/maskrcnn_benchmark/modeling/box_coder.py
box_coder.py的decode过程中,我们可以看到通过对anchor A进行平移和缩放得到修正后的预测框G’G^’G’的过程
def decode(self, rel_codes, boxes):"""From a set of original boxes and encoded relative box offsets,get the decoded boxes.Arguments:rel_codes (Tensor): encoded boxesboxes (Tensor): reference boxes."""#rel_codes.size()(box_regression) torch.Size([4000, 4])#boxes.size()(concat_anchors) torch.Size([4000, 4]) boxes = boxes.to(rel_codes.dtype) #把anchors也转成浮点数torch.float32#anchors的宽高和中心点TO_REMOVE = 1 # TODO removewidths = boxes[:, 2] - boxes[:, 0] + TO_REMOVE #x2-x1 torch.Size([4000])heights = boxes[:, 3] - boxes[:, 1] + TO_REMOVE #y2-y1ctr_x = boxes[:, 0] + 0.5 * widthsctr_y = boxes[:, 1] + 0.5 * heightswx, wy, ww, wh = self.weights ##(1.0, 1.0, 1.0, 1.0)dx = rel_codes[:, 0::4] / wx #rel_codes的第0列dy = rel_codes[:, 1::4] / wy #rel_codes的第1列dw = rel_codes[:, 2::4] / ww #rel_codes的第2列dh = rel_codes[:, 3::4] / wh #rel_codes的第3列# Prevent sending too large values into torch.exp()dw = torch.clamp(dw, max=self.bbox_xform_clip) ##self.bbox_xform_clip4.135166556742356dh = torch.clamp(dh, max=self.bbox_xform_clip)#对anchor进行微调,使positive anchors与GT更加接近#先做平移pred_ctr_x = dx * widths[:, None] + ctr_x[:, None]pred_ctr_y = dy * heights[:, None] + ctr_y[:, None]#再做缩放pred_w = torch.exp(dw) * widths[:, None]pred_h = torch.exp(dh) * heights[:, None]#得到预测框的值(x1,y1,x2,y2)pred_boxes = torch.zeros_like(rel_codes)# x1pred_boxes[:, 0::4] = pred_ctr_x - 0.5 * pred_w# y1pred_boxes[:, 1::4] = pred_ctr_y - 0.5 * pred_h# x2 (note: "- 1" is correct; don't be fooled by the asymmetry)pred_boxes[:, 2::4] = pred_ctr_x + 0.5 * pred_w - 1# y2 (note: "- 1" is correct; don't be fooled by the asymmetry)pred_boxes[:, 3::4] = pred_ctr_y + 0.5 * pred_h - 1#torch.Size([4000, 4])return pred_boxes
【论文阅读笔记】faster rcnn 代码阅读细节相关推荐
- 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(八)—— 模型训练-训练
系列目录: 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(一)--数据 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(二)-- 介绍及分词 菜鸟笔记-DuReader阅读理解基线模 ...
- 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(九)—— 预测与校验
系列目录: 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(一)--数据 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(二)-- 介绍及分词 菜鸟笔记-DuReader阅读理解基线模 ...
- Faster RCNN代码详解(五):关于检测网络(Fast RCNN)的proposal
在Faster RCNN代码详解(二):网络结构构建中介绍了Faster RCNN算法的网络结构,其中有一个用于生成ROI proposal target的自定义层,该自定义层的输出作为检测网络(Fa ...
- 【论文解读】Faster R-CNN 实时目标检测
前言 Faster R-CNN 的亮点是使用RPN来提取候选框:RPN全称是Region Proposal Network,也可理解为区域生成网络,或区域候选网络:它是用来提取候选框的.RPN特点是耗 ...
- 【推荐系统多任务学习 MTL】PLE论文精读笔记(含代码实现)
论文地址: Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized ...
- Faster RCNN代码详解(六):自定义评价函数
在前面几篇博文中基本上将Faster RCNN的算法细节都介绍完了,这一篇博客主要来介绍评价函数.自定义评价函数有助于我们灵活观察模型训练过程中的变量变化情况,比如RPN网络中的分类和回归损失在每次迭 ...
- [论文阅读笔记36]CASREL代码运行记录
<[论文阅读笔记33]CASREL:基于标注与bert的实体与关系抽取>https://blog.csdn.net/ld326/article/details/116465089 总的来说 ...
- 收藏 | 万字长文带你理解Pytorch官方Faster RCNN代码
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者丨白裳@知乎 来源丨https://zhuanlan.z ...
- 你真的理解Faster RCNN吗?捋一捋Pytorch官方Faster RCNN代码
作者丨白裳@知乎 来源丨https://zhuanlan.zhihu.com/p/145842317 编辑丨极市平台 目前 pytorch 已经在 torchvision 模块集成了 FasterRC ...
最新文章
- Android-Spinner下拉列表Demo
- Codeforces Round #383 D
- 详解虚函数的实现过程之虚基类(4)
- 设计模式--简单工厂(个人笔记)
- 操作系统复习笔记 05 Thread 线程
- 计算机上没有启动程序怎么办,Win7开机不加载启动项怎么办
- mysql 替代like_mysql用instr替代like查询
- python web开发 网络编程 TCP/IP UDP协议
- 路由技术(来自百度百科)
- 计算机基础技能应用查询中心,计算机基础应用教程
- 无敌大奉献:iOS技术开发知识整理
- [原创].关于SD卡的隐藏分区的认识过程及结果
- PPT设计制作与美化
- 伍斯特学院计算机专业排名,美国大学计算机专业排名!
- ios系统怎么编辑html,word转html ios 可编辑
- FOTOO-疫情下,企业如何线上组织活动,输出企业文化
- SQL-按日期不间断统计
- Bootstrap4总结(3)
- 利用秀米的SVG布局的穿透功能实现横屏长图互动原理+教程
- Linux系统使用ie浏览器,Ubuntu Linux系统上安装IE浏览器的方法