前言
最近在阅读关于遥感目标检测论文的时候,发现很多论文在处理DOTA数据集时都会使用随机旋转的方式进行增强,更是有大佬在论文中直接表明,通过数据增强直接把模型的性能从65拉到了70左右,这句话在我心中激起了阵阵波澜。因为,我之前使用数据增强的方式基本上是按照通用目标检测的路子往下走的,顶多使用随机水平方向的翻转以及图片像素值的标准化。所以身为一名炼丹师,这种能够提升模型性能的方式当然不能错过,但是通过魔改网上开源代码进行随机旋转移植到我的mmdetection框架中时却遇到了loss为nan、inf的情况,这让我一头雾水。下面先放一下给我启发的论文链接:
R3Det: Refined Single-Stage Detector with Feature Refinement for Rotating Object
正文
在训练的时候由于总是会出现损失函数为nan的情况,但是只要将随机旋转的数据增强方式关闭掉,模型就又能够正常运行,所以很明显是我的代码中数据增强出现了问题,但是我通过图形可视化的结果却发现不论是水平还是倾斜边框其实问题都不大,可视化结果如下所示:
通过观察我发现模型在训练的时候loss也是很小的,但就会突然莫名奇妙的突然nan。针对这一现象,结合我使用的是二阶段的检测模型,经过我的debug,我发现在bboxhead部分计算loss的时候选区域相对于gt的偏移会有概率出现nan或inf,根据这一线索,我开始逐步分析和推理。
首先我们需要指导通常回归的偏差公式我们会选择如下的公式:
d
x
=
x
−
x
p
w
p
,
d
y
=
y
−
y
p
h
p
,
d
w
=
l
o
g
(
w
w
p
)
,
d
h
=
l
o
g
(
h
h
p
)
dx=\frac{x-x_p}{w_p},dy=\frac{y-y_p}{h_p},dw=log(\frac{w}{w_p}),dh=log(\frac{h}{h_p})
dx=wpx−xp,dy=hpy−yp,dw=log(wpw),dh=log(hph)
那么计算的偏差出现了问题,那肯定就是
w
a
w_a
wa或者
h
a
h_a
ha分母为零了,而出现这个问题的话,就需要将目光锁定在rpn阶段对于预测的候选区域解码操作上了
x
p
=
d
x
×
w
a
+
x
a
,
y
p
=
d
y
×
h
a
+
y
a
,
w
p
=
w
a
×
e
d
w
,
h
p
=
h
a
×
e
d
h
x_p=dx\times w_a+x_a,y_p=dy\times h_a+y_a,w_p=w_a\times e^{dw},h_p=h_a\times e^{dh}
xp=dx×wa+xa,yp=dy×ha+ya,wp=wa×edw,hp=ha×edh
通过上式可以轻易计算出左上和右下角的坐标;接下来,以
w
p
w_p
wp出现问题进行分析:
在通用检测框架mmdetection中进行完解码操作后,会有一个数值阶段的操作:
x1 = x1.clamp(min=0, max=max_shape[1])
y1 = y1.clamp(min=0, max=max_shape[0])
x2 = x2.clamp(min=0, max=max_shape[1])
y2 = y2.clamp(min=0, max=max_shape[0])
情况一:那么
w
p
w_p
wp如果为零,可以是
x
1
,
x
2
x_1,x_2
x1,x2均小于零,而造成两值小于零的主要原因就在于rpn预测的dx是小于零的,这让我意识到之前我进行图片的旋转和bbox的旋转的时候,有些靠近图片边缘的小目标已经由于计算精度问题为负值了,所以模型在学习的时候也是默认中心坐标也可以为负的,当我将旋转后不合适的矩形框舍去后,模型便能够正常进行loss的检测。
情况二:如果gt中的标注框中心坐标已经超出了图片的边界的话,也会遇到同样的问题,最后rpn得到的proposal的宽和高只能为0,以至于在计算偏移的时候会出现inf和nan的情况。
结束
这个问题困扰了我一天,不过也让我了解到了矩形框中心坐标的正负其实影响很大。
如有错误,请指正!!!!