YOLOv5基础知识入门(5)— 损失函数(IoU、GIoU、DIoU、CIoU和EIoU)

前言:Hello大家好,我是小哥谈。使用YOLOv5训练模型阶段,需要用到损失函数。损失函数是用来衡量模型预测值和真实值不一样的程度,极大程度上决定了模型的性能。本节就给大家介绍IoU系列损失函数,希望大家学习之后能够有所收获!🌈

前期回顾:

           YOLOv5基础知识入门(1)— YOLO算法的发展历程

           YOLOv5基础知识入门(2)— YOLOv5核心基础知识讲解

           YOLOv5基础知识入门(3)— 目标检测相关知识点

           YOLOv5基础知识入门(4)— 神经网络的基本概念与原理

           目录

🚀1.损失函数简介

🚀2.IoU

🚀3.GIoU

🚀4.DIoU

🚀5.CIoU

🚀6.EIoU

🚀7.总结

🚀1.损失函数简介

损失函数(loss function)是用于衡量模型预测结果真实结果之间的差距。损失函数通常是一标量函数,其值越小表示模型的预测结果越接近真实结果,反之则表示预测结果与真实结果之间的差距越大。🎈

使用YOLOv5训练模型的时候,我们需要不断地调整模型的参数,使得模型的预测结果和真实结果之间的差距最小化,损失函数在这个过程中起到了关键的作用。它可以帮助我们衡量模型的预测结果与真实结果之间的差距,并将这个差距转化为一个标量值。我们可以使用这个标量值来评估模型的性能,并根据这个标量值来调整模型的参数。🍓

YOLOv5损失函数包括:

  • classification loss,分类损失
  • localization loss,定位损失(预测边界框与GT之间的误差)
  • confidence loss,置信度损失(框的目标性;objectness of the box)

总体损失函数:Loss = a*classification loss + b*localization loss + c*confidence los 

也即总体损失函数为三个损失函数的加权和,通常置信度损失函数取最大权重,矩形框损失函数和分类损失的权重次之。🌷


🚀2.IoU

IoU(Intersection over Union),为两个方框相交区域面积相并区域面积的比值,所以也称为交并比。❤️

🍀计算公式:

🍀不足之处:

具体如下图所示:👇

(1)即状态1的情况,当预测框和目标框不相交时,IOU=0,无法反应两个框距离的远近,此时损失函数不可导,IOU_Loss无法优化两个框不相交的情况。 🍬

(2)即状态2状态3的情况,当两个预测框大小相同,两个IOU也相同,IOU_Loss无法区分两者相交情况的不同。因此2019年出现了GIOU_Loss来进行改进。 🍬

 🍀Pytorch代码:

def IoU(box1, box2):b1_x1, b1_y1, b1_x2, b1_y2 = box1b2_x1, b2_y1, b2_x2, b2_y2 = box2xx1 = np.maximum(b1_x1, b2_x1)yy1 = np.maximum(b1_y1, b2_y1)xx2 = np.minimum(b1_x2, b2_x2)yy2 = np.minimum(b1_y2, b2_y2)w = np.maximum(0.0, yy2 - yy1)h = np.maximum(0.0, xx2 - xx1)inter = w * hIoU = inter/((b1_x2-b1_x1)*(b1_y2-b1_y1) + (b2_x2-b2_x1)*(b2_y2-b2_y1) - inter)print("IoU: ", IoU)if __name__ == "__main__":box1 = np.array([100, 100, 210, 210])box2 = np.array([150, 150, 230, 220])IoU(box1, box2)

🚀3.GIoU

GIOU(Generalized-IoU),GIoU比IoU多了一个“Generalized”,能在更广义的层面上计算IoU。当检测框和真实框没有出现重叠的时候IoU的loss都是一样的,因此GIoU就引入了最小封闭形状C(C可以把A,B包含在内),在不重叠情况下能让预测框尽可能朝着真实框前进,这样就可以解决检测框和真实框没有重叠的问题 。🍁

