(一) Oriented R-CNN

news2024/11/25 22:47:55

文章目录

    • 0.基础介绍
    • 1.旋转框的中点偏移表示法
    • 2.Oriented R-CNN架构
      • 2.1 Oriented RPN
      • 2.2 Rotated RoI Alignment
    • 参考资料


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


论文:Oriented R-CNN for Object Detection

代码:OBBDetection

西北工业大学的Xingxing Xie等于2021年08月提交到ICCV 2021的论文

0.基础介绍

在这里插入图片描述

与水平检测框不同,旋转检测框会给出对象的minAreaRect,是带角度的物体检测框。结合水平检测框的方法,旋转框检测常用的方法有以下几种。Rotated Region Proposal Network,参考Faster RCNN中提出的RPN,Rotated RPN在每个特征图上使用3种scale,3种ratio,6种angle共计54个锚框。这种方法可以提高对象检测的召回率,但是因引入过多的anchor,譬如在80x80x54的特征图上会生成345600个候选框,会导致占用过多的内存和推理时间。RoI Transformer使用RPN, RoI Alignment and regression来生成Oriented Proposals,这种方法相比Rotated RPN减少了参数量,但依然存在额外的计算量。Oriented RPN,本文提出的方法,使用本文提出的中点偏移Midpoint Offset旋转框表示法,将RPN输出Proposals的位置回归分支由4个变量改成6个变量来生成候选框,相比前两种方法,该方法使用全卷积的RPN,具有更少的运算量。

1.旋转框的中点偏移表示法

在这里插入图片描述

w w w h h h是旋转框的外接矩形框的宽高, x , y x,y x,y是旋转框的外接矩形框的中心的坐标, △ α \triangle \alpha α △ β \triangle \beta β是旋转矩形框顶点偏离中心的距离。旋转矩形框的4个顶点坐标为:

在这里插入图片描述

通过这种表示方式,巧妙的将角度问题表示成了距离,可以使用 L 1 L_1 L1 loss来直接回归,规避了多边形IoU计算的不可导和角度表示时的边界问题。

2.Oriented R-CNN架构

在这里插入图片描述

Oriented R-CNN的整体架构如上图,与Faster R-CNN中的结构基本一样,除了RPN结构位置回归分支输出的回归变量由4个 ( x , y , w , h ) (x,y,w,h) (x,y,w,h)变成了6个 ( x , y , w , h , △ α , △ β ) (x,y,w,h,\triangle \alpha, \triangle \beta) (x,y,w,h,α,β),输出的是Oriented Proposals。在检测头部分根据proposalsRoI Alignment时,因Oriented RPN生成的是旋转的候选框,因此做RoI Align时,需要先对RoI做旋转,因此称之为RotatedRoIAlign

2.1 Oriented RPN

Oriented RPN中使用的仍然是水平anchor,每层特征图上共3个,宽高比分别为 1 : 2 , 1 : 1 , 2 : 1 1:2,1:1,2:1 1:2,1:1,2:1,在 { P 2 , P 3 , P 4 , P 5 , P 6 } \{P_2,P_3,P_4,P_5,P_6\} {P2,P3,P4,P5,P6}上锚框anchor的面积分别为 { 3 2 2 , 6 4 2 , 12 8 2 , 25 6 2 , 12 8 2 } \{32^2,64^2,128^2,256^2,128^2\} {322,642,1282,2562,1282}个像素。

每个anchor使用四维向量表示:

a = ( a x , a y , a w , a h ) a = (a_x,a_y,a_w,a_h) a=(ax,ay,aw,ah)
其中 ( a x , a y ) (a_x,a_y) (ax,ay)表示锚框中心, ( a w , a h ) (a_w,a_h) (aw,ah)表示锚框的宽和高。

