现在在物体检测领域,通常会使用IoU(Intersection over Union)来作为一个很重要的度量指标。但是很多时候在训练网络时,采用的是l2-norm来回归检测框的,文章认为采用l2-norm来训练模型而使用IoU来衡量模型好坏,这两者之间似乎存在着某种不匹配的关系。
举个例子,如下图所示,
现假设采用左上角右下角的坐标来表示一个矩形框,即 ( x 1 , y 1 , x 2 , y 2 ) (x_1,y_1,x_2,y_2) (x1,y1,x2,y2)。在采用l2-norm来度量两个框的匹配度,即上图中绿色表示的ground truth框与黑框表示的预测框之间的匹配度,当假设两个框的一个角的欧拉距离是固定的(这里假设两个框的左下角距离固定),那么这两个框在l2-norm度量下的相似度,在当以绿色框右上角为圆形某固定值为半径的圆(黑色虚线表示)上的每个点表示预测框的右上角时,l2-norm值是一样的。
这句话可以用下面公式表示:
绿色框左上角坐标为 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)右下角为 ( x 2 , y 2 ) (x_2, y_2) (x2,y2)
黑色框左上角坐标为 ( x 1 ′ , y 1 ′ ) (x'_1,y'_1) (x1′,y1′)右下角为 ( x 2 ′ , y 2 ′ ) (x'_2, y'_2) (x2′,y2′)
下面要满足两个条件,
- 两个框左下角 ( x 1 , y 2 ) (x_1, y_2) (x1,y2), ( x 1 ′ , y 2 ′ ) (x'_1, y'_2) (x1′,y2′)距离为定值,可以用下面公式表示
( x 1 − x 1 ′ ) 2 + ( ( y 2 − y 2 ′ ) 2 ) = a (x_1-x'_1)^2 + ((y_2-y'_2)^2)=a (x1−x1′)2+((y2−y2′)2)=a
这里a表示定值
- 以 ( x 2 , y 1 ) (x_2, y_1) (x2,y1)为圆形,某个定值为半径,可以用下面公式表示
( x − x 2 ) 2 + ( y − y 1 ) 2 = r 2 (x-x_2)^2+(y-y_1)^2=r^2 (x−x2)2+(y−y1)2=r2
这里用r表示半径
将上面两式相加就是两个矩形框的l2-norm的表示,可以看出只要取圆上的另一一点,l2-norm的结果是一样的,而这时候IoU和后面要介绍的GIoU值都是不一样的,这就说明了l2-norm不能很好的表示IoU值。而且这个结论与用什么方式表示矩形框是无关的,如下面用矩形框的中心点和框的宽高来表示一个框也可以得到相应的结论。
为了更好的优化网络以及有一个更好的度量,文章提出了GIoU的概念。
一、GIoU的性质
下面先来回顾一下IoU的计算,如下式表示
对于任意两个形状,A和B,它们的IoU为
I o U = ∣ A ⋂ B ∣ ∣ A ⋃ B ∣ IoU = \frac{|A\bigcap B|}{|A\bigcup B|} IoU=∣A⋃B∣∣A⋂B∣
当两个物体没有相交时,IoU定义为0。
IoU具有以下性质,使得IoU在2D、3D计算机视觉中成为一个重要的评测指标:
- IoU能作为一中度量,而 L I o U = 1 − I o U L_{IoU}=1-IoU LIoU=1−IoU能满足度量的所有性质。
- IoU对于尺度有不变性。这意味着两个任意形状A和B之间的相似性与它们的空间尺度无关。
然而IoU作为度量也有它的缺点,那就是当 ∣ A ⋂ B ∣ |A\bigcap B| ∣A⋂B∣=0是IoU为0,这时候并不能表示两个物体之间的距离,他们是邻近的还是相距很远的。为了解决这个问题,本文提出GIoU。
先介绍一下GIoU作为一种度量方式,它具有的性质:
- 类似与IoU,GIoU也能表示距离。 L G I o U = 1 − G I o U L_{GIoU}=1-GIoU LGIoU=1−GIoU能满足度量的所有性质。
- 类似IoU,GIoU也对于尺度有不变性。
- GIoU是IoU的下界,即 G I o U ( A , B ) ≤ I o U ( A , B ) GIoU(A,B)\le IoU(A,B) GIoU(A,B)≤IoU(A,B),当A和B的形状和位置无限趋近时,等号成立
- 类似 0 ≤ I o U ≤ 1 0\le IoU \le 1 0≤IoU≤1, − 1 ≤ G I o U ≤ 1 -1\le GIoU \le 1 −1≤GIoU≤1,如果两个物体重叠时 I o U ( A , B ) = G I o U ( A , B ) = 1 IoU(A,B)=GIoU(A,B)=1 IoU(A,B)=GIoU(A,B)=1,如果两个物体的并集与包围两个物体的形状之比趋近0时GIoU取得-1。
二、GIoU的计算方式
对于两个框表示
预测框: B p = ( x 1 p , y 1 p , x 2 p , y 2 p ) B^p = (x^p_1, y^p_1, x^p_2, y^p_2) Bp=(x1p,y1p,x2p,y2p)
标注框: B g = ( x 1 g , y 1 g , x 2 g , y 2 g ) B^g = (x^g_1, y^g_1, x^g_2, y^g_2) Bg=(x1g,y1g,x2g,y2g)
- 为确保预测框中 x 2 p > x 1 p x^p_2 \gt x^p_1 x2p>x1p, y 2 p > y 1 p y^p_2 \gt y^p_1 y2p>y1p:
x ^ 1 p = m i n ( x 1 p , x 2 p ) , x ^ 2 p = m a x ( x 1 p , x 2 p ) \hat x^p_1 = min(x^p_1, x^p_2),\hat x^p_2 = max(x^p_1, x^p_2) x^1p=min(x1p,x2p),x^2p=max(x1p,x2p)
y ^ 1 p = m i n ( y 1 p , y 2 p ) , y ^ 2 p = m a x ( y 1 p , y 2 p ) \hat y^p_1 = min(y^p_1, y^p_2),\hat y^p_2 = max(y^p_1, y^p_2) y^1p=min(y1p,y2p),y^2p=max(y1p,y2p)
- 标注框的面积为 A g = ( x 2 g − x 1 g ) × ( y 2 g − y 1 g ) A^g = (x^g_2-x^g_1)\times (y^g_2-y^g_1) Ag=(x2g−x1g)×(y2g−y1g)
- 预测框的面积为 A p = ( x 2 p − x 1 p ) × ( y 2 p − y 1 p ) A^p = (x^p_2-x^p_1)\times (y^p_2-y^p_1) Ap=(x2p−x1p)×(y2p−y1p)
- 两者的交集为
x 1 I = m a x ( x ^ 1 p , x 1 g ) , x 2 I = m i n ( x ^ 2 p , x 2 g ) x^I_1=max(\hat x^p_1, x^g_1),x^I_2=min(\hat x^p_2, x^g_2) x1I=max(x^1p,x1g),x2I=min(x^2p,x2g)
y 1 I = m a x ( y ^ 1 p , y 1 g ) , y 2 I = m i n ( y ^ 2 p , y 2 g ) y^I_1=max(\hat y^p_1, y^g_1),y^I_2=min(\hat y^p_2, y^g_2) y1I=max(y^1p,y1g),y2I=min(y^2p,y2g)
I = { ( x 2 I − x 1 I ) × ( y 2 I − y 1 I ) i f x 2 I > x 1 I , x y 2 I > y 1 I 0 o t h e r w i s e I = \left\{ \begin{array}{lr} (x^I_2-x^I_1)\times(y^I_2-y^I_1) \quad if x^I_2\gt x^I_1,xy^I_2\gt y^I_1 \\ 0 \quad otherwise \end{array} \right. I={(x2I−x1I)×(y2I−y1I)ifx2I>x1I,xy2I>y1I0otherwise
- 计算两个框最小的包围框
x 1 c = m i n ( x ^ 1 p , x 1 g ) , x 2 c = m a x ( x ^ 2 p , x 2 g ) x^c_1=min(\hat x^p_1, x^g_1),x^c_2=max(\hat x^p_2, x^g_2) x1c=min(x^1p,x1g),x2c=max(x^2p,x2g)
y 1 c = m i n ( y ^ 1 p , y 1 g ) , y 2 c = m a x ( y ^ 2 p , y 2 g ) y^c_1=min(\hat y^p_1, y^g_1),y^c_2=max(\hat y^p_2, y^g_2) y1c=min(y^1p,y1g),y2c=max(y^2p,y2g)
- 最小的包围框的面积为 A c = ( x 2 c − x 1 c ) × ( y 2 c − y 1 c ) A^c = (x^c_2-x^c_1)\times (y^c_2-y^c_1) Ac=(x2c−x1c)×(y2c−y1c)
- I o U = I U , U = A p + A g − I IoU=\frac{I}{U}, U = A^p+A^g-I IoU=UI,U=Ap+Ag−I
- G I o U = I o U − A c − U A c GIoU = IoU-\frac{A^c-U}{A^c} GIoU=IoU−AcAc−U
- L G I o U = 1 − G I o U L_{GIoU}=1-GIoU LGIoU=1−GIoU
当IoU为0时在训练网络时没有梯度了,影响训练质量和模型收敛速度,而GIoU不会为0。而且从GIoU的性质3可以看出,GIoU与IoU有很强的相关性。文章也采用了随机的10K个样本求IoU和GIoU得到下图,也可以 看出二者相关性,并且还能看出GIoU相对于IoU能够获得更陡的梯度值,更有利于模型训练。
关于GIoU Loss的稳定性
通过前面介绍知道
0 ≤ L I o U ≤ 1 0\le L_{IoU} \le 1 0≤LIoU≤1, 0 ≤ L G I o U ≤ 2 0\le L_{GIoU} \le 2 0≤LGIoU≤2
所以两个loss都是有界的
L I o U L_{IoU} LIoU在IoU为0时的行为
当IoU=0时, L G I o U = 2 − U A c L_{GIoU} = 2-\frac{U}{A^c} LGIoU=2−AcU,要使得loss减小,就要使 U / A c U/A^c U/Ac增大,从而要使得 U U U增大或者 A c A^c Ac减小,要达到这种要求就需要预测框和标注框尽量重叠。
关于GIoU实践可能存在的问题
在博主训练yolov3的时候,使用了GIoUloss,不用与smoothL2-loss的计算只要算坐标的一个偏置量的差值,要算GIoUloss必须先求出坐标,而在求坐标的时候使用了e为底的指数,造成了w和h为inf的情况,导致loss为nan,采用的办法是限制w和h为一个较大的值。