论文链接 arxiv.org/abs/1902.09630
论文来自美国斯坦福大学和澳大利亚阿德莱德大学
一、论文提出的问题
论文中,作者指出,使用的
l
1
l_1
l1或
l
2
l_2
l2norm,以及IoU作为位置回归的损失时的问题,并且提出了GIoU作为优化方案。
上图中(从论文中得到),绿框是ground truth框,黑框是网络 predicted出来的框,位置回归损失的作用是,衡量ground truth框和predicted框之间的差距。使用
l
1
l_1
l1或
l
2
l_2
l2norm作为位置回归的损失函数事,可以看到不同的情况下,居然得到的损失值是相同的,也就是,这种方法不能够正确反映regression的效果。如果使用IoU作为损失函数,因为
I
o
U
=
∣
A
⋂
B
∣
∣
A
⋃
B
∣
IoU = \frac{|A\bigcap B|}{|A \bigcup B|}
IoU=∣A⋃B∣∣A⋂B∣
那么IoU本身就有一个很大的问题,就是A和B没有交集,IoU值就是0,IoU就不正确能反映A和B的关系。
二、论文解决方案 GIoU
2.1 什么是GIoU
上图的算法1中给出了GIoU的算法步骤,利用下图的才彩色框,可以有助理解,两个有重叠部分的绿色框A和红色框B,其中紫色框
D
=
∣
A
⋂
B
∣
D = |A \bigcap B|
D=∣A⋂B∣ ,蓝色的面积+红色的面积+紫色的面积
=
∣
A
⋃
B
∣
= |A \bigcup B|
=∣A⋃B∣ ,最外围的框C是包含框A和框B的最小的框,GIoU的等式中,
∣
C
\
(
A
⋃
B
)
∣
∣
C
∣
\frac {|C \backslash (A \bigcup B)|} {|C|}
∣C∣∣C\(A⋃B)∣ 的意思是,分子是最小外围框C的面积中,除去蓝色的面积+红色的面积+紫色的面积,也即是白色的面积,除以最小外围框C的面积。
2.2 GIoU的特点
1、由上面的公式可以得到:GIoU(A, B) ≤ IoU(A, B),也即是,GIoU是IoU的下界,拥有和IoU同样的性质 ;
2、如果A和B完全重合时,GIoU(A, B) = IoU(A, B);
三、GIoU在SSD中的可视化
3.1 三种位置回归损失函数
1、SmoothL1Loss
S
m
o
o
t
h
L
1
L
o
s
s
=
l
o
s
s
(
x
,
y
)
=
1
n
∑
i
z
i
SmoothL1Loss = loss(x, y) = \frac{1}{n} \sum_i z_i
SmoothL1Loss=loss(x,y)=n1i∑zi
其中
z
i
z_i
zi是这样计算的:
f
(
n
)
=
{
0.5
(
x
i
−
y
i
)
2
,
if
∣
x
i
−
y
i
∣
<
1
∣
x
i
−
y
i
∣
−
0.5
,
if otherwise
f(n)= \begin{cases} 0.5(x_i - y_i)^2, & \text {if $|x_i - yi| < 1$} \\ |x_i - y_i| - 0.5, & \text{if otherwise} \end{cases}
f(n)={0.5(xi−yi)2,∣xi−yi∣−0.5,if ∣xi−yi∣<1if otherwise
2、IoU loss
L
o
s
s
I
o
U
=
1
−
I
o
U
Loss_{IoU} = 1 - IoU
LossIoU=1−IoU
3、GIoU loss
L
o
s
s
I
o
U
=
1
−
G
I
o
U
Loss_{IoU} = 1 - GIoU
LossIoU=1−GIoU
3.2 损失函数可视化
本论文的主要研究点是如何设计合理的损失函数来学习在pre_box与truths_box的损失
常用的SmoothL1Loss可能会出现不同的overlap,出现同一个loss值;IoU loss在pre_box与truths_box没有重合的时候失效(我们都知道pre_box是在anchor框的基础上偏移而来,若是偏移过多,会导致pre_box预测飞,和truths_box没有iou的重合),这个时候论文提出了GIoU loss。
上图中,是将GIOU应用到SSD网络中,并且将每个位置框的loss值打印出来,红色框是truths框,黄色框是pred_box框,左上角的黄色数字是该truths_box与对应的pre_box的SmoothL1Loss值,左下角的紫色数字是对应的IoU loss,右上角的青色数字是对应的GIoU loss,下面再来几张训练过程中的损失值:
3.3 三种损失值在训练图片中的曲线图
上两个图中,横坐标是被判定为正样本的框,纵坐标是每个正样本使用不同的loss函数,计算的loss值,红色曲线是smooth_l1_loss归一化之后的值,青色是iou_loss,黄色是giou_loss。整体来说,三个曲线的趋势走向是相同的,iou_loss与giou_loss由于函数形式的相似性,因此两个曲线很相近,整体看,发现iou_loss <= giou_loss,那是因为iou >= giou。smooth_l1_loss的曲线,比iou_loss和giou_loss“拉的更开些“,即高峰更高,低谷更低。
四、总结
花了两天时间,看论文,再在ssd中复现,目前没有觉得GIoU loss 比 SmoothL1Loss有很大的改善,可能是我就使用了一个训练场景,在别的情况下,可能会凸显GIoU loss的优势,即使是有用,我觉得该论文的观点很有局限性,应该是在训练刚开始,pre_box的预测很不稳定的时候使用,会加快网络的收敛(当然这里是推测,没有实验数据),感觉在项目中效果不是很明显,有使用后,效果好的,可以分享下使用经验。
好了,该论文我不打算再深入研究了,但是欢迎大家的指点和交流!