Oriented RPN的输出是proposals相对于anchor的偏移量,
δ = ( δ x , δ y , δ w , δ h , δ α , δ β ) \delta = (\delta_x, \delta_y, \delta_w, \delta_h, \delta_{\alpha},\delta_{\beta}) δ=(δx,δy,δw,δh,δα,δβ)
再通过以下公式对回归得到的偏移量解码即可得到proposals:
{ x = a w ⋅ δ x + a x , y = a h ⋅ δ y + a y w = a w ⋅ e δ w , h = a h ⋅ e δ h Δ α = δ α ⋅ w , Δ β = δ β ⋅ h \left\{\begin{matrix} x=a_w \cdot\delta _x+a_x,& y=a_h \cdot\delta _y+a_y\\ w=a_w\cdot e^{\delta _w}, & h=a_h\cdot e^{\delta _h}\\ \Delta\alpha =\delta _\alpha \cdot w, & \Delta\beta =\delta _\beta \cdot h \end{matrix}\right. x=awδx+ax,w=aweδw,Δα=δαw,y=ahδy+ayh=aheδhΔβ=δβh

如旋转框的中点偏移表示法图中所示,公式中的 ( x , y ) (x,y) (x,y)表示proposal的中心, ( w , h ) (w,h) (w,h)表示外接矩形框的宽和高, Δ α \Delta\alpha Δα Δ β \Delta\beta Δβ表示旋转框的偏移量。

既然Oriented RPN的回归分支输出的是bounding box位置的偏移量,因此在网络的训练过程中需要先将输入对应的ground truth boxproposal完成匹配(可以多个proposal对应1个gt box),然后还需要将proposal和对应的gt box编码成偏移量的形式 t i ∗ = ( t x ∗ , t y ∗ , t w ∗ , t h ∗ , t α ∗ , t β ∗ ) t_i^*=(t_x^*,t_y^*,t_w^*,t_h^*,t_{\alpha}^*,t_{\beta}^*) ti=(tx,ty,tw,th,tα,tβ),作为回归分支的目标,编码公式为:

{ t α ∗ = Δ α g / w g , t β ∗ = Δ β g / h g t w ∗ = l o g ( w g / w a ) t h ∗ = l o g ( h g / h a ) t x ∗ = ( x g − x a ) / w a , t y ∗ = ( y g − y a ) / h a \left\{\begin{matrix} t_\alpha^*=\Delta \alpha_g/w_g, & t_\beta^*=\Delta \beta_g/h_g\\ t_w^*=log(w_g/w_a) & t_h^*=log(h_g/h_a)\\ t_x^*=(x_g-x_a)/w_a, & t_y^*=(y_g-y_a)/h_a \end{matrix}\right. tα=Δαg/wg,tw=log(wg/wa)tx=(xgxa)/wa,tβ=Δβg/hgth=log(hg/ha)ty=(ygya)/ha

其中, ( x a , y a , w a , h a ) (x_a,y_a,w_a,h_a) (xa,ya,wa,ha)分别表示水平锚框的中心和宽高, ( x g , y g , w g , h g ) (x_g,y_g,w_g,h_g) (xg,yg,wg,hg)分别表示旋转矩形框外接矩形的中心和宽高, Δ α g \Delta \alpha_g Δαg Δ β g \Delta \beta_g Δβg分别表示旋转矩形框的偏移量。

在以上的介绍中,有两个地方值的注意。一个是label assignment中,是先求ground truth oriented box的外接矩形,然后计算水平anchor和外接矩形的IoU来实现标签匹配的,所以标签匹配依靠的仍然是水平检测框之间的IoU。可以参考MMROTATE中的代码实现:

# mmrotate/models/dense_heads/oriented_rpn_head.py
# line 75-81
gt_hbboxes = obb2xyxy(gt_bboxes, self.version)
assign_result = self.assigner.assign(anchors, gt_hbboxes, gt_bboxes_ignore, None if self.sampling else gt_labels)
sampling_result = self.sampler.sample(assign_result, anchors, gt_hbboxes)

另外一点是,Oriented RPN训练中使用的损失函数,分类使用的交叉熵,回归分支使用的SmoothL1Loss

# configs/oriented_rcnn/oriented_rcnn_r50_fpn_1x_dota_le90.py
loss_cls=dict(type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0),
loss_bbox=dict(type='SmoothL1Loss', beta=0.1111111111111111, loss_weight=1.0)

2.2 Rotated RoI Alignment

本篇文章另外一部分工作主要就在拿到proposals后对RoI的对齐池化上。

Faster R-CNN中使用的RPNMask R-CNN中提出的RoIAlign的介绍可以参考:(六) Region Proposal Network和(五)ROI Pooling 与 ROI Align。

Oriented RPN给出的proposal是带角度的外接矩形,这和水平框的不太一样,要想对Oriented RoIAlignment,需要先将Orientd RoI做一个旋转,然后就可以按照水平的常规RoI来处理了,这就是RotateRoIAlign的全部,如下图所示:

在这里插入图片描述

这里有一点需要注意,通过回归 Δ α \Delta \alpha Δα Δ β \Delta \beta Δβ得出的旋转框,很有可能是平行四边形而非矩形,因此在算得 Δ α , Δ β \Delta \alpha,\Delta \beta Δα,Δβ后,还需进行一个简单的处理,即将平行四边形的短对角线拉长到和长对角线一样长,即将旋转平行四边形变换成旋转矩形。

在这里插入图片描述

关于RotatedRoIAlign的实现可以参考官方仓库,

template <typename T>
void pre_calc_for_bilinear_interpolate(
    const int height,
    const int width,
    const int pooled_height,
    const int pooled_width,
    const int iy_upper,
    const int ix_upper,
    T roi_start_h,
    T roi_start_w,
    T bin_size_h,
    T bin_size_w,
    int roi_bin_grid_h,
    int roi_bin_grid_w,
    T roi_center_h,
    T roi_center_w,
    T cos_theta,
    T sin_theta,
    std::vector<PreCalc<T>>& pre_calc) {
  int pre_calc_index = 0;
  for (int ph = 0; ph < pooled_height; ph++) {
    for (int pw = 0; pw < pooled_width; pw++) {
      for (int iy = 0; iy < iy_upper; iy++) {
        const T yy = roi_start_h + ph * bin_size_h +
            static_cast<T>(iy + .5f) * bin_size_h /
                static_cast<T>(roi_bin_grid_h); // e.g., 0.5, 1.5
        for (int ix = 0; ix < ix_upper; ix++) {
          const T xx = roi_start_w + pw * bin_size_w +
              static_cast<T>(ix + .5f) * bin_size_w /
                  static_cast<T>(roi_bin_grid_w);

          // Rotate by theta around the center and translate
          // In image space, (y, x) is the order for Right Handed System,
          // and this is essentially multiplying the point by a rotation matrix
          // to rotate it counterclockwise through angle theta.
          T y = yy * cos_theta - xx * sin_theta + roi_center_h;
          T x = yy * sin_theta + xx * cos_theta + roi_center_w;
          // deal with: inverse elements are out of feature map boundary
          if (y < -1.0 || y > height || x < -1.0 || x > width) {
            // empty
            PreCalc<T> pc;
            pc.pos1 = 0;
            pc.pos2 = 0;
            pc.pos3 = 0;
            pc.pos4 = 0;
            pc.w1 = 0;
            pc.w2 = 0;
            pc.w3 = 0;
            pc.w4 = 0;
            pre_calc[pre_calc_index] = pc;
            pre_calc_index += 1;
            continue;
          }

          if (y < 0) {
            y = 0;
          }
          if (x < 0) {
            x = 0;
          }

          int y_low = (int)y;
          int x_low = (int)x;
          int y_high;
          int x_high;

          if (y_low >= height - 1) {
            y_high = y_low = height - 1;
            y = (T)y_low;
          } else {
            y_high = y_low + 1;
          }

          if (x_low >= width - 1) {
            x_high = x_low = width - 1;
            x = (T)x_low;
          } else {
            x_high = x_low + 1;
          }

          T ly = y - y_low;
          T lx = x - x_low;
          T hy = 1. - ly, hx = 1. - lx;
          T w1 = hy * hx, w2 = hy * lx, w3 = ly * hx, w4 = ly * lx;

          // save weights and indices
          PreCalc<T> pc;
          pc.pos1 = y_low * width + x_low;
          pc.pos2 = y_low * width + x_high;
          pc.pos3 = y_high * width + x_low;
          pc.pos4 = y_high * width + x_high;
          pc.w1 = w1;
          pc.w2 = w2;
          pc.w3 = w3;
          pc.w4 = w4;
          pre_calc[pre_calc_index] = pc;

          pre_calc_index += 1;
        }
      }
    }
  }
}

参考资料

  • 1.Oriented R-CNN for Object Detection
  • 2.https://github.com/open-mmlab/mmrotate

欢迎访问个人网络日志🌹🌹知行空间🌹🌹


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

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

相关文章

Erlang - 入门之一日志系统如何打印输出使用lager框架

在合适的地方插入一句代码即可&#xff1a; lager:error("Some Message"), 就这样&#xff0c;谢谢阅读 。。。。。。。 。。。。。。。。。 。。。。。。。。。。。 。。。。。。。。。。。。。。 。。。。。。。。。。。。。。。。。 没有什么比从直接“”…

web前端网页课程设计大作业 html+css+javascript天津旅游(11页) dw静态旅游网页设计实例 企业网站制作

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

草料二维码如何在多行业实现管理和自动化工作

二维码&#xff0c;在我们的日常生活中随处可见&#xff0c;不管是我们常用的微信支付&#xff0c;还是日常出入的场所码&#xff0c;已经渗透在我们生活的点点滴滴中。 如果我们自己也希望通过二维码&#xff0c;来传达文字、数据等信息&#xff0c;那么很多人都肯定给你推荐…

NS3笔记

NS3笔记1 Docker环境配置1.1 Docker安装1.2 镜像安装1.3 安装其他软件1.4 安装ns31 Docker环境配置 1.1 Docker安装 俺是macOS&#xff0c;直接参考这个网址。 1.2 镜像安装 俺打算安装Ubuntu18.04&#xff0c;镜像版本可以Ubuntu 镜像库 # 拉取镜像 docker pull ubuntu:18…

深入理解可升级智能合约

准备 为了理解可升级合约&#xff0c;必须理解proxy机制&#xff0c;要理解proxy机制&#xff0c;必须理解solidity的sstore和sload,以及关于以太坊架构和存储结构&#xff08;数据结构&#xff09;。 关于Solidity中的sstore和sload深入理解&#xff1a; 非常好的一篇剖析&…

SAP ABAP 散装笔记20220825

SAP ABAP 散装笔记20220825 引言&#xff1a; 散装笔记的标题系列中记录了我常用、备忘、易错的知识点。 关键字&#xff1a;SAP ABAP 散装笔记 知识点 文章目录SAP ABAP 散装笔记202208251. 获取域值和域值描述的两种方式2. 打开新的会话窗口&#xff08;并执行可能的事务码…

西妥昔单抗丨艾美捷西妥昔单抗Cetuximab方案

西妥昔单抗Cetuximab是针对人表皮生长因子受体的一种单克隆抗体&#xff0c;主要作用就是与表皮生长因子受体结合&#xff0c;阻断表皮生长因子受体与其它配体的结合而达到抗肿瘤的目的。各种恶性肿瘤细胞&#xff0c;例如直肠癌细胞、胃癌细胞&#xff0c;表面都高表达表皮生长…

WebStorm pull(拉取)项目commit(提交)、push(推送)代码

1.打开WebStrom&#xff0c;找到Git---克隆... 2.输入需要克隆的项目地址&#xff0c;将其项目克隆下来 3.pull&#xff08;拉取&#xff09;、commit&#xff08;提交&#xff09;、push&#xff08;推送&#xff09; 4.在你本地新建一个和你git分支一样名字的分支 5.改完代码…

Eslint

1. 配置文件 配置文件由很多种写法&#xff1a; .eslintrc.*&#xff1a;新建文件&#xff0c;位于项目根目录 .eslintrc.eslintrc.js.eslintrc.json区别在于配置格式不一样package.json 中 eslintConfig&#xff1a;不需要创建文件&#xff0c;在原有文件基础上写。 2. 具体…

什么是Python?Python有什么特性?

什么是Python&#xff0c;相信第一次接触Python的同学会有一些疑问。我们通过百度百科得到Python的定义为&#xff1a;   Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本&#xff…

UDS入门至精通系列:诊断时间参数

文章目录 前言一、诊断时间参数 P2二、诊断时间参数 P2*三、诊断时间参数 S3四、上述参数在应用中的汇总总结前言 在职场中,对于自己领导吩咐的事情,事事有响应,是你在领导面前彰显自己能力的机会。并且这其中的响应时间就是你职业能力的时刻。 同样在汽车电子诊断领域,因…

忆享科技受邀亮相CIS2022网络安全创新大会

12月14日&#xff0c;忆享科技受邀亮相第八届网络安全创新大会&#xff08;简称“CIS”&#xff09;多维时空专场&#xff0c;与行业内资深专家及众多头部企业交流对话&#xff0c;深度了解网络安全行业新理念、新技术、新思路和新实践&#xff0c;共同探讨行业技术创新与突破。…

Java+Swing实现的五子棋游戏

JavaSwing实现的五子棋游戏一、系统介绍二、功能展示1.游戏展示三、系统实现1.ChessFrame .java四、其它1.其他系统实现2.获取源码一、系统介绍 五子棋游戏实现人机对战、人人对战两个模式。 二、功能展示 1.游戏展示 三、系统实现 1.ChessFrame .java package five;impor…

【图像处理】图像拼接原理介绍

问题 图像拼接是图像处理的基础之一&#xff0c;虽然自己并没有直接做图像拼接方面的研究&#xff0c;但在面试中却多次被问到这方面的内容&#xff0c;可见这个知识点还是很重要的。事实上&#xff0c;很多场景都会用到图像拼接的知识&#xff0c;例如运动检测与跟踪、游戏画…

HJL-E6/A DC220V数字式【电流继电器】

1&#xff0e;用途 HJL系列数字式交流电流继电器为瞬时动作特性&#xff0c;用于发电机&#xff0c;变压器和输电线路的过负荷和短路保护&#xff0c;作为启动元件。 2&#xff0e;安装结构 导轨安装9&#xff0c;导轨安装E 两种壳体尺寸&#xff0c;具体尺寸请参考外型尺寸…

Spark 3.0 - 12.ML GBDT 梯度提升树理论与实战

目录 一.引言 二.GBDT 理论 1.集成学习 2.分类 & 回归问题 3.梯度提升 4.GBDT 生成 三.GBDT 实战 1.数据准备 2.构建 GBDT Pipeline 3.预测与评估 四.总结 一.引言 关于决策树前面已经介绍了常规决策树与随机森林两种类型的知识&#xff0c;本文主要介绍梯度提…

小游戏赛道如何加速流量增长?

小游戏是指设计极简的轻量级游戏。它构造简单&#xff0c;但却给人带来了娱乐性和重复参与的欲望。 近年来&#xff0c;小游戏在抖音、微信小游戏等平台拥有着疯狂裂变的可能性&#xff0c;出现了例如“羊了个羊”“跳一跳”、“合成大西瓜”等风靡一时的小游戏。 这些爆火的小…

「微服务系列」统一网关Gateway

为什么需要网关 网关功能&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流在SpringCloud中网关的实现包括两种&#xff1a; Zuul&#xff1a;基于Servlet的实现&#xff0c;属于阻塞式编程。SpringCloudGateway&#xff1a;是基于Spring5中提供的WebFlux&#xf…

关注渐冻症|菌群助力探索其发病机理及相关干预措施

最杰出的物理学家之一的斯蒂芬威廉霍金想必大家都知道&#xff0c;以及曾经风靡全网的“冰桶挑战”&#xff0c;它们都与一种罕见疾病有关&#xff0c;那就是渐冻症。 媒体的宣传让渐冻症成为了较为“知名”罕见病之一&#xff1b;2000年丹麦举行的国际病友大会上正式确定6月21…

【Redis】数据类型操作二 (Set/Hash/Zset)

文章目录3、Redis集合(Set)4、 Redis哈希(Hash)5、Redis有序集合Zset(sorted set)实操3、Redis集合(Set)4、 Redis哈希(Hash)5、Redis有序集合Zset(sorted set)3、Redis集合(Set) Redis Set 是String类型的无序集合。一个key集合可以对应多个value元素。Redis Set 可以自动排重…