(六)论文阅读 | 目标检测之DIoU


简介

在这里插入图片描述

图1:论文原文

论文是 2019 {\rm 2019} 年的一篇目标检测论文,文中提出新的方法, D I o U {\rm DIoU} C I o U {\rm CIoU} ,用于更快、更精确地回归边界框。此外,论文中对比了传统使用的 I o U {\rm IoU} G I o U {\rm GIoU} 等,实验显示了 D I o U {\rm DIoU} 的有效性。
论文原文 源码


0. Abstract

作者指出 I o U {\rm IoU} G I o U {\rm GIoU} 虽然有效地提高了边界框回归的效果,但同时也存在收敛慢、精度不高等问题。论文通过结合候选框和标注框间的归一化距离信息提出了 D I o U {\rm DIoU} ,同时,根据候选框和标注框的重叠面积、中心点距离和框的宽高比例信息提出了 C I o U {\rm CIoU} 。实验结果为,采用了 D I o U {\rm DIoU} C I o U {\rm CIoU} 的模型如 Y O L O v 3 {\rm YOLOv3} S S D {\rm SSD} F a s t e r   R {\rm Faster\ R} - C N N {\rm CNN} 等,其精度可进一步提高。

在进行接下来的部分前,先看一下边界框回归的过程(参考这里):
首先,边界框回归的目的是使得候选框可以不断接近标注框,通过不断修正候选框的坐标以达到上述目的。而我们所寻找的就是一种修正方法完成上述过程。如下图:
在这里插入图片描述

图2:边界框回归

如上图红色框是候选框,绿色框是标注框,蓝色框是利用边界框回归算法生成的目标框。可以看到蓝色框比红色框更接近于绿色框,而边界框回归算法的目的就是实现从红色框生成蓝色框的过程。然后通过多次反复的迭代,最终生成的边界框足够接近标注框。参考R-CNN,以 ( P x , P y , P w , P h ) ({\rm P_x,P_y,P_w,P_h}) ( G x , G y , G w , G h ) ({\rm G_x,G_y,G_w,G_h}) ( G x , G y , G w , G h ) ({\rm G^*_x,G^*_y,G^*_w,G^*_h}) 分别表示上述框,其中前两个数值表示框的中心点坐标,后两个数值表示框的宽和高。则边界框的目的为找到一种映射 f {\rm f} 使其满足 ( P x , P y , P w , P h ) f ( G x , G y , G w , G h ) ( G x , G y , G w , G h ) (0.1) ({\rm P_x,P_y,P_w,P_h})\stackrel{{\rm f}}{\longrightarrow}({\rm G_x,G_y,G_w,G_h}) ≈({\rm G^*_x,G^*_y,G^*_w,G^*_h})\tag{0.1} 直观上,要从红色框得到蓝色框,需要通过平移和缩放操作。先做平移操作: G x = P x + P w d x ( P ) (0.2) G_x=P_x+P_wd_x(P)\tag{0.2} G y = P y + P h d y ( P ) (0.3) G_y=P_y+P_hd_y(P)\tag{0.3}

再做缩放操作: G w = P w e d w ( P ) (0.4) G_w=P_we^{d_w(P)}\tag{0.4} G h = P h e d h ( P ) (0.5) G_h=P_he^{d_h(P)}\tag{0.5}

即可完成上述变换。根据上述式子,平移量分别为 P w d x ( P ) P_wd_x(P) P h d y ( P ) P_hd_y(P) ,缩放量分别为 e d w ( P ) e^{d_w(P)} e d h ( P ) e^{d_h(P)} 。观察平移量和缩放量,模型需要学习的参数为 d ( P ) d_*(P) ,其中 * 代表 x , y , w , h x,y,w,h 。参考R-CNN,定义 d ( P ) d_*(P) A l e x N e t {\rm AlexNet} 中第 5 5 个池化层得到特征的线性函数,将该特征记为 φ 5 ( P ) φ_5(P) ,则 d ( P ) = w T φ 5 ( P ) d_*(P)={\rm w_*^T}φ_5(P) ,其中 w T {\rm w_*^T} 为模型学习参数的向量。 w T {\rm w_*^T} 可通过以下公式求得(最小二乘法): w = argmin w ^ i N ( t i w ^ T φ 5 ( P i ) ) 2 + λ w ^ 2 (0.6) {\rm w_*}=\underset {\rm \hat w_*}{\operatorname {argmin} }\sum_i^N(t_*^i-{\rm \hat w_*^Tφ_5(P_i)})^2+λ||{\rm \hat w_*}||^2\tag{0.6} 其中, t t_* 定义为: t x = ( G x P x ) / P w (0.7) t_x=(G_x^*-P_x)/P_w\tag{0.7} t y = ( G y P y ) / P h (0.8) t_y=(G_y^*-P_y)/P_h\tag{0.8} t w = l o g ( G w / P w ) (0.9) t_w={\rm log}(G_w^*/P_w)\tag{0.9} t h = l o g ( G h / P h ) (0.10) t_h={\rm log}(G_h^*/P_h)\tag{0.10}
具体的细节和内容可查看这里R-CNN