🍀计算公式:

如上图所示,GIOU在IOU的基础上,把包围矩形框A和矩形框B的最小矩形框(图中的虚线框)的面积也加入到计算中。🔖

GIOU可按下式计算,其中S1为A、B相交部分的面积(红色区域)。其中S3为包围A、B的最小矩形框的面积,S2为A、B相并区域的面积(蓝色+红色+灰色区域)。🗼

由上式可知GIOU相比IOU,新增了(S3-S2)/S3这一项。新增项表示什么意义呢?❓❓❓

由上述可知S3-S2为虚线框中白色区域的面积,也即虚线框中不属于A也不属于B的空白区域,那么(S3-S2)/S3就是空白区域面积占虚线框面积的比例,这个比例越大说明A、B距离越远、重叠度越小,反之则A、B距离越近、重叠度越大。📬

GIOU的取值范围是-1~1,当A、B完全没有重叠区域时IOU为0,那么GIOU取负值,极端情况,当A、B无重叠区域且距离无限远时,此时(S3-S2)/S3等于1,那么GIOU取-1;另一个极端情况,当A、B完全重叠时(S3-S2)/S3等于0,IOU为1,那么GIOU取1。🌻

因此,GIOU解决了当A、B完全没有重叠区域时IOU恒为0的问题。

最后得到GIOU loss的计算公式:

🍀不足之处:

状态1、2、3都是预测框在目标框内部且预测框大小一致的情况,这时预测框和目标框的差集都是相同的,因此这三种状态的GIOU值也都是相同的,这时GIOU退化成了IOU,无法区分相对位置关系。 基于这个问题,2020年的AAAI又提出了DIOU_Loss。

🍀Pytorch代码:

def GIoU(box1, box2):b1_x1, b1_y1, b1_x2, b1_y2 = box1b2_x1, b2_y1, b2_x2, b2_y2 = box2# IOUxx1 = np.maximum(b1_x1, b2_x1)yy1 = np.maximum(b1_y1, b2_y1)xx2 = np.minimum(b1_x2, b2_x2)yy2 = np.minimum(b1_y2, b2_y2)inter_w = np.maximum(0.0, yy2 - yy1)inter_h = np.maximum(0.0, xx2 - xx1)inter = inter_w * inter_hUnion = (b1_x2-b1_x1)*(b1_y2-b1_y1) + (b2_x2-b2_x1)*(b2_y2-b2_y1) - inter# GIOUC_xx1 = np.minimum(b1_x1, b2_x1)C_yy1 = np.minimum(b1_y1, b2_y1)C_xx2 = np.maximum(b1_x2, b2_x2)C_yy2 = np.maximum(b1_y2, b2_y2)C_area = (C_xx2 - C_xx1) * (C_yy2 - C_yy1)IOU = inter / UnionGIOU = IOU - abs((C_area-Union)/C_area)print("GIOU:", GIOU)if __name__ == "__main__":box1 = np.array([100, 100, 210, 210])box2 = np.array([150, 150, 230, 220])GIoU(box1, box2)

🚀4.DIoU

DIoU(Distance-IoU),考虑到GIoU的缺点,也是增加了C检测框,将真实框和预测框都包含了进来,但是DIoU计算的不是框之间的交并,而是计算的每个检测框之间的欧氏距离。DIoU要比GIou更加符合目标框回归的机制,将目标与anchor之间的距离,重叠率以及尺度都考虑进去,使得目标框回归变得更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题。🌳

 🍀计算公式:

DIOU把矩形框A、B的中心点距离ρ、外接矩形框(虚线框)的对角线长度c都直接考虑进去,如下图所示:👇

DIOU可按下式计算:

由上式可知DIOU的取值范围也为-1~1,当两个框A、B完全重合时DIOU取1,当A、B距离无限远时,DIOU取-1。

