【基础实操】损失函数:IoU-GIoU-DIoU-CIoU计算复现

简介: 【基础实操】损失函数:IoU-GIoU-DIoU-CIoU计算复现

前言

  损失函数常见于目标检测任务中,其解决问题的效率十分依赖定义的损失函数。关于目标检测损失函数的定义基本可以认定为依赖于边界框回归指标的聚合,例如预测框和真实框(即 GIoU、CIoU、DIoU 等)的距离、重叠区域和纵横比。

  在本文中我们着重点将放在代码实现以及结果展示,关于原理部分大家可自行查阅论文以及相关的论文讲解,我在这里就不过多的炒冷饭了,望海涵!

计算实现

IoU家族代码实现

  关于IoU、GIoU、DIoU和CIoU的代码实现摘录于互联网。结合计算部分的代码采用如图(w=h=300,c=3)进行实验:我们在标注软件上标定企鹅的鼻子部分,标签文件存储为Voc格式,查阅xml文件得到企鹅鼻子(目标位置)的[xmin,ymin,xmax,yxmax]=[105, 100, 195, 133],易得标注框的 w= 90,h=33。

                 image.png

  为了计算的便捷性以及iou贴合度,我们将设定预测框的大小等同于真实目标框,也即 W真 = W 预 & H真 = H预。采用滑动框的方式在图像上进行滑动计算(STEP=1),动图如下:绿色框为目标位置,紫色框为滑动框也就是预测框。

                

计算结果

  计算每一步得到的“iou”值得到如下图,其中在计算iou时出现了负数,我分别将负数未置零以及负数置零绘制了一遍供大家参考。 图像排列顺序为:左上=IOU 右上=GIOU  左下=DIOU 右下=CIOU

未置零图

image.png


置零图

image.png


IOU代码

python

复制代码

import math
from mpmath import eps
from numpy import where, arcsin
def euclidean_distance(p1, p2):
    """计算两个点的欧式距离"""
    x1, y1 = p1
    x2, y2 = p2
    return math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
class BBox(object):
    def __init__(self, x, y, r, b):
        self.x, self.y, self.r, self.b = x, y, r, b
    def __xor__(self, other):
        """计算box和other的IoU"""
        cross = self & other
        union = self | other
        return cross / (union + 1e-6)
    def __or__(self, other):
        """ 计算box和other的并集"""
        cross = self & other
        return self.area + other.area - cross
    def __and__(self, other):
        """计算box和other的交集"""
        xmax = min(self.r, other.r)
        ymax = min(self.b, other.b)
        xmin = max(self.x, other.x)
        ymin = max(self.y, other.y)
        return BBox(xmin, ymin, xmax, ymax).area
    def boundof(self, other):
        """计算box和other的边缘外包框,使得2个box都在框内的最小矩形"""
        xmin = min(self.x, other.x)
        ymin = min(self.y, other.y)
        xmax = max(self.r, other.r)
        ymax = max(self.b, other.b)
        return BBox(xmin, ymin, xmax, ymax)
    def center_distance(self, other):
        """计算两个box的中心点距离"""
        return euclidean_distance(self.center, other.center)
    def bound_diagonal_distance(self, other):
        """计算两个box的bound的对角线距离"""
        bound = self.boundof(other)
        return euclidean_distance((bound.x, bound.y), (bound.r, bound.b))
    @property
    def center(self):
        return (self.x + self.r) / 2, (self.y + self.b) / 2
    @property
    def area(self):
        return self.width * self.height
    @property
    def width(self):
        # todo 如果不考虑右侧的一个像素 返回 self.r - self.x
        return self.r - self.x + 1
    @property
    def height(self):
        # todo 如果不考虑下侧的一个像素 返回 self.b - self.y
        return self.b - self.y + 1
    def __repr__(self):
        return f"{self.x}, {self.y}, {self.r}, {self.b}"
def IoU(box1: BBox, box2: BBox):
    return box1 ^ box2
def GIoU(box1: BBox, box2: BBox):
    bound_area = box1.boundof(box2).area
    union_area = box1 | box2
    return IoU(box1, box2) - (bound_area - union_area) / bound_area
def DIoU(box1: BBox, box2: BBox):
    d = box1.center_distance(box2)
    c = box1.bound_diagonal_distance(box2)
    return IoU(box1, box2) - d ** 2 / c ** 2
def CIoU(box1: BBox, box2: BBox):
    diou = DIoU(box1, box2)
    v = 4 / (math.pi ** 2) * (math.atan(box1.width / box1.height) - math.atan(box2.width / box2.height)) ** 2
    iou = IoU(box1, box2)
    alpha = v / (1 - iou + v)
    return diou - alpha * v