无论哪一种目标检测算法,都离不开边界框回归这一过程。在评价候选框的指标中,常用的为 I o U {\rm IoU} ,其定义为: I o U = B B g t B B g t (0.11) IoU=\frac{B∩B^{gt}}{B∪B^{gt}}\tag{0.11} 其中 B g t = ( x g t , y g t , w g t , h g t ) B^{gt}=(x^{gt},y^{gt},w^{gt},h^{gt}) 为标注框, B = ( x , y , w , h ) B=(x,y,w,h) 为候选框。 I o U {\rm IoU} 即定义候选框和标注框的交集面积与并集面积之比。由此,用 I o U {\rm IoU} 来反映候选框和标注框的吻合程度就得到 I o U   L o s s {\rm IoU\ Loss} L I o U = 1 B B g t B B g t (0.12) L_{IoU}=1-\frac{B∩B^{gt}}{B∪B^{gt}}\tag{0.12} 但是, I o U   L o s s {\rm IoU\ Loss} 不能优化非重叠的框(损失函数值都为 1 1 时候选框和标注框的空间位置可能为差别很大)以及不能反映候选框和标注框的重叠情况,如下图:
在这里插入图片描述

图3:IoU和GIoU

上面三幅图具有相同的 I o U {\rm IoU} 值,但是第一幅图的 G I o U {\rm GIoU} 值最大,第二幅次之,第三幅图最小。直观上, G I o U {\rm GIoU} 值越大,候选框和标注框的重合情况越好。 G I o U {\rm GIoU} 定义为:
G I o U = I o U C ( A B ) C (0.13) GIoU=IoU-\frac{|C-(A∪B)|}{|C|}\tag{0.13}

G I o U {\rm GIoU} 的几何解释为:首先找到一个将候选框和标注框一并框起来的最小框 C C ,然后求 C C A B A∪B 的补集面积,再除以 C C 的面积。最后用 I o U {\rm IoU} 减去上述值。对应的 G I o U   L o s s {\rm GIoU\ Loss} 为: L G I o U = 1 I o U + C ( A B ) C (0.14) L_{GIoU}=1-IoU+\frac{|C-(A∪B)|}{|C|}\tag{0.14}
但是,为了和本文提出的 G I o U {\rm GIoU} 做对比,作者以下图为例说明:在这里插入图片描述

图4:GIoU和DIoU

第一行图为 G I o U {\rm GIoU} 的边界框回归过程,第二行图为 D I o U {\rm DIoU} 的边界框回归过程。其中黑色框表示 A n c h o r {\rm Anchor} ,绿色框表示标注框,蓝色框表示利用 G I o U   L o s s {\rm GIoU\ Loss} 回归中框的变化情况,红色框表示利用 D I o U   L o s s {\rm DIoU\ Loss} 回归中框的变化情况。由图可知, G I o U {\rm GIoU} 更倾向于将候选框的尺寸增大去重叠标注框,而 D I o U {\rm DIoU} 则直接通过最小化中心点的归一化距离。

本文贡献:(一)提出 D I o U   L o s s {\rm DIoU\ Loss} ;(二)提出 D I o U   L o s s {\rm DIoU\ Loss} ;(三)将 C I o U {\rm CIoU} 应用于 N M S {\rm NMS} 中,使其更具有鲁棒性;(四)论文提出的方法可以有效地集成到各种 S O T A {\rm SOTA} 的目标检测算法中,而不会造成额外的计算开销。