从而得到DIOU loss的计算公式:

 🍀不足之处:

DIoU考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量2个框的距离,因此DIoU收敛的更快,但并没有考虑到长宽比。💞

 🍀Pytorch代码:

def DIoU(box1, box2):b1_x1, b1_y1, b1_x2, b1_y2 = box1b2_x1, b2_y1, b2_x2, b2_y2 = box2# IOUxx1 = np.maximum(b1_x1, b2_x1)yy1 = np.maximum(b1_y1, b2_y1)xx2 = np.minimum(b1_x2, b2_x2)yy2 = np.minimum(b1_y2, b2_y2)inter_w = np.maximum(0.0, xx2 - xx1)inter_h = np.maximum(0.0, yy2 - yy1)inter = inter_w * inter_hUnion = (b1_x2 - b1_x1)*(b1_y2 - b1_y1) + (b2_x2 - b2_x1)*(b2_y2 - b2_y1) - inter# DISTANCEC_xx1 = np.minimum(b1_x1, b2_x1)C_yy1 = np.minimum(b1_y1, b2_y1)C_xx2 = np.maximum(b1_x2, b2_x2)C_yy2 = np.maximum(b1_y2, b2_y2)C_area = (C_xx2 - C_xx1) * (C_yy2 - C_yy1)center_b_x = (b1_x1+b1_x2)/2center_b_y = (b1_y1+b1_y2)/2center_gtb_x = (b2_x1+b2_x2)/2center_gtb_y = (b2_y1+b2_y2)/2center_distance = (center_gtb_x-center_b_x)**2 + (center_gtb_y-center_b_y)**2c_distance = (C_xx2 - C_xx1)**2 + (C_yy2 - C_yy1)**2IOU = inter/UnionDIOU = IOU - center_distance /c_distanceprint("DIOU:", DIOU)if __name__ == "__main__":box1 = np.array([100, 100, 210, 210])box2 = np.array([150, 150, 230, 220])DIoU(box1, box2)

🚀5.CIoU

CIoU(Complete-IoU),就是在DIoU的基础上增加了检测框尺度的loss增加了长和宽的loss,使得目标框回归更加稳定,不会像IoU和GIoU一样出现训练过程中发散等问题。💞

🍀计算公式:

CIOU Loss 和 DIOU Loss 前面的公式都是一样的,不过在此基础上还增加了一个影响因子,这样CIOU_Loss就将目标框回归函数应该考虑三个重要几何因素重叠面积中心点距离长宽比全都考虑进去了。🐳

由以上可得CIOU loss的计算公式为:

 🍀不足之处:

(1)如果预测框和ground truth框的长宽比是相同的,那么长宽比的惩罚项恒为0,不合理。

(2)观察CIoU中w, h相对于v的梯度,发现这两个梯度是一对相反数,也就是说,w和h不能同时增大或减小,这显然也不够合理的。

 🍀Pytorch代码:

