目标检测回归框损失函数解读——IoU、GIoU、DIoU、CIoU及Python代码
2023-10-24 03:10:58
目标检测是计算机视觉领域的核心任务之一,其目的是在图像或视频中定位并分类目标物体。在目标检测算法中,回归框损失函数是衡量预测框和真实框之间差异的关键因素,对于算法的精度和鲁棒性至关重要。本文将深入探讨当前目标检测算法中回归框损失函数的发展、原理和代码实现,帮助读者深入了解Smooth L1、L2、IoU、GIoU、DIoU和CIoU Loss等函数。
一、Smooth L1 Loss
Smooth L1 Loss是目标检测回归框损失函数中最基本也是最常用的函数之一。其公式如下:
\\ L_{smooth\ L1}(p, g) = \frac{1}{N} \sum_{i=1}^{N} \begin{cases} 0.5p_i^2, & |p_i| < 1 \\\ |p_i| - 0.5, & \text{otherwise} \end{cases}
其中,p表示预测框和真实框之间的偏移量,g表示真实框的大小。Smooth L1 Loss在p较小时使用二次函数,而在p较大时使用线性函数,可以有效地减少回归框损失函数对异常值的敏感性,提高算法的鲁棒性。
二、L2 Loss
L2 Loss是另一个常用的目标检测回归框损失函数,其公式如下:
\\ L_{L2}(p, g) = \frac{1}{N} \sum_{i=1}^{N} p_i^2
L2 Loss简单直观,计算方便,但对于异常值比较敏感,容易受到噪声和离群值的影响。因此,在实际应用中,Smooth L1 Loss通常比L2 Loss更受欢迎。
三、IoU Loss
IoU Loss是衡量预测框和真实框重叠程度的损失函数,其公式如下:
\\ L_{IoU}(p, g) = 1 - IoU(p, g)
其中,IoU表示预测框和真实框的交集面积与并集面积之比。IoU Loss直观易懂,可以有效地衡量预测框和真实框的重叠程度,但其存在两个主要缺点:
- IoU Loss对预测框和真实框的大小非常敏感。当预测框和真实框大小相差较大时,IoU Loss会变得非常大,这可能会导致算法训练不稳定。
- IoU Loss不具有平移不变性。当预测框和真实框发生平移时,IoU Loss会发生改变,这可能会导致算法训练不稳定。
四、GIoU Loss
GIoU Loss是IoU Loss的改进版本,其公式如下:
\\ L_{GIoU}(p, g) = 1 - IoU(p, g) + \frac{|C - (p \cup g)|}{|C|}
其中,C表示预测框和真实框的最小外接矩形。GIoU Loss在IoU Loss的基础上增加了惩罚项,该惩罚项衡量了预测框和真实框之间的空洞区域的大小。与IoU Loss相比,GIoU Loss对预测框和真实框的大小以及平移更加鲁棒。
五、DIoU Loss
DIoU Loss是GIoU Loss的改进版本,其公式如下:
\\ L_{DIoU}(p, g) = 1 - IoU(p, g) + \frac{\rho^2(p, g)}{c^2}
其中,\rho(p, g)表示预测框和真实框的中心点之间的欧氏距离,c表示预测框和真实框的对角线长度。DIoU Loss在GIoU Loss的基础上增加了惩罚项,该惩罚项衡量了预测框和真实框中心点之间的距离。与GIoU Loss相比,DIoU Loss对预测框和真实框的中心点对齐更加鲁棒。
六、CIoU Loss
CIoU Loss是DIoU Loss的改进版本,其公式如下:
\\ L_{CIoU}(p, g) = 1 - IoU(p, g) + \frac{\rho^2(p, g)}{c^2} + \alpha v
其中,\alpha是一个超参数,v表示预测框和真实框的对角线长度之差与预测框和真实框的面积之和之比。CIoU Loss在DIoU Loss的基础上增加了惩罚项,该惩罚项衡量了预测框和真实框的对角线长度之差。与DIoU Loss相比,CIoU Loss对预测框和真实框的形状更加鲁棒。
七、代码实现
以下提供了Smooth L1 Loss、L2 Loss、IoU Loss、GIoU Loss、DIoU Loss和CIoU Loss的Python代码实现:
import numpy as np
def smooth_l1_loss(p, g):
"""
Smooth L1 Loss.
Args:
p: Predictions.
g: Ground truth.
Returns:
Loss.
"""
return np.where(np.abs(p - g) < 1, 0.5 * (p - g) ** 2, np.abs(p - g) - 0.5)
def l2_loss(p, g):
"""
L2 Loss.
Args:
p: Predictions.
g: Ground truth.
Returns:
Loss.
"""
return (p - g) ** 2
def iou_loss(p, g):
"""
IoU Loss.
Args:
p: Predictions.
g: Ground truth.
Returns:
Loss.
"""
intersection = np.minimum(p, g)
union = np.maximum(p, g)
iou = np.mean(intersection / union)
return 1 - iou
def giou_loss(p, g):
"""
GIoU Loss.
Args:
p: Predictions.
g: Ground truth.
Returns:
Loss.
"""
intersection = np.minimum(p, g)
union = np.maximum(p, g)
iou = np.mean(intersection / union)
c = np.minimum(p, g) + np.maximum(p, g)
return 1 - iou + (c - union) / c
def diou_loss(p, g):
"""
DIoU Loss.
Args:
p: Predictions.
g: Ground truth.
Returns:
Loss.
"""
intersection = np.minimum(p, g)
union = np.maximum(p, g)
iou = np.mean(intersection / union)
p_center = np.mean(p, axis=1)
g_center = np.mean(g, axis=1)
d = np.mean(np.linalg.norm(p_center - g_center, axis=1))
c = np.minimum(p, g) + np.maximum(p, g)
return 1 - iou + d ** 2 / c ** 2
def ciou_loss(p, g):
"""
CIoU Loss.
Args:
p: Predictions.
g: Ground truth.
Returns:
Loss.
"""
intersection = np.minimum(p, g)
union = np.maximum(p, g)
iou = np.mean(intersection / union)
p_center = np.mean(p, axis=1)
g_center = np.mean(g, axis=1)
d = np.mean(np.linalg.norm(p_center - g_center, axis=1))
c = np.minimum(p, g) + np.maximum(p, g)
v = np.abs(np.mean(p, axis=1) - np.mean(g, axis=1)) ** 2 / c ** 2
return 1 - iou + d ** 2 / c ** 2 + v * alpha
八、结论
回归框损失函数是目标检测算法中的关键组件之一,其性能直接影响着算法的精度和鲁棒性。本文介绍了当前目标检测算法中常用的回归框损失函数,包括Smooth L1 Loss、L2 Loss、IoU Loss、GIoU Loss、DIoU Loss和CI