目标检测中的IoU损失函数

news2025/5/16 5:57:10

目标检测中的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=1IoU=1BBgtBBgt
优点

  • 直接反映框的重叠程度,与检测指标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=1GIoUGIoU=IoUCC(BBgt)
其中, C C C是两框的最小包围矩形面积。
改进点

  • 引入惩罚项 ∣ C − ( B ∪ B g t ) ∣ ∣ C ∣ \frac{|C - (B \cup B_{gt})|}{|C|} CC(BBgt),解决无重叠时的梯度问题;
  • 当两框完全重合时,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=1IoU+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=1IoU+c2ρ2(b,bgt)+αvv=π24(arctanhgtwgtarctanhw)2,α=1IoU+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=1IoU+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):
    # 计算交集和IoU
    inter_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 * v
    return 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 boxes
    if 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 / 2
        b1_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 = box1
        b1_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 area
    inter = (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 Area
    union = w1 * h1 + w2 * h2 - inter + eps

    # IoU
    iou = inter / union
    if CIoU or DIoU or GIoU:
        cw = b1_x2.maximum(b2_x2) - b1_x1.minimum(b2_x1)  # convex (smallest enclosing box) width
        ch = b1_y2.maximum(b2_y2) - b1_y1.minimum(b2_y1)  # convex height
        if CIoU or DIoU:  # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1
            c2 = cw**2 + ch**2 + eps  # convex diagonal squared
            rho2 = ((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 + (b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4  # center dist ** 2
            if CIoU:  # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47
                v = (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)  # CIoU
            return iou - rho2 / c2  # DIoU
        c_area = cw * ch + eps  # convex area
        return iou - (c_area - union) / c_area  # GIoU https://arxiv.org/pdf/1902.09630.pdf
    return iou  # IoU

注意事项

  1. 添加微小量 eps 避免除零错误;
  2. 使用 torch.atan2 处理边界情况;
  3. 长宽比计算需归一化处理。

五、总结与讨论

IoU损失函数的演进体现了目标检测领域对几何关系建模的逐步深入:

  • IoU → GIoU:解决梯度消失问题;
  • GIoU → DIoU:引入距离惩罚,加速收敛;
  • DIoU → CIoU/EIoU:细化长宽比优化,提升精度。

讨论话题

  • 在您的实际项目中,哪种IoU损失效果最佳?
  • 对于旋转目标检测,如何改进IoU损失?

参考文献

  1. GIoU: Generalized Intersection over Union
  2. Distance-IoU Loss for Faster and Better Learning
  3. EIoU: Efficient IoU Loss for Accurate Bounding Box Regression

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

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

相关文章

JavaScript性能优化实战,从理论到落地的全面指南

在前端开发领域,JavaScript的性能优化是提升用户体验的核心环节。随着Web应用复杂度的提升,开发者面临的性能瓶颈也日益多样化。本文将从理论分析、代码实践和工具使用三个维度,系统性地讲解JavaScript性能优化的实战技巧,并通过大…

MySQL 8.0 OCP 英文题库解析(三)

Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题16~25 试题16:…

Docker容器启动失败?无法启动?

Docker容器无法启动的疑难杂症解析与解决方案 一、问题现象 Docker容器无法启动是开发者在容器化部署中最常见的故障之一。尽管Docker提供了丰富的调试工具,但问题的根源往往隐藏在复杂的配置、环境依赖或资源限制中。本文将从环境变量配置错误这一细节问题入手&am…

MySQL 数据类型全面指南:从理论到实践

在数据库设计和开发中,数据类型的选择是构建高效、可靠系统的基石。MySQL作为最流行的关系型数据库之一,提供了丰富的数据类型以满足各种数据存储需求。本文将全面介绍MySQL的数据类型体系,通过理论讲解和实际示例,帮助开发者做出…

uniapp(微信小程序)>关于父子组件的样式传递问题(自定义组件样式穿透)

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

【HCIA】BFD

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

计算机视觉最不卷的方向:三维重建学习路线梳理

提到计算机视觉&#xff08;CV&#xff09;&#xff0c;大多数人脑海中会立马浮现出一个字&#xff1a;“卷”。卷到什么程度呢&#xff1f;2022年秋招CV工程师岗位数下降了16%&#xff0c;但求职人数增加了23%&#xff0c;求职人数与招聘岗位的比例达到了恐怖的15:1&#xff0…

android抓包踩坑记录

​ 由于需要公司业务需求&#xff0c;需要抓取APP中摄像机插件的网络包&#xff0c;踩了两天坑&#xff0c;这里做个总结吧。 事先准备 android-studio emulatesdk 需要android模拟器和adb调试工具。如果已经有其他模拟器的话&#xff0c;可以只安装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:…

Python Matplotlib 库【绘图基础库】全面解析

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

C++ string数据查找、string数据替换、string子串获取

string查找示例见下&#xff0c;代码见下&#xff0c;以及对应运行结果见下&#xff1a; #include<iostream>using namespace std;int main() {// 1string s1 "hellooooworld";cout << s1.find("oooo") << endl;// 2cout << (in…

关于甲骨文(oracle cloud)丢失MFA的解决方案

前两年&#xff0c;申请了一个招商的多币种信用卡&#xff0c;然后就从网上撸了一个oracle的免费1h1g的服务器。 用了一段时间&#xff0c;人家要启用MFA验证。 啥叫MFA验证&#xff0c;类似与短信验证吧&#xff0c;就是绑定一个手机&#xff0c;然后下载一个app&#xff0c;每…

【网络编程】七、详解HTTP 搭建HTTP服务器

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

[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八)

[Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八) 引言 在当今网络安全威胁日益严峻的背景下&#xff0c;为 Web 应用启用 HTTPS 已成为基本要求。Spring Boot 提供了简单高效的方式集成 HTTPS 支持&#xff0c;无论是开发环境测试还是生产环境部署&#xff0…

CVPR计算机视觉顶会论文解读:IPC-Dehaze 如何解决真实场景去雾难题

【CVPR 2025】迭代预测-评判编解码网络&#xff1a;突破真实场景去雾的极限 摘要 本文提出了一种名为IPC-Dehaze的创新去雾方法&#xff0c;通过迭代预测-评判框架和码本解码机制&#xff0c;有效解决了现有去雾算法在复杂场景下的性能瓶颈。该方法在多个基准测试中取得了SOT…

ppy/osu构建 ipad作为osu按键xz笔记2 deepwiki websokect

ipad当x和z键玩osu #无声打osu#没磁轴怎么打osu 下载 .NET (Linux、macOS 和 Windows) | .NET dotnet还行 构建&#xff1a;f5 运行&#xff1a;dotnet run --project osu.Desktop -c Debug deepwiki就是nb uinput是ubuntu的我现在没法调试&#xff0c;放着 import asyn…

.NET程序启动就报错,如何截获初期化时的问题json

一&#xff1a;背景 1. 讲故事 前几天训练营里的一位朋友在复习课件的时候&#xff0c;程序一跑就报错&#xff0c;截图如下&#xff1a; 从给出的错误信息看大概是因为json格式无效导致的&#xff0c;在早期的训练营里曾经也有一例这样的报错&#xff0c;最后定位下来是公司…

nacos:服务注册原理

目录 NaCos服务注册原理1、AbstractAutoServiceRegistration功能和作用onApplicationEvent()方法start()方法 2、NacosAutoServiceRegistration功能和作用NacosAutoServiceRegistration.register()方法AbstractAutoServiceRegistration.register()方法 3、NacosServiceRegistry…

基于开源AI大模型与S2B2C生态的个人品牌优势挖掘与标签重构研究

摘要&#xff1a;在数字文明时代&#xff0c;个人品牌塑造已从传统经验驱动转向数据智能驱动。本文以开源AI大模型、AI智能名片与S2B2C商城小程序源码为技术载体&#xff0c;提出"社会评价-数据验证-标签重构"的三维分析框架。通过实证研究发现&#xff0c;结合第三方…

polarctf-web-[简单rce]

考点&#xff1a; (1)RCE(eval函数) (2)执行函数(passthru函数) (3)/顶级(根)目录查看 (4)sort排序查看函数 题目来源&#xff1a;Polarctf-web-[简单rce] 解题&#xff1a; 代码审计 <?php/*​PolarD&N CTF​*/highlight_file(__FILE__);function no($txt){ # …