def CIoU(box1, box2):b1_x1, b1_y1, b1_x2, b1_y2 = box1b2_x1, b2_y1, b2_x2, b2_y2 = box2# IOUxx1 = np.maximum(b1_x1, b2_x1)yy1 = np.maximum(b1_y1, b2_y1)xx2 = np.minimum(b1_x2, b2_x2)yy2 = np.minimum(b1_y2, b2_y2)inter_w = np.maximum(0.0, xx2 - xx1)inter_h = np.maximum(0.0, yy2 - yy1)inter = inter_w*inter_hUnion = (b1_x2-b1_x1)*(b1_y2-b1_y1) + (b2_x2-b2_x1)*(b2_y2-b2_y1) - interIOU = inter/UnionC_xx1 = np.minimum(b1_x1, b2_x1)C_yy1 = np.minimum(b1_y1, b2_y1)C_xx2 = np.maximum(b1_x2, b2_x2)C_yy2 = np.maximum(b1_y2, b2_y2)# DISTANCEcenter_b_x = (b1_x1 + b1_x2)/2center_b_y = (b1_y1 + b1_y2)/2center_gtb_x = (b2_x1 + b2_x2)/2center_gtb_y = (b2_y1 + b2_y2)/2C_area = (C_xx2-C_xx1)*(C_yy2-C_yy1)Distance = (center_gtb_x-center_b_x)**2 + (center_gtb_y-center_b_y)**2Distance_area = Distance/C_area**2# aspect ratiopred_w = b1_y2 - b1_y1pred_h = b1_x2 - b1_x1gt_w = b2_y2 - b2_y1gt_h = b2_x2 - b2_x1v = (4/(np.pi)**2)*(np.arctan(gt_w/gt_h) - np.arctan(pred_w/pred_h))**2alpha = v/((1-IOU) + v)CIOU = IOU - Distance_area - alpha*vprint("CIOU:", CIOU)if __name__ == "__main__":box1 = np.array([100, 100, 210, 210])box2 = np.array([150, 150, 230, 220])CIoU(box1, box2)

🚀6.EIoU

EIOU 是在 CIOU 的惩罚项基础上将预测框和真实框的纵横比的影响因子拆开,分别计算预测框和真实框的长和宽,来解决 CIOU 存在的问题。🌾

EIoU包括三个部分IoU损失、距离损失、高宽损失(重叠面积、中心点举例、高宽比)。高宽损失直接最小化了预测目标边界框和真实边界框的高度和宽度的差异,使其有更快的收敛速度和更好的定位结果。🌾

🍀计算公式:

其中,wchc是预测边界框与真实边界框的最小外接矩形的宽度和高度。p是两点之间的欧氏距离。 🌴

🍀Pytorch代码:

def bbox_iou(box1, box2, x1y1x2y2=True, GIoU=False, DIoU=False, CIoU=False,  EIoU=False, eps=1e-7):# Returns the IoU of box1 to box2. box1 is 4, box2 is nx4box2 = box2.T# Get the coordinates of bounding boxesif x1y1x2y2:  # x1, y1, x2, y2 = box1b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1[2], box1[3]b2_x1, b2_y1, b2_x2, b2_y2 = box2[0], box2[1], box2[2], box2[3]else:  # transform from xywh to xyxyb1_x1, b1_x2 = box1[0] - box1[2] / 2, box1[0] + box1[2] / 2b1_y1, b1_y2 = box1[1] - box1[3] / 2, box1[1] + box1[3] / 2b2_x1, b2_x2 = box2[0] - box2[2] / 2, box2[0] + box2[2] / 2b2_y1, b2_y2 = box2[1] - box2[3] / 2, box2[1] + box2[3] / 2# Intersection areainter = (torch.min(b1_x2, b2_x2) - torch.max(b1_x1, b2_x1)).clamp(0) * \(torch.min(b1_y2, b2_y2) - torch.max(b1_y1, b2_y1)).clamp(0)# Union Areaw1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + epsw2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + epsunion = w1 * h1 + w2 * h2 - inter + epsiou = inter / unionif GIoU or DIoU or CIoU or EIoU:cw = torch.max(b1_x2, b2_x2) - torch.min(b1_x1, b2_x1)  # convex (smallest enclosing box) widthch = torch.max(b1_y2, b2_y2) - torch.min(b1_y1, b2_y1)  # convex heightif CIoU or DIoU or EIoU:  # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1c2 = cw ** 2 + ch ** 2 + eps  # convex diagonal squaredrho2 = ((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 +(b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4  # center distance squaredif DIoU:return iou - rho2 / c2  # DIoUelif CIoU:  # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47v = (4 / math.pi ** 2) * torch.pow(torch.atan(w2 / h2) - torch.atan(w1 / h1), 2)with torch.no_grad():alpha = v / (v - iou + (1 + eps))return iou - (rho2 / c2 + v * alpha)  # CIoUelif EIoU:rho_w2 = ((b2_x2 - b2_x1) - (b1_x2 - b1_x1)) ** 2rho_h2 = ((b2_y2 - b2_y1) - (b1_y2 - b1_y1)) ** 2cw2 = cw ** 2 + epsch2 = ch ** 2 + epsreturn iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2)else:  # GIoU https://arxiv.org/pdf/1902.09630.pdfc_area = cw * ch + eps  # convex areareturn iou - (c_area - union) / c_area  # GIoUelse:return iou  # IoU

