目标检测中的损失函数(一) | IoU GIoU DIoU CIoU EIoU Focal-EIoU

🚀该系列将会持续整理和更新BBR相关的问题,如有错误和不足恳请大家指正,欢迎讨论!!!

📦目标检测的损失函数一般包含三个部分,分别是边界框损失也可称为定位损失、置信度损失和分类损失,这一小节主要讲解一下边界框损失!

首先,边界框损失也就是目标检测中的边界框回归任务(bounding box regression, BBR),之前用的最广泛的就是n范数损失,目前基本就是关于IoU相关的损失了。n范数损失可以参考一些文献,比如发表在2015年CVPR会议上的《Fast R-CNN》。

接下来,先回顾一下n范数损失,一般有L1loss、L2loss和L\inftyloss。

L1loss(绝对值损失) L_{1}=\sum \left | y_{i} - \hat{y_{i} } \right |,其中y_{i}是真值,\hat{y_{i}}是预测值;对于异常较为鲁棒,但不处处可导;

L2loss(平方损失) L_{1}=\sum ( y_{i} - \hat{y_{i} } )^2,其中y_{i}是真值,\hat{y_{i}}是预测值;对于异常比较敏感;

L\inftyloss(最大模损失) 考虑的是预测值与真实值之间差的最大绝对值,适用于最小化最大误差。

BBR相关的任务可追溯到YOLOv1中,使用平方误差来计算边界框的位置损失,即预测框与真实框之间的中心坐标(x, y)和宽高(w, h)的误差,弥补了尺度敏感性。这种计算两个bbox相似度有一定的局限性,导致定位不准,所以在2016年,由UIUC和旷视发表的论文引入了IoU损失,就是用1减去IoU取个均值就ok了。《UnitBox: An Advanced Object Detection Network》

 

但是,将IoU作为loss的话,会有一个问题就是预测框和真实框之间不重叠,IoU值为0,两个框之间的距离无法确定,梯度将为0,无法优化。

在2019年,斯坦福在CVPR上发表了一篇论文,提出了GIoU,取预测框和真实框的最小外接边界框加入运算。《Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression》

    具体计算如下: 

GIoU loss通常不能很好地收敛,导致检测不准确。 2019年,天津大学发表在AAAI上的一篇论文《Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression》提出了DIoU和CIoU。DIoU考虑了两个边界框(预测和真实的)中心点坐标之间的距离,CIoU包含了三个几何测度,分别是预测和真实边界框之间的重叠面积、中心点坐标之间的距离和纵横比。

具体计算如下: 

然而CIoU不能有效地测量目标盒和锚点之间的差异,导致BBR模型优化收敛缓慢,定位不准确。2022年,CASIA在《 Neurocomputing》上发表了一篇论文《Focal and Efficient IOU Loss for Accurate Bounding Box Regression》提出了一种有效的联合交集(EIOU)损失,它明确地衡量了BBR中三个几何因素的差异,即重叠区域、中心点和边长。之后,针对有效的示例挖掘 (EEM) 问题,并提出了一个焦点损失的回归版本解决样本不平衡问题,以使回归过程专注于高质量的锚框。最后,将上述两个部分组合起来得到一个新的损失函数,即Focal-EIOU损失。 EIoU其实就是将CIoU中的纵横比修改为了优化框的宽度和高度的差异。

 在ultralytics-main/ultralytics/utils/metrics.py中的实现:

