【GIoU loss】GIoU loss损失函数理解

本文详细介绍了IoU Loss在目标检测中的局限性,随后引入GIoU Loss的计算过程,通过对比分析和可视化展示其如何改进不相交框的评估。GIoU通过最小外接矩形来增强IoU的鲁棒性,适用于优化框的位置精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 引言

目标检测任务的损失函数由Classificition Loss和Bounding Box Regeression Loss两部分构成。

Bounding Box Regression Loss Function的演进路线是:
Smooth L1 Loss --> IoU Loss --> GIoU Loss --> DIoU Loss --> CIoU Loss

之前写到了 Smooth L1 LossIoU Loss
本文介绍GIoU Loss。

2 问题分析

IoU Loss 存在的问题:

  • 当预测框和目标框不相交时 ,IoU(A,B)=0时,不能反映A,B距离的远近,此时损失函数不可导,IoU Loss 无法优化两个框不相交的情况。
  • 假设预测框和目标框的大小都确定,只要两个框的相交值是确定的,那么IoU值就相同,IoU值不能反映两个框是如何相交的

3 GIoU Loss计算过程

GIoU Loss计算过程如下:
在这里插入图片描述
以上图为例,绿色框表示预测框 B p = ( x 1 p , y 1 p , x 2 p , y 2 p ) B^p=(x_1^p,y_1^p,x_2^p,y_2^p) Bp=(x1p,y1p,x2p,y2p),黑色框表示边界框 B g = ( x 1 g , y 1 g , x 2 g , y 2 g ) B^g=(x_1^g,y_1^g,x_2^g,y_2^g) Bg=(x1g,y1g,x2g,y2g),首先计算IoU:
I o U = I U IoU = \frac{I}{U} IoU=UI
其中, I I I 表示:上图中的灰色阴影部分, U U U 表示:两个矩形面积之和 ( A p + A g ) (A^p +A^g) (Ap+Ag)减去两个矩形相交的面积 I I I,因此IoU也可以表示为:
在这里插入图片描述
GIoU在IoU基础上,考虑了两个矩形最小闭包(the smallest enclosing convex object,两个矩形的最小外接矩形)的大小,GIoU的计算表达式为:
在这里插入图片描述
其中, − 1 ≤ G I o U < 1 -1≤GIoU<1 1GIoU<1 A c A^c Ac是两个矩形的最小外接矩形的面积,也就是上图中虚线框的面积。

G I o U L o s s = 1 − G I o U GIoU Loss = 1-GIoU GIoULoss=1GIoU
此时 0 < G I o U L o s s ≤ 2 0<GIoU Loss≤2 0<GIoULoss2

4 IoU和GIoU对比分析

  • 算法计算过程对比:
    在这里插入图片描述
    可见计算GIoU损失的方式其实就是计算GIoU,只不过最终结果返回的是1-GIoU。
    这是因为1-GIoU的取值范围在[0,2]上,且有一定的“距离”性质,即两个框重叠区域越大,损失越小,反之越大。

  • 图看GIoU到底解决了IoU的什么问题
    在这里插入图片描述
    如上图所示,三种不同相对位置的框拥有相同的IoU=0.33值,但是拥有不同的GIoU=0.33,0.24,-0.1。当框的对齐方向更好一些时GIoU的值会更高一些。

5 代码实现IoU与GIoU的对比可视化

很简单,直接看代码注释即可。

import numpy as np
import cv2


def CountIOU(RecA, RecB):
    xA = max(RecA[0], RecB[0])
    yA = max(RecA[1], RecB[1])
    xB = min(RecA[2], RecB[2])
    yB = min(RecA[3], RecB[3])
    # 计算交集部分面积
    interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1)
    # 计算预测值和真实值的面积
    RecA_Area = (RecA[2] - RecA[0] + 1) * (RecA[3] - RecA[1] + 1)
    RecB_Area = (RecB[2] - RecB[0] + 1) * (RecB[3] - RecB[1] + 1)
    # 计算IOU
    iou = interArea / float(RecA_Area + RecB_Area - interArea)
    
    return iou

def Giou(rec1,rec2):
    # 分别是矩形左上、右下的坐标
    x1,y1,x2,y2 = rec1 
    x3,y3,x4,y4 = rec2
    iou = CountIOU(rec1,rec2)
    area_C = (max(x1,x2,x3,x4)-min(x1,x2,x3,x4))*(max(y1,y2,y3,y4)-min(y1,y2,y3,y4))
    area_1 = (x2-x1)*(y1-y2)
    area_2 = (x4-x3)*(y3-y4)
    sum_area = area_1 + area_2

    w1 = x2 - x1   #第一个矩形的宽
    w2 = x4 - x3   #第二个矩形的宽
    h1 = y1 - y2
    h2 = y3 - y4
    W = min(x1,x2,x3,x4)+w1+w2-max(x1,x2,x3,x4)    # 交叉部分的宽
    H = min(y1,y2,y3,y4)+h1+h2-max(y1,y2,y3,y4)    # 交叉部分的高
    # 交叉的面积
    Area = W * H    
    # 两矩形并集的面积
    add_area = sum_area - Area    
    # 闭包区域中不属于两个框的区域占闭包区域的比重
    end_area = (area_C - add_area)/area_C    
    giou = iou - end_area
    return giou