🚀7.总结

边界框回归的三大几何因素:重叠面积中心点距离纵横比🍒🍒🍒

IOU Loss:主要考虑检测框和目标框重叠面积
GIOU Loss:在IOU的基础上,解决边界框不相交时loss等于0的问题
DIOU Loss:在IOU和GIOU的基础上,考虑边界框中心点距离的信息
CIOU Loss:在DIOU的基础上,考虑边界框宽高比的尺度信息。
EIOU Loss:在CIOU的基础上,解决了纵横比的模糊定义,并添加Focal Loss解决BBox回归中的样本不平衡问题。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/87047.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构刷题训练——链表篇(三)

目录 文章目录 前言 1. 题目一:环形链表Ⅱ 1.1 思路 1.2 分析 1.3 题解 1.4 方法二 2. 题目二:复制带随机指针的链表 2.1 思路 2.2 分析 2.3 题解 总结 前言 在这个专栏博客中,我们将提供丰富的题目资源和解题思路,帮助读者逐步提…

什么是React?React与VU的优缺点有哪些?

什么是React?什么是VUE? 维基百科上的概念解释,Vue.js是一个用于创建用户界面的开源MVVM前端JavaScript框架,也是一个创建单页应用的Web应用框架。Vue.js由尤雨溪(Evan You)创建,由他和其他活跃…

探究使用HTTP代理ip后无法访问网站的原因与解决方案

目录 访问网站的原理是什么 1. DNS解析 2. 建立TCP连接 3. 发送HTTP请求: 4. 服务器响应: 5. 浏览器渲染: 6. 页面展示: 使用代理IP后访问不了网站,有哪些方面的原因 1. 代理IP的可用性: 2. 代理…

在单元测试中使用Jest模拟VS Code extension API

对VS Code extension进行单元测试时通常会遇到一个问题,代码中所使用的VS Code编辑器的功能都依赖于vscode库,但是我们在单元测试中并没有添加对vscode库的依赖,所以导致运行单元测试时出错。由于vscode库是作为第三方依赖被引入到我们的VS C…

3.1 Spring MVC概述

1. MVC概念 MVC是一种编程思想,它将应用分为模型(Model)、视图(View)、控制器(Controller)三个层次,这三部分以最低的耦合进行协同工作,从而提高应用的可扩展性及可维护…

【Archaius技术专题】「Netflix原生态」动态化配置服务之微服务配置组件变色龙

前提介绍 如果要设计开发一套微服务基础架构,参数化配置是一个非常重要的点,而Netflix也开源了一个叫变色龙Archaius的配置中心客户端,而且Archaius可以说是比其他客户端具备更多生产级特性,也更灵活。*在NetflixOSS微服务技术栈…

资源限制类题目解法,看这一篇就够了!

算法拾遗三十七资源限制类题目 资源限制技巧汇总32位无符号整数的范围是0~4,294,967,295,现在有一个正好包含40亿个无符号整数的文件,可以使用最多1GB的内存,怎么找到出现次数最多的数32位无符号整数的范围是0~4294967295,现在又一…

人工智能讲师AIGC讲师叶梓:大模型这么火,我们在使用时应该关注些什么?-2

以下为叶老师讲义分享: P6-P9 一些考验大模型的经典问题: 1、鲁迅与周树人是同一个人吗?2、圆周率的最后一位3、蓝牙耳机坏了4、最新的:奶奶的睡前故事 关于事实的问答结果: 知识的时效性: 未完,下一章继续……