def bbox_iou(box1, box2, xywh=True, GIoU=False, DIoU=False, CIoU=False, EIoU=False, Focal=False, eps=1e-7):# Returns Intersection over Union (IoU) of box1(1,4) to box2(n,4)# Get the coordinates of bounding boxesif xywh:  # transform from xywh to xyxy(x1, y1, w1, h1), (x2, y2, w2, h2) = box1.chunk(4, -1), box2.chunk(4, -1)w1_, h1_, w2_, h2_ = w1 / 2, h1 / 2, w2 / 2, h2 / 2b1_x1, b1_x2, b1_y1, b1_y2 = x1 - w1_, x1 + w1_, y1 - h1_, y1 + h1_b2_x1, b2_x2, b2_y1, b2_y2 = x2 - w2_, x2 + w2_, y2 - h2_, y2 + h2_else:  # x1, y1, x2, y2 = box1b1_x1, b1_y1, b1_x2, b1_y2 = box1.chunk(4, -1)b2_x1, b2_y1, b2_x2, b2_y2 = box2.chunk(4, -1)w1, h1 = b1_x2 - b1_x1, (b1_y2 - b1_y1).clamp(eps)w2, h2 = b2_x2 - b2_x1, (b2_y2 - b2_y1).clamp(eps)# Intersection areainter = (b1_x2.minimum(b2_x2) - b1_x1.maximum(b2_x1)).clamp(0) * \(b1_y2.minimum(b2_y2) - b1_y1.maximum(b2_y1)).clamp(0)# Union Areaunion = w1 * h1 + w2 * h2 - inter + eps# IoUiou = inter / unionif CIoU or DIoU or GIoU or EIoU:cw = b1_x2.maximum(b2_x2) - b1_x1.minimum(b2_x1)  # convex (smallest enclosing box) widthch = b1_y2.maximum(b2_y2) - b1_y1.minimum(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 dist ** 2if CIoU:  # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47v = (4 / math.pi ** 2) * (torch.atan(w2 / h2) - torch.atan(w1 / h1)).pow(2)with torch.no_grad():alpha = v / (v - iou + (1 + eps))if 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 + epsif Focal:return iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2), torch.pow(inter / (union + eps), 0.5)  # Focal_EIoUelse:return iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2) # EIoUreturn iou - (rho2 / c2 + v * alpha)  # CIoUreturn iou - rho2 / c2  # DIoUc_area = cw * ch + eps  # convex areareturn iou - (c_area - union) / c_area  # GIoU https://arxiv.org/pdf/1902.09630.pdfreturn iou  # IoU

在ultralytics-main/ultralytics/utils/loss.py中的调用: 

# iou = bbox_iou(pbox, tbox[i], CIoU=True).squeeze()  # iou(prediction, target)
# lbox += (1.0 - iou).mean()  # iou lossiou = bbox_iou(pbox, tbox[i], EIoU=True, Focal=True).squeeze()  # iou(prediction, target)
if type(iou) is tuple:lbox += (iou[1].detach() * (1.0 - iou[0])).mean()
else:lbox += (1.0 - iou).mean()

 本节的分享就到这里了,后续会继续分享剩下的损失函数!

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

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

相关文章

结构型模式:适配器模式

什么是适配器模式? 适配器模式(Adapter Pattern)是一种常用的结构型设计模式,它的主要作用是将一个类的接口转换成客户端期望的另一个接口。就像现实生活中的各种转接头一样,适配器模式使得原本因接口不兼容而无法一起…