1. Related Work

目标检测,总结当前经典的目标检测算法。
边界框回归的损失函数,在 Y O L O v 1 {\rm YOLOv1} 中使用 w w h h 的平方根的差的平方以缓解尺度敏感问题、自从 U n i t b o x Unitbox 就开始使用 I o U   L o s s {\rm IoU\ Loss} G I o U   L o s s {\rm GIoU\ Loss} 的提出用于解决非重叠框回归的情景。
N M S {\rm NMS} ,用于解决多分类中某个目标上同时具有很多置信度较高的候选框的情景,最终只保留最合适的候选框。如下图:
在这里插入图片描述

图5:NMS

如上图中,每张人脸上均具有置信度较高的多个候选框。 N M S {\rm NMS} 的过程如下:
1、首先对图中所有的候选框按照置信度非递增排序 A   B   C   D   E {\rm A\ B\ C\ D\ E}
2、选取置信度最高的框 A {\rm A}
3、遍历剩余框 B   C   D   E {\rm B\ C\ D\ E} ,如果和 A {\rm A} I o U {\rm IoU} 大于阈值,则将其剔除(假如 C {\rm C} D {\rm D} 被剔除)
4、从剩余框 B   E {\rm B\ E} 中找到置信度最高的框 B {\rm B}
5、按照上述方法提出候选框 E {\rm E}
6、得到的结果为候选框 A {\rm A} B {\rm B} ,候选框数目同目标数目一致,算法结束。


2. Analysis to IoU and GIoU Losses

为了分析 I o U   L o s s {\rm IoU\ Loss} G I o U   L o s s {\rm GIoU\ Loss} 的局限性,作者提出了一个模拟边界框回归的实验,模拟实验尽可能多地覆盖边界框回归中的距离、大小和宽高比例问题:在这里插入图片描述

图6:边界框回归

如图 6 {\rm 6} 中的第一幅图,绿色框表示面积大小为 1 {\rm 1} ,宽高比例分别为( 1 : 4 , 1 : 3 , 1 : 2 , 1 : 1 , 2 : 1 , 3 : 1 , 4 : 1 {\rm 1:4,1:3,1:2,1:1,2:1,3:1,4:1} ) ,且中心均在坐标 ( 10 , 10 ) (10,10) 处的一系列 T a r g e t   B o x {\rm Target\ Box} 。一系列 A n c h o r   B o x {\rm Anchor\ Box} 由分布在中心为 ( 10 , 10 ) (10,10) 半径为 3 3 的圆域内的 5000 5000 个点表示,其中 A n c h o r   B o x {\rm Anchor\ Box} 的面积大小为 0.5 , 0.67 , 0.75 , 1 , 1.33 , 1.5 , 2 0.5,0.67,0.75,1,1.33,1.5,2 ,宽高比例信息同 T a r g e t   B o x {\rm Target\ Box} 。对于圆域中的每一个点,都表示 7 × 7 7×7 A n c h o r   B o x {\rm Anchor\ Box} ,所以圆域内共有 5000 × 7 × 7 5000×7×7 A n c h o r   B o x {\rm Anchor\ Box} 。据上面描述,一共有 7 7 T a r g e t   B o x {\rm Target\ Box} ,所以模拟实验一共能产生 1715000 = 5000 × 7 × 7 × 7 1715000=5000×7×7×7 种边界框回归情况。

给定一种损失函数 L L ,可以使用梯度下降算法模拟边界框回归过程。对于预测框 B i B_i ,可以通过以下方式得到: B i t = B i t 1 + η ( 2 I o U i t 1 ) B i t 1 (2.1) B_i^t=B_i^{t-1}+η(2-IoU_i^{t-1})▽B_i^{t-1}\tag{2.1}

其中 B i t B_i^t 表示第 t t 步迭代的预测框, B i t 1 ▽B_i^{t-1} 表示 B i B_i 在第 ( t 1 ) (t-1) 步迭代时的梯度, η η 为步长,系数 2 I o U i t 1 2-IoU_i^{t-1} 用于加速收敛。最后回归结果统一采用 l 1 l_1 范数评估,迭代总次数为 200 200 。模拟实验结果见图 6 {\rm 6} 中的第二幅图。