img = np.zeros((512,512,3), np.uint8)   
img.fill(255)

# 分别是矩形左上、右下的坐标
RecA = [30,30,300,300]
RecB = [60,60,350,340]

cv2.rectangle(img, (RecA[0],RecA[1]), (RecA[2],RecA[3]), (0, 255, 0), 5)
cv2.rectangle(img, (RecB[0],RecB[1]), (RecB[2],RecB[3]), (255, 0, 0), 5)

IOU = CountIOU(RecA,RecB)
GIoU = Giou(RecA,RecB)
font = cv2.FONT_HERSHEY_SIMPLEX

cv2.putText(img,"IOU = %.2f"%IOU,(130, 190),font,0.8,(0,0,0),2)
cv2.putText(img,"GIOU = %.2f"%GIoU,(130, 220),font,0.8,(0,0,0),2)

cv2.imshow("image",img)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

6 感谢链接

https://zhuanlan.zhihu.com/p/104236411
https://blog.csdn.net/A_A666/article/details/111504851
https://zhuanlan.zhihu.com/p/94799295
### 回答1: yolov5损失函数中的giou_loss是一种基于Generalized Intersection over Union (GIOU)的损失函数,用于计算目标框与预测框之间的距离。它可以有效地解决目标框与预测框之间的IoU计算不准确的问题,提高目标检测的精度。 ### 回答2: YOLOv5是一种实时目标检测算法,它的损失函数采用了giou_loss。其作用是衡量预测框与真实框之间的精度,并将其用于训练和优化模型。 giou_loss是一个可以评估两个框之间重叠区域的损失函数GIOU指的是Generalized Intersection Over Union,即广义交并比,通过比较两个框之间的交集与并集的差异来计算重叠区域的误差。 这个损失函数分为两部分:IoU lossGIOU regularization。其中IoU loss是传统的交并比损失,来衡量检测框是否正确。而GIOU regularization是为了增加鲁棒性,减少定位误差,所以把预测框的中心点、宽度和高度都纳入了计算范围,得到了更准确的giou_loss,从而提高了模型的性能。 giou_loss的优势在于它的可微分性和强鲁棒性。因为它能够捕捉到预测框与真实框之间的几何关系,所以既能够优化检测的准确度,又能够强化模型对大量不同形态样本的适应能力,从而提高了模型的泛化性能。 总之,giou_loss通过考虑框之间的位置、宽度、高度差异,更好地衡量目标检测算法的准确性和泛化性,并且在YOLOv5模型中得到了成功的应用。 ### 回答3: YOLOv5算法中的损失函数一直是该算法优秀性能的重要因素之一。其中,giou_loss是YOLOv5算法中的一种损失函数,其起到了优化检测算法效果,提高检测精度的作用。 giou_loss为YOLOv5算法的一个重要计算指标,它是用来度量预测框和目标框之间的差异程度。giou_loss的全称是Generalized Intersection over Union(GIoU) Loss,它可以同时考虑两个区域的大小、位置和方向。同时,它还可以惩罚大量预测的框之间的重叠和重叠不够的问题,从而提高模型的检测精度。 具体地说,giou_loss是由IOU衡量两个框的匹配度,IOU计算简单,但不能很好的反应框的旋转情况,因此在IOU的基础上计算giou_loss,他还加入了以下的权重: - 全部包含(C):当预测框完全包含目标框时,该权重应该为1。 - 完全不包含(D):如果预测框和目标框的交集为空,则应该为0。 - 直接重叠(I):当预测框与目标框重叠时(有交集),应计算giou_loss。 - 部分重叠(U-I):预测框和目标框有部分重叠时,而验证框不完全包含目标框时,应考虑该值。 giou_loss考虑了目标和预测的大小、位置和方向,能够更准确地计算检测框和目标框的匹配度,从而能够提高模型的性能。在训练过程中,YOLOv5算法会根据giou_loss指标进行权重更新,从而最大程度地提高检测精度。 总之,giou_loss是YOLOv5算法中非常重要的损失函数之一,它通过综合考虑目标和预测框的大小、位置和方向等多方面因素,对检测算法的检测精度进行了有效的优化。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值