目标检测损失函数GIoU,DIoU,CIoU
1. GIoU
1.1. 问题提出
1.1.1. 范数损失的缺陷
在GIoU之前,主要是以IoU或者 l n n o r m l_n norm lnnorm作为损失函数的,而这些损失函数实际上是不够精细的。也就是说,即使观感上的差距很大,损失的值也会相同。以giou论文里举出的(a)图为例:
此时以 l 2 n o r m l_2norm l2norm作为损失函数(也就是两对点之间的欧氏距离),为了简便起见,固定一个点不动(假设是左下角的点不动),以另一个点为圆心,做一个半径为r的圆,那么此时落在圆上的任意一点与固定点组成的bbox(黑色)和ground truth(绿色)之间的 l 2 n o r m l_2 norm l2norm损失值都是相同的(如a所示),在观感上,我们可能会趋向于最右侧的预测结果,但是在计算机使用 l 2 l_2 l2损失的时候是无法区分的。
1.1.2. IoU损失的缺陷
Iou只在bbox和gt之间有交集的时候才会生效,在他们没有交集的时候IoU始终为0,这样不能为反向传播时提供响应的梯度。例如下面的情况,IoU都为0,此时很难让网络进行调整。
1.2. 解决方案
针对IoU不能适应无交集的问题,提出了最小凸包的方案。
所谓的最小凸集就是恰好包含了gt和bbox的一个矩形,如下图所示,红色就是最小凸集。
而 G I o U = I o U − C − ( A ∪ B ) C GIoU= IoU - \frac {C-(A \cup B)} {C} GIoU=IoU−CC−(A∪B)
在最小凸集的基础上,就解决了在gt与bbox无交集时梯度为0的问题。GIoU实际上就是在最小化这个最小凸集。
1.3 算法与代码
简单实现了以下原论文里的算法,原算法如下:
代码如下:
def getConvexShape(bbox_gt,bbox_pd):
return [min(bbox_gt[0],bbox_pd[0]),min(bbox_gt[1],bbox_pd[1]),max(bbox_gt[2],bbox_pd[2]),max(bbox_gt[3],bbox_pd[3])