下图是模拟实验的伪代码:
在这里插入图片描述

图7:边界框回归

模拟实验的输入是:损失函数 L R + 4 {\rm L∈R_+^4} 是一个连续有界函数, M = { { B n , s } s = 1 S } n 1 N {\rm M}={\{\{B_{n,s}\}_{s=1}^S\}}_{n-1}^N 表示一系列的 A n c h o r   B o x {\rm Anchor\ Box} M g t = { B i g t } i = 1 7 {\rm M^{gt}}={\{B_i^{gt}\}_{i=1}^7} 表示一系列的 T a r g e t   B o x {\rm Target\ Box}
模拟实验的输出是:边界框回归的误差 E {\rm E} R {\rm R} T × N {^{T×N}}
下面简要阅读此模拟实验过程:
1、初始化误差和最大迭代次数
2、开始边界框回归:
3、对圆域内的 5000 5000 个点循环
4、对每个点对应的 7 × 7 7×7 A n c h o r   B o x {\rm Anchor\ Box} 循环
5、对每个 T a r g e t   B o x {\rm Target\ Box} 循环
6、迭代次数循环
7、在不同的迭代次数区间内使用不同的步长 η η
8、计算梯度 B n , s t 1 ▽B_{n,s}^{t-1}
9、利用公式 ( 2.1 ) (2.1) 更改 B n , s t B_{n,s}^t
10、计算误差
11-15、结束

分析模拟实验的结果,由图 6 6 的第二幅图可知, I o U   L o s s {\rm IoU\ Loss} 仅在 A n c h o r   B o x {\rm Anchor\ Box} T a r g e t   B o x {\rm Target\ Box} 有重叠时才有效,没有重叠时 B ▽B 为0。由公式 ( 0.14 ) (0.14) G I o U   L o s s {\rm GIoU\ Loss} A n c h o r   B o x {\rm Anchor\ Box} T a r g e t   B o x {\rm Target\ Box} 没有重叠部分时也能很好工作。但是在水平或者垂直方向上误差仍然很大。作者分析原因是: G I o U   L o s s {\rm GIoU\ Loss} 致力于最小化 C A B |C-A∪B| ,但是 C A B C-A∪B 部分的面积通常非常小或为0(当两个框为包含关系时),这时 G I o U   L o s s {\rm GIoU\ Loss} 退化为 I o U   L o s s {\rm IoU\ Loss} G I o U   L o s s {\rm GIoU\ Loss} 在经过很久的迭代后也能够获得较好的结果,但是迭代期间需要合理设置步长 η η ,且迭代速度非常慢。由上述图 4 4 可以看到, G I o U   L o s s {\rm GIoU\ Loss} 回归过程是首先增大预测框的大小去重叠标注框,然后再逐渐增大 I o U {\rm IoU} 值,收敛过程非常缓慢。
针对以上情况,作者提出两个问题:直接最小化候选框同标注框的归一化距离以加速收敛;在候选框同标注框有重叠甚至是包含关系时怎么快速、精确回归。


3. The Proposed Method

首先,基于 I o U {\rm IoU} 的损失函数定义为: L = 1 I o U + R ( B , B g t ) (3.1) L=1-IoU+R(B,B^{gt})\tag{3.1}

D I o U   L o s s {\rm DIoU\ Loss} ,针对上述问题一,作者提出了一种最小化归一化距离的方法, R R 定义为: R D I o U = ρ 2 ( b , b g t ) c 2 (3.2) R_{DIoU}=\frac{ρ^2({\rm b},{\rm b}^{gt})}{c^2}\tag{3.2}

其中 b {\rm b} b {\rm b} g t {^{gt}} 表示候选框 B B 和标注框 B g t {B^{gt}} 的中心点, ρ ( ) ρ(·) 表示欧式距离, c c 表示包围候选框和标注框的最小框的对角线长度。由此, D I o U   L o s s {\rm DIoU\ Loss} 定义为: L D I o U = 1 I o U + ρ 2 ( b , b g t ) c 2 (3.3) L_{DIoU}=1-IoU+\frac{ρ^2({\rm b},{\rm b}^{gt})}{c^2}\tag{3.3}