拓展

  大家可以通过本文的计算方法结合自己的项目中IOU计算方式进行替换更改或结合项目做适合自己项目的IOU。本人能力有限,路过的各位大神若发现纰漏的地方还望指教一二!感谢!希望本文能够帮助到大家。


相关文章
|
7月前
|
PyTorch 算法框架/工具
【IOU实验】即插即用!对bubbliiiing的yolo系列代码替换iou计算函数做比对实验(G_C_D_S-IOU)
【IOU实验】即插即用!对bubbliiiing的yolo系列代码替换iou计算函数做比对实验(G_C_D_S-IOU)
115 0
【IOU实验】即插即用!对bubbliiiing的yolo系列代码替换iou计算函数做比对实验(G_C_D_S-IOU)
|
7月前
|
算法 固态存储 计算机视觉
Focaler-IoU开源 | 高于SIoU+关注困难样本,让YOLOv5再涨1.9%,YOLOv8再涨点0.3%
Focaler-IoU开源 | 高于SIoU+关注困难样本,让YOLOv5再涨1.9%,YOLOv8再涨点0.3%
258 0
|
2月前
|
机器学习/深度学习 算法 计算机视觉
边缘检测评估方法:FOM、RMSE、PSNR和SSIM对比实验和理论研究
本文探讨了图像分割与边缘检测之间的关系,并通过实验评估了多种边缘检测指标的有效性。研究发现,常用的RMSE、PSNR和SSIM指标在海岸线检测任务中可能高估性能,而FOM(优点图)指标则能更准确地选择最佳边缘检测参数。实验结果表明,FOM在92.6%的情况下选择了更好的阈值,在66.3%的情况下选择了最佳阈值。此外,FOM通过考虑预测边缘与真实边缘之间的距离,提供了更合理的评估标准。本文不仅对海岸线检测有重要意义,还对医学图像分析、计算机视觉和遥感等多个领域具有广泛的应用价值。作者通过理论分析和实证研究,证明了FOM在边缘检测评估中的优越性。
97 3
边缘检测评估方法:FOM、RMSE、PSNR和SSIM对比实验和理论研究
|
29天前
|
算法 数据可视化 PyTorch
IoU已经out了,试试这几个变体:GIoU、DIoU和CIoU介绍与对比分析
本文探讨了目标检测中常用的交并比(IoU)及其变体,包括广义交并比(GIoU)、距离交并比(DIoU)和完全交并比(CIoU)。这些指标不仅提高了模型在处理不重叠、距离较远或形状差异大的边界框时的表现,还为模型的学习过程提供了更深入的洞察。文章详细解释了各指标的计算方法及应用场景,并提供了相应的代码示例,帮助读者更好地理解和应用这些先进的评估指标。
110 7
IoU已经out了,试试这几个变体:GIoU、DIoU和CIoU介绍与对比分析
|
2月前
|
机器学习/深度学习 算法 PyTorch
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
这篇文章详细介绍了多种用于目标检测任务中的边界框回归损失函数,包括IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU和WIOU,并提供了它们的Pytorch实现代码。
324 1
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
|
7月前
|
计算机视觉
【YOLOv8改进】Inner-IoU: 基于辅助边框的IoU损失(论文笔记+引入代码)
YOLO目标检测专栏探讨了IoU损失的局限性,并提出创新改进。分析发现,不同尺度的辅助边框对高IoU和低IoU样本的回归有不同影响。因此,提出了Inner-IoU Loss,利用尺度因子ratio控制辅助边框大小以优化损失计算。实验验证了该方法能提升检测效果,增强泛化能力。创新点包括根据样本特性选择辅助边框尺度和Inner-IoU Loss的设计。更多详情见YOLO目标检测创新改进与实战案例专栏。
|
7月前
|
机器学习/深度学习 数据可视化 算法
R语言梯度提升机 GBM、支持向量机SVM、正则判别分析RDA模型训练、参数调优化和性能比较可视化分析声纳数据
R语言梯度提升机 GBM、支持向量机SVM、正则判别分析RDA模型训练、参数调优化和性能比较可视化分析声纳数据
|
算法 数据可视化 计算机视觉
再战IOU | 总结分析IOU/GIOU/CIOU局限,提出Focal EIOU进一步提升目标检测性能(二)
再战IOU | 总结分析IOU/GIOU/CIOU局限,提出Focal EIOU进一步提升目标检测性能(二)
364 0
|
算法 计算机视觉
再战IOU | 总结分析IOU/GIOU/CIOU局限,提出Focal EIOU进一步提升目标检测性能(一)
再战IOU | 总结分析IOU/GIOU/CIOU局限,提出Focal EIOU进一步提升目标检测性能(一)
304 0