【Unity实战系列】Unity的下载安装以及汉化教程

君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,怎么说呢,其实这才是我以后真正想写想做的东西,虽然才刚开始,但好歹,我总算是启程了。今天要分享…

数据库活动监控(DAM)

在当今数据驱动的世界中,组织在保护存储在数据库中的机密数据并确保其完整性方面面临着越来越多的挑战。数据库审计通过提供全面的数据库活动监控方法,在应对这些挑战方面发挥着至关重要的作用。 数据库活动监控(Database Activity Monitori…

2023河南萌新联赛第(五)场:郑州轻工业大学-F 布鲁特佛斯

2023河南萌新联赛第(五)场:郑州轻工业大学-F 布鲁特佛斯 https://ac.nowcoder.com/acm/contest/62977/F 文章目录 2023河南萌新联赛第(五)场:郑州轻工业大学-F 布鲁特佛斯题意解题思路代码 题意 给定一个…

SpringCloudGateway配置跨域设置以及如何本地测试跨域

问题背景 有个服务A ,自身对外提供服务,几个系统的前端页面也在调用,使用springboot 2.6.8开发的,自身因为有前端直接调用已经配置了跨域。 现在有网关服务,一部分前端通过网关访问服务A(因为之前没有网关…

预测知识 | 预测技术流程及模型评价

预测知识 | 预测技术流程及模型评价 目录 预测知识 | 预测技术流程及模型评价技术流程模型评价参考资料 技术流程 1)模型训练阶段:预测因素和结局,再加上预测模型进行模型拟合; 2)预测阶段:将预测因素代入拟…

大数据课程I2——Kafka的架构

文章作者邮箱:yugongshiyesina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Kafka的架构; ⚪ 掌握Kafka的Topic与Partition; 一、Kafka核心概念及操作 1. producer生产者,可以是一个测试线程,也…

web-xss

目录 一、简介 二、xss的攻击方式 三、xss 常见标签语句 a标签 img标签 iframe标签 audio标签 video标签 svg标签 button标签 div标签 object标签 script标签 p标签 input标签 details标签 select标签 form标签 body标签 四、xss 常见绕过 编码绕过 1.htm…

(5)所有角色数据分析页面的构建-5

所有角色数据分析页面,包括一个时间轴柱状图、六个散点图、六个柱状图(每个属性角色的生命值/防御力/攻击力的max与min的对比)。 """绘图""" from pyecharts.charts import Timeline from find_type import FindType import pandas …

模仿火星科技 基于cesium+角度测量+高度测量+可编辑

1. 创建提示窗: 启动Cesium应用,地图场景将打开,欢迎您进入编辑模式。 在屏幕的一角,一个友好的提示窗将呈现,随着您的操作,它会为您提供有用的信息和指导。 2. 绘制面积: 轻轻点击鼠标左键&a…

iOS- git对单个或者多个文件权限设置,使用pre-commit hook 和shell脚本,拦截校验

前提:最近,由于团队代码规范和安全问题,有一些文件只能是指定用户才能修改。 对比:调查了一下资料,发现好多人都在使用pre-commit技术。于是,就朝着这个方向去研究。于是抽空写了脚本,在提交的…

【golang】数组和切片底层原理

数组类型的值(以下简称数组)的长度是固定的,而切片类型的值(以下简称切片)是可变长的。 数组的长度在声明它的时候就必须给定,并且之后不会再改变。可以说,数组的长度是其类型的一部分。比如&a…

【C语言】扫雷 小游戏

文章目录 一、游戏规则二、 代码逻辑三、游戏实现1. 游戏菜单设计2.设计雷区并随机布置雷(1) 设置雷区(2) 布置雷 3.排查雷 四、源码 一、游戏规则 1. 在9*9的小格子中,任意选取一个坐标(格子),选择后发现,如果没点中雷…