D I o U   L o s s {\rm DIoU\ Loss} I o U   L o s s {\rm IoU\ Loss} G I o U   L o s s {\rm GIoU\ Loss} 的比较
(1)使用 D I o U   L o s s {\rm DIoU\ Loss} 的回归问题规模不变;
(2)在两个框重叠情况, D I o U   L o s s {\rm DIoU\ Loss} 也能够提供边界框回归时框的移动方向;
(3)当两个框完全重叠时, L G I o u = L D I o U = 0 L_{GIou}=L_{DIoU}=0 ,当两个框距离较远时 L G I o u = L D I o U 2 L_{GIou}=L_{DIoU}→2
(4) D I o U   L o s s {\rm DIoU\ Loss} 直接最小化归一化距离,收敛更快;
(5)在两个框为包含关系,或者为水平、垂直关系时, D I o U   L o s s {\rm DIoU\ Loss} 能够快速收敛。

C I o U   L o s s {\rm CIoU\ Loss} ,针对上述问题二,作者提出了一种两个框有重叠或者包含关系时快速收敛的方法。作者指出,边界框回归过程中,应该考虑框间的三种属性:中心点距离、大小和宽高比例。前两者属性已由 I o U   L o s s {\rm IoU\ Loss} G I o U   L o s s {\rm GIoU\ Loss} D I o U   L o s s {\rm DIoU\ Loss} 等解决,怎么利用边界框的宽高比例信息加速收敛呢?基于 G I o U   L o s s {\rm GIoU\ Loss} D I o U   L o s s {\rm DIoU\ Loss} 和框间宽高比的一致性,作者提出了 C I o U   L o s s {\rm CIoU\ Loss} R R 定义为: R C I o U = ρ 2 ( b , b g t ) c 2 + α v (3.4) R_{CIoU}=\frac{ρ^2({\rm b},{\rm b}^{gt})}{c^2}+αv\tag{3.4} 其中 v v 用于衡量框间宽高比例的一致性,定义为: v = 4 π 2 ( a r c t a n w g t h g t a r c t a c w h ) 2 (3.5) v=\frac{4}{π^2}(arctan\frac{w^{gt}}{h^{gt}}-arctac\frac{w}{h})^2\tag{3.5}

当标注框的宽高比 w g t / h g t w^{gt}/h^{gt} 和候选框的宽高比 w / h w/h 越接近时, v 0 v→0 ,此时 C I o U   L o s s {\rm CIoU\ Loss} 退化为 D I o U   L o s s {\rm DIoU\ Loss} ;当二者比例很不同时, α v αv 作为惩罚项用于加速边界框回归。

其中 α α 为平衡参数,定义为: α = v ( 1 I o U ) + v (3.6) α=\frac{v}{(1-IoU)+v}\tag{3.6} 由此, C I o U   L o s s {\rm CIoU\ Loss} 定义为: L C I o U = 1 I o U + ρ 2 ( b , b g t ) c 2 + α v (3.7) L_{CIoU}=1-IoU+\frac{ρ^2({\rm b},{\rm b}^{gt})}{c^2}+αv\tag{3.7}
C I o U   L o s s {\rm CIoU\ Loss} D I o U   L o s s {\rm DIoU\ Loss} 的优化方式一致,只是在求梯度时: v w = 8 π 2 ( a r c t a n w g t h g t a r c t a c w h ) × h w 2 + h 2 (3.8) \frac{∂v}{∂w}=\frac{8}{π^2}(arctan\frac{w^{gt}}{h^{gt}}-arctac\frac{w}{h})×\frac{h}{w^2+h^2}\tag{3.8} v h = 8 π 2 ( a r c t a n w g t h g t a r c t a c w h ) × w w 2 + h 2 (3.9) \frac{∂v}{∂h}=-\frac{8}{π^2}(arctan\frac{w^{gt}}{h^{gt}}-arctac\frac{w}{h})×\frac{w}{w^2+h^2}\tag{3.9}

在回归过程中 w , h [ 0 , 1 ] w,h∈[0,1] w 2 + h 2 w^2+h^2 的值很小,为防止梯度爆炸,在实验中 w 2 + h 2 = 1 w^2+h^2=1

