文章目录

  • 1 引言
  • 2 问题分析
  • 3 GIoU Loss计算过程
  • 4 IoU和GIoU对比分析
  • 5 代码实现IoU与GIoU的对比可视化
  • 6 感谢链接

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 Loss 和 IoU Loss。
本文介绍GIoU Loss。

2 问题分析

IoU Loss 存在的问题:

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

3 GIoU Loss计算过程

GIoU Loss计算过程如下:

以上图为例,绿色框表示预测框Bp=(x1p,y1p,x2p,y2p)B^p=(x_1^p,y_1^p,x_2^p,y_2^p)Bp=(x1p​,y1p​,x2p​,y2p​),黑色框表示边界框Bg=(x1g,y1g,x2g,y2g)B^g=(x_1^g,y_1^g,x_2^g,y_2^g)Bg=(x1g​,y1g​,x2g​,y2g​),首先计算IoU:
IoU=IUIoU = \frac{I}{U} IoU=UI​
其中,III 表示:上图中的灰色阴影部分,UUU 表示:两个矩形面积之和(Ap+Ag)(A^p +A^g)(Ap+Ag)减去两个矩形相交的面积 III,因此IoU也可以表示为:

GIoU在IoU基础上,考虑了两个矩形最小闭包(the smallest enclosing convex object,两个矩形的最小外接矩形)的大小,GIoU的计算表达式为:

其中,−1≤GIoU<1-1≤GIoU<1−1≤GIoU<1,AcA^cAc是两个矩形的最小外接矩形的面积,也就是上图中虚线框的面积。

GIoULoss=1−GIoUGIoU Loss = 1-GIoUGIoULoss=1−GIoU
此时0<GIoULoss≤20<GIoU Loss≤20<GIoULoss≤2。

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 cv2def 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)# 计算IOUiou = interArea / float(RecA_Area + RecB_Area - interArea)return ioudef Giou(rec1,rec2):# 分别是矩形左上、右下的坐标x1,y1,x2,y2 = rec1 x3,y3,x4,y4 = rec2iou = 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_2w1 = x2 - x1   #第一个矩形的宽w2 = x4 - x3   #第二个矩形的宽h1 = y1 - y2h2 = y3 - y4W = 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_areareturn giouimg = 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_SIMPLEXcv2.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

【GIoU loss】GIoU loss损失函数理解相关推荐

  1. 【IoU loss】IoU损失函数理解

    文章目录 1 引言 2 问题分析 3 IoU Loss 4 代码演示IoU 5 感谢链接 1 引言 目标检测任务的损失函数由Classificition Loss和Bounding Box Reger ...

  2. 目标检测回归损失函数简介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源:极市平台 目标检测任务的损失函数由Classificitio ...

  3. 目标检测回归损失函数:SmoothL1/IoU/GIoU/DIoU/CIoU Loss

    文章目录 1. Smooth L1 Loss 1.1 假设x为预测框和真实框之间的数值差异,常用的L1和L2 Loss定义为: 1.2 上述的3个损失函数对x的导数分别为: 1.3 实际目标检测框回归 ...

  4. GIOU loss+DIOU loss+CIOU loss

    一.IOU 1.GIOU解决没有交集的框,IOU为0,其损失函数导数为0,无法优化的问题. 图1 GIOU,IOU,l2范数差异 a)可看出 l2值一样,IOU值是不一样的,说明L1,L2这些Loss ...

  5. 【Smooth L1 Loss】Smooth L1损失函数理解

    文章目录 1 引言 2 L1 Loss 3 L2 Loss 4 Smooth L1 Loss 5 曲线对比分析 6 参考链接 1 引言 目标检测任务的损失函数由Classificition Loss和 ...

  6. 理解Hinge Loss (折页损失函数、铰链损失函数)

    理解Hinge Loss (折页损失函数.铰链损失函数) 原文:https://blog.csdn.net/fendegao/article/details/79968994 Hinge Loss 是 ...

  7. 多分类svm的hinge loss公式推导_损失函数—深度学习常见损失函数总结【图像分类|下】...

    点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 学习 笔记 常见损失函数总结-图像分类下篇 一.前言 在深度学习中,损失函数扮演着至关重要的角色.通过最小化损失函数,使模型达到收敛状态,减少模 ...

  8. (HEM/OHEM)hard negative(example)mining难例挖掘 与focal loss、GHM损失函数

    目录 分类任务中的样本不均衡及hard negative mining的必要性 hard negative example HEM(hard example/negative mining) 与 OH ...

  9. 一文理解Ranking Loss/Contrastive Loss/Margin Loss/Triplet Loss/Hinge Loss

    一文理解Ranking Loss/Contrastive Loss/Margin Loss/Triplet Loss/Hinge Loss 翻译自FesianXu, 2020/1/13, 原文链接 h ...

最新文章

  1. (原創) 如何解決移除DSP Builder後,在Matlab殘留錯誤訊息的問題? (SOC) (DSP Builder) (Matlab)...
  2. USTC English Club Note20211108
  3. 【windows】CMake安装小结
  4. Kotlin协程重新认知 CoroutineContext
  5. sklearn中SVM调参说明
  6. 利用HTML5 LocalStorage实现跨页面通信channel
  7. 使用postman调试web API
  8. 移动端安全 - 安卓Android - 工具相关
  9. Knx ip协议和Java实现
  10. win10、Ubuntu双系统删除Ubuntu的方法
  11. 关于Webgl实际中遇到的一些坑,与大家分享。
  12. 大数据技术之_13_Azkaban学习_Azkaban(阿兹卡班)介绍 + Azkaban 安装部署 + Azkaban 实战...
  13. SketchUp2016如何安装插件
  14. python 网易云音乐评论爬取3
  15. 世界顶级黑客Kevin D.Mitnick教你如何在数字世界中真正隐形
  16. 苹果手机忘记Appid怎么办
  17. 服务器查询IPV6地址
  18. _.chunk的用法
  19. 报错ValueError: operands could not be broadcast together with shapes (448,448) with (224,224)
  20. 好风凭借力,送我上青云

热门文章

  1. uniapp实现微信手机号码登录注册注销(bug踩坑)
  2. 如何使用ENVI进行精度验证步骤
  3. Sublime Text - SublimeREPL插件的配置
  4. 信息学奥赛一本通C++语言-----1103:陶陶摘苹果
  5. Scss系列之--lighten darken vs scale-color vs mix()
  6. iFrame嵌套传参
  7. ryzen服务器系列,amd ryzen服务器
  8. java drawimage 效果,Java Graphics.drawImage()如何工作以及ImageObserver的作用是什么
  9. asmi lpar_使用lpar2rrd监视共享处理器池
  10. python抓取新闻【华盛顿邮报】