论文阅读笔记:Phase-Shifting Coder: Predicting Accurate Orientation in Oriented Object Detection
论文:https://arxiv.org/pdf/2211.06368v2.pdf
代码:https://github.com/open-mmlab/mmrotate
1 背景
1.1 问题
目前,围绕旋转目标检测的解决方案,最直观的方式是增加一个输出通道预测方向角度来修改水平检测器。这样的解决方案面临两个问题:
-
边界问题:边界不连续问题往往是由角周期性引起的。假设 − π / 2 -\pi/2 −π/2 等价于 π / 2 \pi/2 π/2。面对相同的输入,网络输出有时期望为 − π / 2 -\pi/2 −π/2 有时期望为 π / 2 \pi/2 π/2。这样的现状使得网络迷茫到底以何种方式回归。
-
类方形问题:类正方形问题通常发生在方型框不能唯一定义的情况。具体来说,一个正方形框旋转0°和旋转90°是相当的,但由于角度参数的不一致,导致他们之间的回归损失较高。这种模糊型也会严重混淆网络。
1.2 解决方案
通过对上述问题的重新思考,作者发现他们本质上可以统一为旋转对称问题(180°旋转下的边界和90°旋转下的类方向),这光学测量中绝对相位获取的周期性模糊问题十分相似。受此启发,我们提出了移动相移编码这一光学测量中广泛使用的技术来进行旋转目标检测中的角度预测。该技术具有同时解决不连续和类方形问题的潜力:
-
相移将测量的距离或视差编码为光学测量中的周期相位,旋转角度也可以编码到周期相位中。边界不连续性因此得到解决。
-
相移也存在周期性的模糊问题,类似于类正方形问题,存在多个解。例如双频相移技术通过混合不同频率的相位来解决周期性模糊问题,该过程也叫相位展开。
基于以上分析,作者认为可以修改相移技术使其适用于旋转目标检测。
2 创新点
-
首次利用相移编码器来应对深度学习领域中的角度回归问题。本文详细阐述了一种积分稳定的解决方案。最重要的是,代码编写良好,公开可用,并且具有可重复性的结果。
-
通过大量实验对所提方法的性能进行评估。实验结果是高质量的,所有列出的结果都在相同的环境下重新测试,以确保公平的比较(而不是抄自其他论文)。
3 方法
本文整体框架,即用相移编码器来代替传统的角度预测。
4 模块
4.1 相移编码PSC
集成到深度学习神经网络中的相移编码器的整体流程如图1所示,以“长边90°”的角度定义为例进行说明,符号可定义如下:
-
θ \theta θ:旋转角度,范围在 [ − π / 2 , π / 2 ) [-\pi/2,\pi/2) [−π/2,π/2)
-
ϕ \phi ϕ:主相位,范围在 [ − π , π ) [-\pi,\pi) [−π,π)
-
N s t e p N_{step} Nstep:相移步数
-
X X X:编码数据, X = { x n ∣ n = 1 , 2 , … , N s t e p } X=\{x_n|n=1,2,…,N_{step}\} X={ xn∣n=1,2,…,Nstep}
映射:sin 或 cos 的周期为 2 π 2\pi 2π,而一个矩形框在旋转 π \pi π 时与自身相同,因此需要一个映射来匹配他们,如下所示:
编码:将 ϕ \phi ϕ 编码成 X X X 的公式可以描述为:
其中 n = 1 , 2 , … , N s t e p n=1,2,…,N_{step} n=1,2,…,Nstep。
为了简化后面的描述,令式2记为 X = f e n c ( ϕ ) X=f_{enc}(\phi) X=fenc(ϕ)。
解码:从 X X X 中解码 ϕ \phi ϕ 的公式可以描述为:
公式中的arctan由arctan2函数实现。公式(3)也记为 ϕ = f d e c ( x ) \phi=f_{dec}(x) ϕ=fdec(x)。
目的是将存在断点的分段函数转换到连续的余弦函数上,并将周期映射到[0, 2π]上,接触边界问题。多步相移是为了解决统一余弦值在周期内有多个解的问题。
4.2 双频相移编码PSCD
通过对边界问题和类方形问题的重新思考,作者认为这两个问题可以内在的统一起来,如果一个框旋转180°情况下与自身等价,则会出现边界问题,但如果他们在90°下旋转等价,则会出现类方形问题,这两种情况都是周期模糊问题,但周期不同。
因此,为了同时解决边界不连续和类方形问题,需要额外的相位来建立双频相移编码器。基本相移编码器与双频相移编码器区别如图2。
双频相移编码器中使用的额外符号可以定义如下:
-
ϕ 1 \phi_1 ϕ1:第一个频率下的相位,范围在 [ − π , π ) [-\pi,\pi) [−π,π)
-
ϕ 2 \phi_2 ϕ2:第二个频率下的相位,范围在 [ − 2 π , 2 π ) [-2\pi,2\pi) [−2π,2π)
-
ϕ \phi ϕ:最终的主相位,范围在 [ − π , π ) [-\pi,\pi) [−π,π)
-
X 1 X_1 X1:第一个频率下的编码数据, X 1 = { x n ∣ n = 1 , 2 , … , N s t e p } X_1=\{x_n|n=1,2,…,N_{step}\} X1={ xn∣n=1,2,…,Nstep}
-
X 2 X_2 X2:第二个频率下的编码数据, X 2 = { x n ∣ n = 1 , 2 , … , N s t e p } X_2=\{x_n|n=1,2,…,N_{step}\} X2={ xn∣n=1,2,…,Nstep}
-
X X X:最终的编码数据,长度为 2 × N s t e p 2×N_{step} 2×Nstep, X = { X 1 , X 2 } X=\{X_1,X_2\} X={ X1,X2}
映射:双频PSC中,训练过程中从角度 θ \theta θ 映射出两个主相位:
输出的旋转角度在推理过程中从最终的主相位中映射得到:
编码:同式(2),将 ϕ 1 \phi_1 ϕ1 和 ϕ 2 \phi_2 ϕ2 编码为 X 1 X_1 X1 和 X 2 X_2 X2 的公式可以描述为:
解码:同式(3),从 X 1 X_1 X1 和 X 2 X_2 X2 解码 ϕ 1 \phi_1 ϕ1 和 ϕ 2 \phi_2 ϕ2 的公式可以描述为:
相位展开:网络在推理过程中输出两个主要相位: ϕ 1 \phi_1 ϕ1 作为绝对相位, ϕ 2 \phi_2 ϕ2 作为包裹相位,作者将它们混合以获得最终的相位,也成为相位展开。为此,首先计算 ϕ 1 \phi_1 ϕ1 和 ϕ 2 \phi_2 ϕ2 之间的内积为:
之后,根据 δ \delta δ 对 ϕ 2 \phi_2 ϕ2 进行展开,使得两个相位可以自动混合成为最终的相位 ϕ \phi ϕ:
需要指出的是,上述公式是为了清晰而简化的版本,事实上,加上 π \pi π 之后, ϕ \phi ϕ 可能会超出 [ − π , π ) [-\pi,\pi) [−π,π) 的范围。这种情况下, ϕ \phi ϕ 需要减去 2 π 2\pi 2π,否则降维超出角度的范围。
内积 δ \delta δ 为负说明向量 ( c o s ϕ 1 , s i n ϕ 1 ) (cos \phi_1,sin \phi_1) (cosϕ1,sinϕ1) 和 ( c o s ϕ 2 2 , s i n ϕ 2 2 ) (cos \frac{\phi_2}{2},sin \frac{\phi_2}{2}) (cos2ϕ2,sin2ϕ2) 相差90°以上,即对应的 θ \theta θ 相差 45° 以上,可能存在类正方形问题,此时将 ϕ 2 2 \frac{\phi_2}{2} 2ϕ2 加上 π \pi π 得到 ϕ \phi ϕ,最后除以 2 得到 θ \theta θ,相当于对 θ \theta θ 加上 π 2 \frac{\pi}{2} 2π。
这里的 ϕ 1 \phi_1 ϕ1 相当于帮助 ϕ 2 \phi_2 ϕ2 确定包裹计数的绝对相位,但从公式来看,使用双频PSC时, ϕ 1 \phi_1 ϕ1 并没有参与到最终的 θ \theta θ 计算,而是直接使用的 ϕ 2 \phi_2 ϕ2,那 ϕ 1 \phi_1 ϕ1 要怎么训练?代码如下:
def decode(self, angle_preds: Tensor, keepdim: bool = False) -> Tensor: self.coef_sin = self.coef_sin.to(angle_preds) self.coef_cos = self.coef_cos.to(angle_preds) phase_sin = torch.sum( angle_preds[:, 0:self.num_step] * self.coef_sin, dim=-1, keepdim=keepdim) phase_cos = torch.sum( angle_preds[:, 0:self.num_step] * self.coef_cos, dim=-1, keepdim=keepdim) phase_mod = phase_cos**2 + phase_sin**2 phase = -torch.atan2(phase_sin, phase_cos) # In range [-pi,pi) if self.dual_freq: phase_sin = torch.sum( angle_preds[:, self.num_step:(2 * self.num_step)] * self.coef_sin, dim=-1, keepdim=keepdim) phase_cos = torch.sum( angle_preds[:, self.num_step:(2 * self.num_step)] * self.coef_cos, dim=-1, keepdim=keepdim) phase_mod = phase_cos**2 + phase_sin**2 phase2 = -torch.atan2(phase_sin, phase_cos) / 2 # Phase unwarpping, dual freq mixing # Angle between phase and phase2 is obtuse angle idx = torch.cos(phase) * torch.cos(phase2) + torch.sin( phase) * torch.sin(phase2) < 0 # Add pi to phase2 and keep it in range [-pi,pi) phase2[idx] = phase2[idx] % (2 * torch.pi) - torch.pi phase = phase2 # Set the angle of isotropic objects to zero phase[phase_mod < self.thr_mod] *= 0 angle_pred = phase / 2 return angle_pred
从代码看使用 dual_freq 时,angle_preds[:, 0:self.num_step] 这部分确实没有得到训练(也有可能是提前训练好了)。感觉需要对这部分也进行监督。
4.3 映射的一般形式
类似地,通过将相位和角度之间的映射扩展到更一般的形式,可以解决类三角形和类五边形物体引起的歧义,以及360°定向问题(如飞机的航向):
其中 k = 2 π / s k=2\pi/s k=2π/s,假定待检测物体在旋转 s s s 弧度后是对称的,如图3所示。
PSC在所有情况下都使用,而多频策略则可以在不同类型同时存在的情况下使用,也就是说,通过将不同周期的旋转周期性映射为不同频率的香味,本文为旋转目标检测中的所有旋转对称性问题提供了统一的框架。
4.4 损失函数
旋转框由5个参数 ( x , y , w , h , θ ) (x,y,w,h,\theta) (x,y,w,h,θ) 表示,分别表示包围框的中心坐标,宽高和角度。作为一种基于角度编码的方法,PSC只涉及对 θ \theta θ 的回归。
根据公式(2),编码数据(相移图案)在 [-1,1] 的范围内,为了使得训练更加稳定,作者对输出特征进行了变换:
其中 X F e a t X_{Feat} XFeat 是卷积层的输出特征, X P r e d X_{Pred} XPred 是预测的编码数据,范围在在 [-1,1]。
之后,角度分支的损失可以用 L1 损失来计算:
其中 X G T X_{GT} XGT 是从标注框的旋转角度编码的相移图GT。
最终损失如下:
5 效果
5.1 和SOTA方法对比
和各种检测器结合的效果。
增加的推理时间。
5.2 消融实验
相移步数消融实验。
PSCD和PSC的在边界问题和类方形问题数据上的可视化效果对比。