N M S {\rm NMS} 中使用 D I o U {\rm DIoU} ,作者认为:在 N M S {\rm NMS} 中,不仅要利用重叠区域信息,还要考虑框间距离。对于置信度最高的预测框 M M D I o U {\rm DIoU} - N M S {\rm NMS} 定义为: s i = { s i , I o U R D I o U ( M , B i ) ε 0 , I o U R D I o U ( M , B i ) ε (3.10) s_i=\left\{ \begin{aligned} &s_i,&IoU-R_{DIoU}(M,B_i)<ε\\ &0,&IoU-R_{DIoU}(M,B_i)≥ε\\ \end{aligned} \right.\tag{3.10}

B i B_i 在同时考虑 I o U {\rm IoU} 和框间中心点的距离后去掉, s i s_i 为置信度, ε ε 为阈值。

直观上理解:两个框相距越远,则 R R 值越小,且表明这两个框可能是不同目标的候选框,则其置信度 s i s_i 0 0 ,则该候选框 B i B_i 去掉(对比上述 N M S {\rm NMS} 过程仅通过置信度来判断候选框是否去掉)。


4. Experimental Results

Y O L O v 3 {\rm YOLOv3} P A S C A L   V O C   2007 {\rm PASCAL\ VOC\ 2007} 上的实验结果:
在这里插入图片描述

图8:YOLOv3在PASCAL VOC 2007数据集上的实验结果

此外,文中还列出了 S S D {\rm SSD} P A S C A L   V O C   2007 {\rm PASCAL\ VOC\ 2007} 数据集和 F a s t e r   R {\rm Faster\ R} - C N N {\rm CNN} M S   C O C O {\rm MS\ COCO} 数据集上的实验结果,结果为 D I o U   L o s s {\rm DIoU\ Loss} C I o U   L o s s {\rm CIoU\ Loss} 达到了 S O T A {\rm SOTA}

D I o U {\rm DIoU} - N M S {\rm NMS} 对比 N M S {\rm NMS} 的实验结果:
在这里插入图片描述

图9:YOLOv3在PASCAL VOC 2007数据集上的实验结果


5. Conclusion

本文提出了两种新的基于 I o U {\rm IoU} 的损失函数: D I o U   L o s s {\rm DIoU\ Loss} C I o U   L o s s {\rm CIoU\ Loss} 用于更快、更精确地进行边界框回归。 D I o U   L o s s {\rm DIoU\ Loss} 直接最小化框间的归一化距离; C I o U   L o s s {\rm CIoU\ Loss} 利用框间的宽高比例信息加速收敛过程;将 D I o U {\rm DIoU} 应用于 N M S {\rm NMS} 能够获得更精确的结果。
本文所提出的方法可以移植到现在的目标检测方法中,是一种提高目标检测算法性能的可能选择。

由于没有阅读源码,本文只总结了 D I o U {\rm DIoU} 的大体结构和信息,详细内容请阅读论文原文


附录:各IoU和NMS的Python实现

(一) I o U {\rm IoU} ,这里 I o U {\rm IoU} 的计算都是针对两个框之间的计算为例,多个框之间的计算方法类似。假设 b b o x = ( x 1 , y 1 , x 2 , y 2 ) {\rm bbox=(x_1,y_1,x_2,y_2)} ,如果是 b b o x = ( x , y , w , h ) {\rm bbox=(x,y,w,h)} 需要通过 ( x w / 2 , y h / 2 , x + w / 2 , y + h / 2 ) {(\rm x-w/2,y-h/2,x+w/2,y+h/2)} 转化

def inter(bbox1, bbox2):
    # 交集区域
    interW = min(bbox1[2], bbox2[2]) - max(bbox1[0], bbox2[0])
    interH = min(bbox1[3], bbox2[3]) - max(bbox1[1], bbox2[1])
    # 返回交集区域面积
    return interW * interH
    
def union(bbox1, bbox2):
    # 两个框的面积
    area1 = (bbox1[2] - bbox1[0]) * (bbox1[3] - bbox1[1])
    area2 = (bbox2[2] - bbox2[0]) * (bbox2[3] - bbox2[1])
    # 返回并集区域面积
    return area1 + area2 - inter(bbox1, bbox2)
    
def interOverUnion(bbox1, bbox2):
    # 返回IoU值
    return inter(bbox1, bbox2) / (union(bbox1, bbox2) + 1e-16)

(二) G I o U {\rm GIoU}

def gIoU(bbox1, bbox2):
    # 包围框的面积
    minX = min(bbox1[0], bbox2[0])
    minY = min(bbox1[1], bbox2[1])
    maxX = max(bbox1[2], bbox2[2])
    maxY = max(bbox1[3], bbox2[3])
    area = (maxX - minX) * (maxY - minY)
    # R部分
    diff = (area - union(bbox1, bbox2)) / (area + 1e-16)
    # 返回GIoU值
    return interOverUnion(bbox1, bbox2) - diff

(三) D I o U {\rm DIoU}

def dIoU(bbox1, bbox2):
    # 中心坐标距离
    centX1 = (bbox1[0] + bbox1[2]) / 2
    centY1 = (bbox1[1] + bbox1[3]) / 2
    centX2 = (bbox2[0] + bbox2[2]) / 2
    centY2 = (bbox2[1] + bbox2[3]) / 2
    distC = (centX1 - centX2) ** 2 + (centY1 - centY2) ** 2
    # 对角线距离
    minX = min(bbox1[0], bbox2[0])
    minY = min(bbox1[1], bbox2[1])
    maxX = max(bbox1[2], bbox2[2])
    maxY = max(bbox1[3], bbox2[3])
    distD = (minX - maxX) ** 2 + (minY - maxY) ** 2
    # R部分
    diff = distC / (distD + 1e-16)
    # 返回DIoU
    return 1 - interOverUnion(bbox1, bbox2) + diff

(四) C I o U {\rm CIoU}

# 假设bbox1为标注框,bbox2为候选框
def cIoU(bbox1, bbox2):
    # v
    v = 4 / (math.pi ** 2) * (math.atan((bbox1[2] - bbox1[0]) / (bbox1[3] - bbox1[1] + 1e-16))
                              - math.atan((bbox2[2] - bbox2[0]) / (bbox2[3] - bbox2[1] + 1e-16)))
    # α
    a = v / ((1 - interOverUnion(bbox1, bbox2)) + v + 1e-16)
    # 返回cIoU
    return dIoU(bbox1, bbox2) + a * v

(五) N M S {\rm NMS}

def nms(bboxes, scores, threshold=0.7):
    x1 = bboxes[:, 0]
    y1 = bboxes[:, 1]
    x2 = bboxes[:, 2]
    y2 = bboxes[:, 3]
    # 计算面积
    area = (x2 - x1) * (y2 - y1)
    # 排序
    _, idx = scores.sort(0, descending=True)
    # 用于保存结果索引
    keep = []
    while idx.numel() > 0:
        # 取置信度最高元素索引并保存
        i = idx[0].item()
        keep.append(i)
        # 计算当前框与其余框的IoU
        """
        求交集区域面积,与上述求IoU值时的交集一样,这里同时对多个矩形计算
        clamp(min=a,max=b)函数限制元素在区间[a,b]内
        nonzero()返回非0索引
        squeeze()删除单维条目,如[[0,0]].squeeze() => [0,0]
        """
        xx1 = x1[idx[1:]].clamp(max=(x1[i]))
        yy1 = y1[idx[1:]].clamp(max=(y1[i]))
        xx2 = x2[idx[1:]].clamp(min=(x2[i]))
        yy2 = y2[idx[1:]].clamp(min=(y2[i]))
        it = (xx2 - xx1).clamp(min=0) * (yy2 - yy1).clamp(min=0)
        iou = it / (area[i] + area[idx[1:]] - it + 1e-16)
        index = (iou <= threshold).nonzero().squeeze()
        # 这时第0位置元素处理完毕,索引向后移处理下一个元素
        idx = idx[index + 1]
    return keep

程序结果如下:
在这里插入图片描述

图10:NMS处理结果


参考

  1. https://arxiv.xilesou.top/abs/1911.08287.
  2. https://blog.csdn.net/shuzfan/article/details/52711706.
  3. https://www.bbsmax.com/A/kjdwQKyOJN/.
  4. https://zhuanlan.zhihu.com/p/54709759.


发布了12 篇原创文章 · 获赞 0 · 访问量 623

猜你喜欢

转载自blog.csdn.net/Skies_/article/details/104716758