目标检测中的IoU损失函数
目标检测中的IoU损失函数
- 目标检测中的IoU损失函数
- 一、为什么需要IoU损失函数?
- 二、常见IoU损失函数详解
- 1. **IoU Loss**
- 2. **GIoU Loss(Generalized IoU)**
- 3. **DIoU Loss(Distance IoU)**
- 4. **CIoU Loss(Complete IoU)**
- 5. **EIoU Loss(Efficient IoU)**
- 三、对比与选型建议
- 四、代码实现关键点
- 五、总结与讨论
- 参考文献
目标检测中的IoU损失函数
摘要:IoU(交并比)是目标检测中评估预测框与真实框重叠程度的核心指标。本文深入解析5种常见的IoU损失函数(IoU/GIoU/DIoU/CIoU/EIoU),对比其优缺点,并给出代码实现建议。
一、为什么需要IoU损失函数?
在目标检测任务中,边界框回归(Bounding Box Regression)的优化目标是最小化预测框与真实框的差异。传统的L1/L2损失函数存在尺度敏感和物理意义不明确的问题:
- 例如,L2损失对中心点偏移和大小的权重相同,而实际检测任务更关注框的重叠率。
- IoU损失直接优化重叠区域与并集的比例,更符合检测任务的目标。
二、常见IoU损失函数详解
1. IoU Loss
公式:
L IoU = 1 − IoU = 1 − ∣ B ∩ B g t ∣ ∣ B ∪ B g t ∣ \mathcal{L}_{\text{IoU}} = 1 - \text{IoU} = 1 - \frac{|B \cap B_{gt}|}{|B \cup B_{gt}|} LIoU=1−IoU=1−∣B∪Bgt∣∣B∩Bgt∣
优点:
- 直接反映框的重叠程度,与检测指标mAP高度相关。
缺点: - 梯度消失:当两框无重叠时,IoU=0,无法提供梯度;
- 对齐方式不敏感:无法区分中心点偏移与长宽比差异。
2. GIoU Loss(Generalized IoU)
公式:
L GIoU = 1 − GIoU GIoU = IoU − ∣ C − ( B ∪ B g t ) ∣ ∣ C ∣ \mathcal{L}_{\text{GIoU}} = 1 - \text{GIoU} \\ \text{GIoU} = \text{IoU} - \frac{|C - (B \cup B_{gt})|}{|C|} LGIoU=1−GIoUGIoU=IoU−∣C∣∣C−(B∪Bgt)∣
其中, C C C是两框的最小包围矩形面积。
改进点:
- 引入惩罚项 ∣ C − ( B ∪ B g t ) ∣ ∣ C ∣ \frac{|C - (B \cup B_{gt})|}{|C|} ∣C∣∣C−(B∪Bgt)∣,解决无重叠时的梯度问题;
- 当两框完全重合时,GIoU = IoU = 1;完全不相交时,GIoU趋近于-1。
3. DIoU Loss(Distance IoU)
公式:
L DIoU = 1 − IoU + ρ 2 ( b , b g t ) c 2 \mathcal{L}_{\text{DIoU}} = 1 - \text{IoU} + \frac{\rho^2(b, b_{gt})}{c^2} LDIoU=1−IoU+c2ρ2(b,bgt)
其中,( \rho )为两框中心点欧氏距离,( c )为最小包围矩形的对角线长度。
改进点:
- 显式优化中心点距离,加速收敛;
- 在遮挡密集场景下表现更好。
4. CIoU Loss(Complete IoU)
公式:
L CIoU = 1 − IoU + ρ 2 ( b , b g t ) c 2 + α v v = 4 π 2 ( arctan w g t h g t − arctan w h ) 2 , α = v 1 − IoU + v \mathcal{L}_{\text{CIoU}} = 1 - \text{IoU} + \frac{\rho^2(b, b_{gt})}{c^2} + \alpha v \\ v = \frac{4}{\pi^2} \left( \arctan{\frac{w_{gt}}{h_{gt}}} - \arctan{\frac{w}{h}} \right)^2, \quad \alpha = \frac{v}{1 - \text{IoU} + v} LCIoU=1−IoU+c2ρ2(b,bgt)+αvv=π24(arctanhgtwgt−arctanhw)2,α=1−IoU+vv
改进点:
- 在DIoU基础上增加长宽比一致性惩罚项 ( v );
- 动态权重 α \alpha α 平衡中心点与长宽比的优化。
5. EIoU Loss(Efficient IoU)
公式:
L EIoU = 1 − IoU + ρ 2 ( b , b g t ) c w 2 + c h 2 + ρ 2 ( w , w g t ) c w 2 + ρ 2 ( h , h g t ) c h 2 \mathcal{L}_{\text{EIoU}} = 1 - \text{IoU} + \frac{\rho^2(b, b_{gt})}{c_w^2 + c_h^2} + \frac{\rho^2(w, w_{gt})}{c_w^2} + \frac{\rho^2(h, h_{gt})}{c_h^2} LEIoU=1−IoU+cw2+ch2ρ2(b,bgt)+cw2ρ2(w,wgt)+ch2ρ2(h,hgt)
改进点:
- 将长宽比损失分解为宽度和高度独立项,避免CIoU中 arctan \arctan arctan 计算的不稳定性;
- 对小目标和长宽比敏感的任务(如行人检测)效果显著。
三、对比与选型建议
损失函数 | 核心改进点 | 适用场景 | 训练速度 | 精度 |
---|---|---|---|---|
IoU | 基础重叠度量 | 快速验证原型 | 快 | 低 |
GIoU | 处理无重叠情况 | 通用检测任务 | 中 | 中 |
DIoU | 中心点距离惩罚 | 密集遮挡场景 | 较快 | 较高 |
CIoU | 联合优化中心点+长宽比 | 复杂目标(如旋转框) | 中 | 高 |
EIoU | 解耦长宽比优化,稳定性更高 | 小目标或长宽比敏感任务 | 较快 | 高 |
选型建议:
- YOLO系列:官方默认使用CIoU,平衡精度与速度;
- 小目标检测:优先尝试EIoU;
- 工业部署:若需极简实现,可考虑DIoU。
四、代码实现关键点
以PyTorch实现CIoU Loss为例:
def ciou_loss(pred_boxes, target_boxes, eps=1e-7):# 计算交集和IoUinter_area = ... # 交集面积计算union_area = ... # 并集面积计算iou = inter_area / (union_area + eps)# 中心点欧氏距离center_distance = torch.sum((pred_boxes[:, :2] - target_boxes[:, :2])**2, dim=1)# 最小包围矩形对角线长度enclose_width = torch.max(pred_boxes[:, 2], target_boxes[:, 2]) - ...enclose_height = torch.max(pred_boxes[:, 3], target_boxes[:, 3]) - ...c_sq = enclose_width**2 + enclose_height**2 + eps# 长宽比惩罚项v = (4 / (math.pi ** 2)) * torch.pow(torch.atan(target_boxes[:, 2]/target_boxes[:, 3]) - torch.atan(pred_boxes[:, 2]/pred_boxes[:, 3]), 2)alpha = v / (1 - iou + v + eps)loss = 1 - iou + center_distance / c_sq + alpha * vreturn loss.mean()# yolov5项目实现示例
def bbox_iou(box1, box2, xywh=True, GIoU=False, DIoU=False, CIoU=False, eps=1e-7):"""Calculates IoU, GIoU, DIoU, or CIoU between two boxes, supporting xywh/xyxy formats.Input shapes are 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: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: # 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))return 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
注意事项:
- 添加微小量
eps
避免除零错误; - 使用
torch.atan2
处理边界情况; - 长宽比计算需归一化处理。
五、总结与讨论
IoU损失函数的演进体现了目标检测领域对几何关系建模的逐步深入:
- IoU → GIoU:解决梯度消失问题;
- GIoU → DIoU:引入距离惩罚,加速收敛;
- DIoU → CIoU/EIoU:细化长宽比优化,提升精度。
讨论话题:
- 在您的实际项目中,哪种IoU损失效果最佳?
- 对于旋转目标检测,如何改进IoU损失?
参考文献
- GIoU: Generalized Intersection over Union
- Distance-IoU Loss for Faster and Better Learning
- EIoU: Efficient IoU Loss for Accurate Bounding Box Regression
相关文章:
目标检测中的IoU损失函数
目标检测中的IoU损失函数 目标检测中的IoU损失函数一、为什么需要IoU损失函数?二、常见IoU损失函数详解1. **IoU Loss**2. **GIoU Loss(Generalized IoU)**3. **DIoU Loss(Distance IoU)**4. **CIoU Loss(C…...
深入剖析 MyBatis 位运算查询:从原理到最佳实践
深入剖析 MyBatis 位运算查询:从原理到最佳实践 引言 在数据库设计中,位运算是一种高效存储和查询多选字段的常用技术。然而,在实际开发中,特别是在使用 MyBatis 这样的 ORM 框架时,位运算查询往往会遇到一些意想不到…...

JavaScript性能优化实战,从理论到落地的全面指南
在前端开发领域,JavaScript的性能优化是提升用户体验的核心环节。随着Web应用复杂度的提升,开发者面临的性能瓶颈也日益多样化。本文将从理论分析、代码实践和工具使用三个维度,系统性地讲解JavaScript性能优化的实战技巧,并通过大…...
第二个五年计划!
下一阶段!5年后!33岁!体重维持在125斤内!腰围74! 健康目标: 体检指标正常,结节保持较小甚至变小! 工作目标: 每年至少在一次考评里拿A(最高S,A我理…...
【行为型之中介者模式】游戏开发实战——Unity复杂系统协调与通信架构的核心秘诀
文章目录 🕊️ 中介者模式(Mediator Pattern)深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码(成就系统协调)1. 定义中介者接口与同事基类2. 实现具体同事类3. 实现具体中介者4. 客户端使用 四、模式…...
分布式微服务系统架构第125集:AI大模型
加群联系作者vx:xiaoda0423 仓库地址:https://webvueblog.github.io/JavaPlusDoc/ https://1024bat.cn/ 一、user 表(用户表) sql 复制编辑 create table if not exists user (id bigint auto_increment comment id pri…...

MySQL 8.0 OCP 英文题库解析(三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题16~25 试题16:…...
MapReduce 模型
引言 MapReduce 是分布式计算领域的里程碑式模型,由 Google 在 2004 年论文中首次提出,旨在简化海量数据处理的复杂性。其核心思想是通过函数式编程的 Map (映射)和 Reduce (归约)阶段&#x…...

Docker容器启动失败?无法启动?
Docker容器无法启动的疑难杂症解析与解决方案 一、问题现象 Docker容器无法启动是开发者在容器化部署中最常见的故障之一。尽管Docker提供了丰富的调试工具,但问题的根源往往隐藏在复杂的配置、环境依赖或资源限制中。本文将从环境变量配置错误这一细节问题入手&am…...
mysql dump 导入导出用法
导出 指定库中指定的表 mysqldump -uroot -pmysql databasename table1 table2 > ./bak.sql 导入 mysql -uroot -p123456 databasename< ./bak.sql 导出指定数据库 mysqldump -uroot -p123456 databasename > ./databasename.sql 导入: mysql -uroot…...

MySQL 数据类型全面指南:从理论到实践
在数据库设计和开发中,数据类型的选择是构建高效、可靠系统的基石。MySQL作为最流行的关系型数据库之一,提供了丰富的数据类型以满足各种数据存储需求。本文将全面介绍MySQL的数据类型体系,通过理论讲解和实际示例,帮助开发者做出…...
第二课:ESP32 使用 PWM 渐变控制——实现模拟呼吸灯或音调变化
第二课:ESP32 使用 PWM 渐变控制——实现模拟呼吸灯或音调变化 🧠 一、PWM 占空比与亮度/音量控制原理 PWM(Pulse Width Modulation,脉宽调制)是一种常用的数字信号控制方式,广泛应用于 LED 灯光亮度、电…...
Quartus与Modelsim-Altera使用手册
目录 文章内容: 视频内容: Quartus: ModelSim: 顶层设计与子模块: 只是对所查阅的相关文章的总结与视频总结 文章内容: 这篇对基础操作很详细: 一、Quartus II软件的使用_quartus2软件上…...

uniapp(微信小程序)>关于父子组件的样式传递问题(自定义组件样式穿透)
在父组件中给子组件添加类名,子组件的样式由父组件决定 由于"微信小程序"存在【样式隔离机制】,且默认设置为isolated(启用样式隔离),因此这里给出以下两种解决方案: // 小程序编译机制 1. 当 <style scoped> 存在时&#…...

【HCIA】BFD
前言 前面我们介绍了浮动路由以及出口路由器的默认路由配置,可如此配置会存在隐患,就是出口路由器直连的网络设备并不是运营商的路由器,而是交换机。此时我们就需要感知路由器的存活状态,这就需要用到 BFD(Bidirectio…...

计算机视觉最不卷的方向:三维重建学习路线梳理
提到计算机视觉(CV),大多数人脑海中会立马浮现出一个字:“卷”。卷到什么程度呢?2022年秋招CV工程师岗位数下降了16%,但求职人数增加了23%,求职人数与招聘岗位的比例达到了恐怖的15:1࿰…...

android抓包踩坑记录
由于需要公司业务需求,需要抓取APP中摄像机插件的网络包,踩了两天坑,这里做个总结吧。 事先准备 android-studio emulatesdk 需要android模拟器和adb调试工具。如果已经有其他模拟器的话,可以只安装adb调试工具即可 mitmproxy…...

Webpack其他插件
安装html打包插件 const path require(path); const HtmlWebpackPlugin require(html-webpack-plugin) module.exports {entry: path.resolve(__dirname,src/login/index.js),output: {path: path.resolve(__dirname, dist),filename: ./login/index.js,clean:true},Plugin:…...
如何正确地写出单例模式
如何正确地写出单例模式 | Jarks Blog 枚举方式: public class SingletonObject {private SingletonObject() {}/*** 枚举类型是线程安全的,并且只会装载一次*/private enum Singleton {INSTANCE;private final SingletonObject instance;Singleton() {…...
常见相机焦段的分类及其应用
相机焦段是指镜头的焦距范围,决定了拍摄时的视角、画面范围和透视效果。不同焦段适合不同的拍摄场景和主题,以下是常见焦段的分类及其应用: 一、焦段的核心概念 焦距:镜头光学中心到成像传感器的距离(单位:…...

Python Matplotlib 库【绘图基础库】全面解析
让AI成为我们的得力助手:《用Cursor玩转AI辅助编程——不写代码也能做软件开发》 一、发展历程 Matplotlib 由 John D. Hunter 于 2003 年创建,灵感来源于 MATLAB 的绘图系统。作为 Python 生态中最早的可视化工具之一,它逐渐成为科学计算领…...

C++ string数据查找、string数据替换、string子串获取
string查找示例见下,代码见下,以及对应运行结果见下: #include<iostream>using namespace std;int main() {// 1string s1 "hellooooworld";cout << s1.find("oooo") << endl;// 2cout << (in…...
入侵检测SNORT系统部署过程记录
原理背景知识: 一、入侵检测系统介绍 1、入侵检测系统 入侵检测(Intrusion Detection) 指通过对计算机网络或计算机系统中的若干关键点收集信息并对其进行分析,从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象。 入侵检测系统(IDS) 是从网络和系统中收集…...
使用 Java 反射动态加载和操作类
Java 的反射机制(Reflection)是 Java 语言的一大特色,它允许程序在运行时检查、加载和操作类、方法、字段等元信息。通过 java.lang.Class 和 java.lang.reflect 包,开发者可以动态加载类、创建实例、调用方法,甚至在运行时构造新类。反射是 Java 灵活性的核心,广泛应用于…...

关于甲骨文(oracle cloud)丢失MFA的解决方案
前两年,申请了一个招商的多币种信用卡,然后就从网上撸了一个oracle的免费1h1g的服务器。 用了一段时间,人家要启用MFA验证。 啥叫MFA验证,类似与短信验证吧,就是绑定一个手机,然后下载一个app,每…...
vue3项目中使用CodeMirror组件的详细教程,中文帮助文档,使用手册
简介 这是基于 Vue 3 开发的 CodeMirror 组件。该组件基于 CodeMirror 5 开发,仅支持 Vue 3。 除了支持官方提供的各种语法模式外,还额外添加了日志输出展示模式,开箱即用,但不一定适用于所有场景。 如需完整文档和更多使用案例…...
C++ stl中的list的相关函数用法
文章目录 list的介绍list的使用定义方式 插入和删除迭代器的使用获取元素容器中元素个数和容量的控制其它操作函数 list的使用,首先要包含头文件 #include <list>list的介绍 1.list是一种可以在常数范围内在链表中的任意位置进行插入和删除的序列式容器&…...

【网络编程】七、详解HTTP 搭建HTTP服务器
文章目录 Ⅰ. HTTP协议的由来 -- 万维网Ⅱ. 认识URL1、URL的格式协议方案名登录信息 -- 忽略服务器地址服务器端口号文件路径查询字符串片段标识符 2、URL的编码和解码 Ⅲ. HTTP的报文结构1、请求协议格式2、响应协议格式🎏 写代码的时候,怎么保证请求和…...

[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八)
[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八) 引言 在当今网络安全威胁日益严峻的背景下,为 Web 应用启用 HTTPS 已成为基本要求。Spring Boot 提供了简单高效的方式集成 HTTPS 支持,无论是开发环境测试还是生产环境部署࿰…...
Spring Boot 中的重试机制
Retryable 注解简介 Retryable 注解是 Spring Retry 模块提供的,用于自动重试可能会失败的方法。在微服务架构和分布式系统中,服务之间的调用可能会因为网络问题、服务繁忙等原因失败。使用 Retryable 可以提高应用的稳定性和容错能力 1。 使用步骤 &…...