[CV] Rotated IoU 计算旋转矩形之间的重叠面积
文章目录
简介
在目标检测的领域,基于Anchor的方法需要对Anchor分配正负样本的标签。通常,对于axis-aligned的anchor和ground truth,可以直接通过 [top left right down]
四个值计算他们之间的重叠面积。但是针对于旋转的矩形框,这个问题就变得尤为复杂。
我参考了3D目标检测论文SECOND的源码,来尝试解释一下如何计算旋转包围盒的重叠面积。
代码全部来自second.pytorch这个项目的早期版本,去掉了numba/cuda加速的代码。
旋转包围盒的编码方式
作者代码使用了两种方式
- 通过包围盒中心点位置,尺度以及角度来编码
rbbox
rbbox = [x, y, x_d (w), y_d (h), angle]
- 通过包围盒的顶点
corners
来编码
矢量的旋转公式
将矢量看作列矢量 α ⃗ ∈ R 2 × 1 \vec{\alpha}\in \mathbb R^{2\times1} α∈R2×1, 则将其逆时针旋转 θ \theta θ 之后的矢量为:
[ cos θ − sin θ sin θ cos θ ] α ⃗ \begin{bmatrix}\cos\theta&-\sin\theta\\ \sin\theta & \cos\theta\end{bmatrix}\vec{\alpha} [cosθsinθ−sinθcosθ]α
包围盒转化为角点

如图,rbbox
为绿色的包围盒,是原始黑色包围盒通过逆时针旋转 θ \theta θ角度得到。分析 A ’ A’ A’ 的真实坐标:
首先向量 O A → \overrightarrow{OA} OA 被表示为
O A → = [ − x d 2 , − y d 2 ] T \overrightarrow{OA} = [-\frac{x_d}{2}, -\frac{y_d}{2}]^T OA=[−2xd,−2yd]T
旋转后的向量可以被表示为
O A ′ → = T θ O A → = [ cos θ ⋅ − x d 2 − sin θ − y d 2 sin θ − x d 2 + cos θ − y d 2 ] \overrightarrow{OA'} = T_\theta\overrightarrow{OA} = \begin{bmatrix} \cos\theta\cdot\frac{-x_d}{2} -\sin\theta\frac{-y_d}{2}\\ \sin\theta \frac{-x_d}{2} + \cos\theta\frac{-y_d}{2}\end{bmatrix} OA′=TθOA=[cosθ⋅2−xd−sinθ2−ydsinθ2−xd+cosθ2−yd]
通过 A ’ = O + O A ’ → A’ = O + \overrightarrow{OA’} A’=O+OA’ 恢复顶点的坐标即可。
代码表示
下段代码将[x, y, x_d, y_d, angle]
转化为顺时针方方向表示的顶点坐标[x0, y0, x1, y1, x2, y2, x3, y3]
import math
def rbbox_to_corners(rbbox):
# generate clockwise corners and rotate it clockwise
# 顺时针方向返回角点位置
cx, cy, x_d, y_d, angle = rbbox
a_cos = math.cos(angle)
a_sin = math.sin(angle)
corners_x = [-x_d / 2, -x_d / 2, x_d / 2, x_d / 2]
corners_y = [-y_d / 2, y_d / 2, y_d / 2, -y_d / 2]
corners = [0] * 8
for i in range(4):
corners[2 *
i] = a_cos * corners_x[i] + \
a_sin * corners_y[i] + cx
corners[2 * i +
1] = -a_sin * corners_x[i] + \
a_cos * corners_y[i] + cy
return corners
测试一下结果:
rbbox = [0, 0, 2, 4, math.pi / 2]
corners = rbbox_to_corners(rbbox)
print([round(_) for _ in corners])
# [-2, 1, 2, 1, 2, -1, -2, -1]
相交区域的特点
两个四边形(矩形),求交叠面积,可以先求出相交的多边形(Polygon)的顶点, 构成多边形的顶点可由两种类型的点构成:
- 原始四边形的顶点
- 四边形的边相交产生的交点
对应问题为:
- 判断点在四边形内
- 判断线段的交点
点在四边形(矩形)内
如图所示,四边形(矩形)通过ABCD
四个顶点表示,可以使用较强的规则判断P
在矩形内,即AP
在AB
的投影在线段AB
上,在AD
的投影在线段AD
上。

点积的物理意义
两个矢量的点积是标量,点积满足交换律:
- 矢量的模被定义为 ∣ a ∣ = a ⋅ a |a|=\sqrt{a\cdot a} ∣a∣=a⋅a
- a ⋅ b = ∣ a ∣