查看原文
其他

【强基固本】关于旋转框定义的一些理解和感想



“强基固本,行稳致远”,科学研究离不开理论基础,人工智能学科更是需要数学、物理、神经科学等基础学科提供有力支撑,为了紧扣时代脉搏,我们推出“强基固本”专栏,讲解AI领域的基础知识,为你的科研学习提供助力,夯实理论基础,提升原始创新能力,敬请关注。

来源:知乎—yangxue

地址:https://zhuanlan.zhihu.com/p/459018810


01

前言
最近在搭建MMRotate时发现目前不同旋转检测代码的旋转框表示形式不尽相同,因此想对这些表示形式做一些总结,包括具体的定义方式以及相关的转换关系。最后就如何检测器设计回归损失发表一些自己的理解。

02

旋转变换
实际上,旋转框既可以由水平框绕在中心点顺时针旋转得到,也可以由水平框绕在中心点逆时针旋转得到。旋转方向和坐标系的选择密切相关。图像空间采用右手坐标系    ,其中    轴 是上->下,    轴是左->右。此时存在2种相反的旋转方向。
顺时针(CW)
  • CW示意图
  • CW的旋转矩阵
  • CW的旋转变换
逆时针(CCW)
  • CCW的示意图
  • CCW的旋转矩阵
  • CCW的旋转变换
注:在MMCV中可以设置旋转方向的算子有:box_iou_rotated (默认为CW),nms_rotated (默认为CW),RoIAlignRotated (默认为CCW),RiRoIAlignRotated (默认为CCW)。


03

旋转框的定义方式
进入正题,我们以下一CW为例,即逆时针负角度,顺时针正角度。我收集了开源社区里比较常用的几种旋转框定义。根据角度定义方式,主要还是OpenCV定义法和长边定义法 ,但是里面还有一些细分,一共四种,介绍如下:

3.1 OpenCV旧版本定义法   

OpenCV在版本4.5.1之前,表示形式为    ,示意图如下:
角度的由    与    轴所成的负的锐角或者直角。

3.2 OpenCV新版本定义法   

不知道为什么,OpenCV在版本4.5.1之后修改了角度定义范围,变成了由    与  轴所成的正的锐角或者直角。表示形式为    ,示意图如下:
需要注意的是除了角度变成正的,定义域的闭集方向从原来的左边变成了右边。

3.3 长边定义法   

顾名思义,该类定义法的角度由长边和    轴所决定,但是目前开源社区存在多种取值范围。第一种表示形式为    ,示意图如下:

3.4 长边定义法   

可能是考虑到处于   的目标太多,作为边界位置不太合适,有些代码(最早可能是RRPN)采用的表示形式是    ,示意图如下:


04

表示法之间的转换关系
管定义略有区别,不同表示法之间其实是可以相互转换的。

4.1    和    之间的相互转换

这里要注意的是两者的闭集位置进行了调换,所以在边界角度处的转换和非边界角度处的转换越有所不同。
示意图如下:

4.2    和    之间的相互转换

示意图如下:

4.3    和    之间的相互转换

示意图如下:


05

总结
上面只列了三种转换关系,未列的可以通过这三个进行多步转换或者有兴趣的可以自己总结一下转换关系。不管是哪个表示法的转换,我们可以发现当需要进行变换操作的时候一般是这两种:
  • 边进行交换,同时角度加减 
  • 边不交换,角度加减 
这就很有意思,熟悉GWD论文的朋友可能也回想起不同定义法下的边界问题好像也是这两个关系。我们再来回顾一下为什么高斯建模可以统一不同的定义法和边界问题:
红框中是协方差 中三种不同的元素,这三个元素有一个共同的特点就是经过上面两种变换前后还是相同的,所以高斯建模的优势就在于此。之所以需要三个,那是因为这里有三个参数。抛开高斯分布这个框架,我们是不是可以自己先构造三个这样性质的不同组合,通过直接回归这些参数组合而不是采用GWD和KLD也能成功。
如果再思考得深入一点,我们发现对于不同的表示方式,它们计算IoU的代码其实都是通用的。这是为什么呢?因为IoU的计算过程是和第2节讲的旋转变换有关。在框的旋转过程中我们是不需要考虑旋转角度是怎么定义的,也就不需要担心变换之后是否超过定义范围,逆时针旋转5度对应的就是原始角度减去5度。检测器的参数回归也是这么做的,即使在解码中出现了我们所说的边界问题,其本质还是一个正常的旋转变换。边界问题是针对某一个确定的表示法来说的,因此如果使用IoU损失这种不用考虑框表示方式的损失函数来优化检测器就能完全不用在意边界问题。相同的,高斯建模中的协方差 也存在旋转变换,基于它的回归损失同样不需要考虑定义方式和边界问题。我暂将这种回归损失称为表示方式无关和边界问题免疫。
因此在设计旋转检测器过程中,表示法的作用应该局限于给初始候选框(如anchor)一个初始的表示形式,不能参与回归损失的计算,否则不同表示法和边界问题都会对检测器的优化带来影响,即回归损失应该是表示方式无关和边界问题免疫的。
PS: 可能有点不好理解,表达能力有限,我也还在思考如何表达更加精准,如果有更好的表述以后再更新,也欢迎大家讨论。另外我们会和MMLab联合推出新的旋转检测框架MMRotate,大概会在年后开源,节前就不给大家增加学习负担了,提前祝大家新年快乐~

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“源头活水”历史文章


更多源头活水专栏文章,

请点击文章底部“阅读原文”查看



分享、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存