AI Agent认知框架(ReAct、函数调用、计划与执行、自问自答、批判修正、思维链、思维树详解和对比,最后表格整理总结

以下是主流AI Agent认知框架的详细说明、对比及表格总结: 1. 各认知框架详解 (1) ReAct (Reasoning Action) 定义:结合推理(Reasoning)和行动(Action)的循环过程。核心机制: 模型先推理&…

特征存储的好处:特征存储在机器学习开发中的优势

随着企业寻求提升机器学习生产力和运营能力 (MLOps),特征存储 (Feature Store) 的普及度正在迅速提升。随着 MLOps 技术的进步,特征存储正成为机器学习基础设施的重要组成部分,帮助企业提升模型的性能和解释能力,并加速新模型与生产环境的集成。这些存储充当集中式存储库,…

SPRING-AI 官方事例

springAI 关于最近看了很多SpringAi,阅读很多代码都感觉特别陌生 SpringAI依赖的springBoot版本都是3.3以上, 以及很多SpringAi都是依赖JDK版本最低17, 并且出现了很多新关键字例如 var,record 等写法, 烟花缭乱得lambda 表达式, 到处都是使用build 构…

Visual Studio Code 使用tab键往左和往右缩进内容

使用VSCode写东西,经常遇到多行内容同时缩进的情况,今天写文档的时候就碰到,记录下来: 往右缩进 选中多行内容,点tab键,会整体往右缩进: 往左缩进 选中多行内容,按shifttab&am…

机器学习(7)——K均值聚类

文章目录 1. K均值(K-means)聚类是什么算法?2. 核心思想2. 数学目标3. 算法步骤3.1. 选择K个初始质心:3.2.迭代优化3.3. 重复步骤2和步骤3: 4. 关键参数5. 优缺点6. 改进变种7. K值选择方法8. Python示例9. 应用场景10…

爬虫案例-爬取某企数据

文章目录 1、准备要爬取企业名称数据表2、爬取代码3、查看效果 1、准备要爬取企业名称数据表 企业名称绍兴市袍江王新国家庭农场绍兴市郑杜粮油专业合作社绍兴市越城区兴华家庭农场绍兴市越城区锐意家庭农场绍兴市越城区青甸畈家庭农场绍兴市袍江王新国家庭农场绍兴市袍江月明…

足球 AI 智能体技术解析:从数据采集到比赛预测的全链路架构

一、引言 在足球运动数字化转型的浪潮中,AI 智能体正成为理解比赛、预测赛果的核心技术引擎。本文从工程实现角度,深度解析足球 AI 的技术架构,涵盖数据采集、特征工程、模型构建、实时计算到决策支持的全链路技术方案,揭示其背后…

怎么配置一个kubectl客户端访问多个k8s集群

怎么配置一个kubectl客户端访问多个k8s集群 为什么有的客户端用token也访问不了k8s集群,因为有的是把~/.kube/config文件,改为了~/.kube/.config文件,文件设置成隐藏文件了。 按照kubectl的寻找配置的逻辑,kubectl找不到要访问集群…

[QMT量化交易小白入门]-四十六、年化收益率118%的回测参数,如何用贪心算法挑选50个两两相关性最小的ETF组合

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读准备工作安装所需库导入所需模块下载所有ETF数…

几何编码:启用矢量模式地理空间机器学习

在 ML 模型中使用点、线和多边形,将它们编码为捕捉其空间属性的向量。 自地理信息系统 (GIS) 诞生之初,“栅格模式”和“矢量模式”之间就存在着显著的区别。在栅格模式下,数据以值的形式呈现在规则的网格上。这包括任何形式的图像&#xff0…

Leetcode98、230:二叉搜索树——递归学习

什么是二叉搜索树:右子树节点 > 根节点 > 左子树节点, 二叉搜索树中的搜索,返回给定值val所在的树节点 终止条件为传进来的节点为空、或者节点的值 val值,返回这个节点; 单程递归逻辑:定义一个resu…

每天学一个 Linux 命令(30):cut

​​可访问网站查看,视觉品味拉满: http://www.616vip.cn/30/index.html cut 命令用于从文件或输入流中提取文本的特定部分(如列、字符或字节位置)。它常用于处理结构化数据(如 CSV、TSV)或按固定格式分割的文本。以下是详细说明和示例: 命令格式 cut [选项] [文件...]…

Tauri 2.3.1+Leptos 0.7.8开发桌面应用--Sqlite数据库选中数据的表格输出

在前期工作的基础上(Tauri 2.3.1Leptos 0.7.8开发桌面应用--Sqlite数据库的写入、展示和选择删除_tauri leptos sqlite 选择删除-CSDN博客),实现将选中的数据实时用表格展示出来,效果如下: 1. 后台invoke调用命令 Tau…

使用Tauri 2.3.1+Leptos 0.7.8开发桌面小程序汇总

近期断断续续学习了Rust编程,使用Tauri 2.3.1Leptos 0.7.8开发了一个自用的桌面小程序。Win10操作系统,使用VS Code及rust analyzer插件搭建的开发环境,后期开始使用Roo Code绑定DeepSeek API 辅助编程,对我这个初学者编程帮助很大…

考研英一学习笔记

2024 年全国硕士研究生招生考试 英语(一)试题 (科目代码:201) Section Ⅰ Use of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on the ANS…

【技术笔记】Cadence实现Orcad与Allegro软件交互式布局设置

【技术笔记】Cadence实现Orcad与Allegro软件交互式布局设置 更多内容见专栏:【硬件设计遇到了不少问题】、【Cadence从原理图到PCB设计】 在做硬件pcb设计的时候,原理图选中一个元器件,希望可以再PCB中可以直接选中。 为了达到原理图和PCB两两…

卷积神经网络(CNN)详解

文章目录 引言1.卷积神经网络(CNN)的诞生背景2.卷积神经网络(CNN)介绍2.1 什么是卷积神经网络?2.2 卷积神经网络(CNN)的基本特征2.2.1 局部感知(Local Connectivity)2.2.…

8051单片机所有Keil C51汇编伪指令和C语言关键字大全

8051单片机所有Keil C51汇编伪指令和C语言关键字大全 作者将狼才鲸创建日期2025-04-21 CSDN阅读地址:8051单片机所有Keil汇编伪指令和C语言关键字的详细解释 8051单片机所有Keil汇编伪指令和C语言关键字的详细解释,在Keil已安装文件夹D:\Keil_v5\C51\H…