人工智能深度学习系列—深入探索IoU Loss及其变种:目标检测与分割的精度优化利器

news2025/1/24 2:12:14

文章目录

  • 1. 背景介绍
  • 2. Loss计算公式
  • 3. 使用场景
  • 4. 代码样例
  • 5. 总结

1. 背景介绍

在深度学习的目标检测和分割领域,评估预测结果与真实标注之间的一致性是提升模型性能的关键。IoU Loss(Intersection over Union Loss)及其变种损失函数,因其直观的几何特性和对重叠度的敏感性,成为这些任务中的核心指标。本文将详细介绍IoU Loss及其变种的背景、计算方法、使用场景、代码实现及总结。

IoU Loss,即交并比损失,是一种衡量预测边界框与真实边界框重叠程度的损失函数。它通过计算两个边界框交集与并集的比值,为模型提供了一个直观的训练信号,指导模型学习更准确的边界框预测。

IoU Loss是评估预测边界框与真实边界框重叠度的常用指标。然而,IoU Loss在某些情况下可能不足以提供全面的重叠度量,特别是在边界框接近但不完全重叠时。为了解决这个问题,研究者们提出了一系列IoU Loss的变种,以期提供更全面的度量。变种损失函数如下:

  • GIoU Loss (Generalized Intersection over Union Loss)
    • GIoU Loss在IoU的基础上增加了对边界框形状的考虑,不仅考虑重叠区域,还考虑边界框的大小和比例。
  • DIoU Loss (Distance Intersection over Union Loss)
    • DIoU Loss进一步考虑了边界框中心点之间的距离,以减少因边界框中心偏离而导致的不准确度。
  • CIoU Loss (Complete Intersection over Union Loss)
    • CIoU Loss是一种更为全面的损失函数,它综合了IoU、GIoU和DIoU的考量,并加入了对宽高比的评估。
      在这里插入图片描述

2. Loss计算公式

  • IoU Loss的计算公式如下:
    IoU Loss = 1 − IoU \text{IoU Loss} = 1 - \text{IoU} IoU Loss=1IoU,
    其中,IoU(交并比)定义为:
    IoU = ∣ A ∩ B ∣ ∣ A ∪ B ∣ \text{IoU} = \frac{|A \cap B|}{|A \cup B|} IoU=ABAB,
    这里,(A) 和 (B) 分别代表预测边界框和真实边界框的区域。

  • GIoU Loss计算公式如下:
    GIoU = IoU − A bounding box A enclosing box \text{GIoU} = \text{IoU} - \frac{A_{\text{bounding box}}}{A_{\text{enclosing box}}} GIoU=IoUAenclosing boxAbounding box,
    其中, A bounding box A_{\text{bounding box}} Abounding box是两个边界框的并集面积, A enclosing box A_{\text{enclosing box}} Aenclosing box是包含这两个边界框的最小闭包区域的面积。

  • DIoU Loss(Distance Intersection over Union Loss)是IoU Loss的一个变种,它考虑了预测框和真实框的中心点距离以及最小闭包区域的对角线长度。DIoU Loss的计算公式如下:
    DIoU = 1 − IoU + ρ 2 ( b , b g t ) c 2 \text{DIoU} = 1 - \text{IoU} + \frac{\rho^2(b, b_{gt})}{c^2} DIoU=1IoU+c2ρ2(b,bgt),
    其中: ρ ( b , b g t ) \rho(b, b_{gt}) ρ(b,bgt)代表预测框 b b b和真实框 b g t b_{gt} bgt中心点的欧氏距离的平方。 c c c是包含两个框的最小闭包区域的对角线长度。

  • CIoU Loss(Complete Intersection over Union Loss)进一步在DIoU的基础上增加了对纵横比的一致性的考量。CIoU Loss的计算公式如下:
    CIoU = 1 − IoU + ρ 2 ( b , b g t ) c 2 − α v \text{CIoU} = 1 - \text{IoU} + \frac{\rho^2(b, b_{gt})}{c^2} - \alpha v CIoU=1IoU+c2ρ2(b,bgt)αv
    其中:

    • v v v是一个根据目标框和预测框的宽高比 ( w, h ) 计算的修正因子,计算方式为:
      v = 4 π 2 ( arctan ⁡ ( w g t h g t ) − arctan ⁡ ( w h ) ) 2 v = \frac{4}{\pi^2} \left( \arctan\left(\frac{w_{gt}}{h_{gt}}\right) - \arctan\left(\frac{w}{h}\right) \right)^2 v=π24(arctan(hgtwgt)arctan(hw))2
    • α \alpha α是一个根据IoU和 v v v动态调整的权重,计算方式为:
      α = v ( 1 − IoU ) + v \alpha = \frac{v}{(1 - \text{IoU}) + v} α=(1IoU)+vv

3. 使用场景

IoU Loss及其变种在以下场景中展现出其优势:

  • 目标检测:在检测任务中,用于优化模型对目标位置的预测精度。
  • 图像分割:在像素级别的分割任务中,用于评估预测分割与真实标注的一致性。
  • 实例分割:在区分图像中不同实例的同时,优化边界框的预测。
  • 视频目标跟踪:在跟踪任务中,用于提高目标对象的定位稳定性。

4. 代码样例

以下是使用Python和PyTorch库实现IoU Loss的示例代码:

import torch

def iou_loss(predictions, targets):
    intersection = (predictions & targets).sum(dim=0)
    union = (predictions | targets).sum(dim=0)
    iou = intersection.float() / union.float()
    loss = 1 - iou.mean()  # 避免除以零
    return loss

# 假设有一些预测和目标的二进制分割掩码
predicted_masks = torch.tensor([1, 0, 1, 1, 0], dtype=torch.uint8)
ground_truth_masks = torch.tensor([1, 1, 0, 1, 0], dtype=torch.uint8)

# 计算IoU Loss
loss = iou_loss(predicted_masks, ground_truth_masks)
print("IoU Loss:", loss.item())

以下是使用Python和PyTorch库实现GIoU Loss的示例代码:

import torch

def giou_loss(predictions, targets):
    # 此处简化了GIoU的计算过程,实际实现需要考虑边界框的坐标转换和面积计算
    intersection = (predictions & targets).sum()
    union = (predictions | targets).sum()
    iou = intersection.float() / union.float()
    
    # 假设enclosing_box_area是包含predictions和targets的最小闭包区域的面积
    enclosing_box_area = torch.tensor([x.max() for x in predictions])  # 示例计算
    giou = iou - (enclosing_box_area - union) / enclosing_box_area
    loss = 1 - giou.mean()
    return loss

# 假设有一些预测和目标的二进制分割掩码
predicted_masks = torch.tensor([1, 0, 1, 1, 0], dtype=torch.uint8)
ground_truth_masks = torch.tensor([1, 1, 0, 1, 0], dtype=torch.uint8)

# 计算GIoU Loss
loss = giou_loss(predicted_masks, ground_truth_masks)
print("GIoU Loss:", loss.item())

以下是使用Python和PyTorch库实现CIoU Loss的示例代码:

import torch
import math

def ciou_loss(bboxes1, bboxes2):
    # 假设bboxes1和bboxes2是两个包含边界框的张量,格式为xyxy
    # 计算IoU
    inter_area = (torch.min(bboxes1[:, 2:], bboxes2[:, 2:]) - torch.max(bboxes1[:, :2], bboxes2[:, :2])).clamp(min=0)
    inter = inter_area[:, 0] * inter_area[:, 1]
    area1 = (bboxes1[:, 2] - bboxes1[:, 0]) * (bboxes1[:, 3] - bboxes1[:, 1])
    area2 = (bboxes2[:, 2] - bboxes2[:, 0]) * (bboxes2[:, 3] - bboxes2[:, 1])
    union = area1 + area2 - inter
    iou = inter / union.clamp(min=1e-6)

    # 计算中心点距离
    cx1, cy1 = (bboxes1[:, 2] + bboxes1[:, 0]) / 2, (bboxes1[:, 3] + bboxes1[:, 1]) / 2
    cx2, cy2 = (bboxes2[:, 2] + bboxes2[:, 0]) / 2, (bboxes2[:, 3] + bboxes2[:, 1]) / 2
    rho2 = ((cx2 - cx1) ** 2 + (cy2 - cy1) ** 2) / 4

    # 计算最小闭包区域的对角线长度
    cw = torch.max(bboxes1[:, 2], bboxes2[:, 2]) - torch.min(bboxes1[:, 0], bboxes2[:, 0])
    ch = torch.max(bboxes1[:, 3], bboxes2[:, 3]) - torch.min(bboxes1[:, 1], bboxes2[:, 1])
    c2 = cw ** 2 + ch ** 2

    # 计算v和alpha
    w1, h1 = bboxes1[:, 2] - bboxes1[:, 0], bboxes1[:, 3] - bboxes1[:, 1]
    w2, h2 = bboxes2[:, 2] - bboxes2[:, 0], bboxes2[:, 3] - bboxes2[:, 1]
    v = (4 / (math.pi ** 2)) * (torch.atan(w2 / h2) - torch.atan(w1 / h1)) ** 2
    alpha = v / (1 - iou + v + 1e-6)

    # 计算CIoU Loss
    ciou = 1 - iou + rho2 / c2 + alpha * v
    return ciou

# 假设bboxes1和bboxes2是预测框和真实框的张量
loss = ciou_loss(bboxes1, bboxes2)
print("CIoU Loss:", loss.mean().item())

5. 总结

IoU Loss作为一种评估预测与真实标注重叠度的损失函数,在目标检测和图像分割等任务中发挥着重要作用。通过本文的介绍,希望能够帮助CSDN社区的读者深入理解IoU Loss及其变种,并在实际项目中有效应用。

DIoU Loss和CIoU Loss作为IoU Loss的改进版本,通过考虑边界框的中心点距离、最小闭包区域的对角线长度以及纵横比,提供了更为全面和精确的边界框回归评估。这些损失函数在目标检测和图像分割任务中,特别是在需要精细边界框预测的场景下,展现出了显著的优势。随着目标检测算法的不断发展,DIoU Loss和CIoU Loss预计将在未来的应用中发挥更大的作用。
在这里插入图片描述

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

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

相关文章

【人工智能五】人工智能基础习题

文章目录 壹. 内容补充一. VR/AR/MR的区别1. 三者概念2. 区别 二. 深度学习重要算法及人物介绍1. 反向传播算法2. 卷积神经网络 贰. 习题精选1一. 选择二. 判断题三. 填空题四. 简单题1. 综合2. 深度学习与神经网络 壹. 内容补充 一. VR/AR&…

人工智能与机器学习的相关介绍

文章目录 人工智能的发展历程人工智能与机器学习关系图谱数据处理机器学习ML和深度学习DL的区别人工智能按照学习方式划分监督学习算法无监督学习算法总结 人工智能的发展历程 重要的时间点了解一下: 早在1950年人工智能就已经开始兴起 1997年deep blue战胜了人类国…

一款功能强大的屏幕演示工具,免费版足够使用!

鼠标换肤 | 屏幕画笔 | 放大镜 | 聚光灯 | 屏幕放大 | 倒计时,功能强大的屏幕演示工具 屏幕演示工具适用于Windows平台,特别是Windows 10及以上版本。该软件提供了多种实用功能,包括鼠标换肤、屏幕画笔、放大镜、聚光灯、屏幕放大和倒计时等…

k8s集群的资源发布方式(滚动/蓝绿/灰度发布)及声明式管理方法

目录 1.常见的发布方式 2.滚动发布 3.蓝绿发布 4.实现金丝雀发布(Canary Release) 5.声明式管理方法 1.常见的发布方式 蓝绿发布:两套环境交替升级,旧版本保留一定时间便于回滚优点:用户无感知,部署和回滚速度较…

基于强化学习算法玩CartPole游戏

什么事CartPole游戏 CartPole(也称为倒立摆问题)是一个经典的控制理论和强化学习的基础问题,通常用于测试和验证控制算法的性能。具体来说,它是一个简单的物理模拟问题,其目标是通过在一个平衡杆(倒立摆&a…

Cesium初探-坐标转换

Cesium的坐标系分三种:屏幕坐标、笛卡尔空间直角坐标、地理坐标。 屏幕坐标 屏幕坐标系是一个是平面直角坐标系,即二维笛卡尔坐标系,屏幕左上角为原点(0,0),单位为像素值,屏幕水平方向为X轴&a…

Python | SyntaxError: invalid syntax 深度解析

Python | SyntaxError: invalid syntax 深度解析 在Python编程中,SyntaxError: invalid syntax是一个常见的错误,它表明Python解释器在尝试解析代码时遇到了语法问题。这个错误通常是由于代码中存在拼写错误、缺少符号(如括号、冒号或逗号&a…

Java中的Map(如果想知道Java中有关Map的知识点,那么只看这一篇就足够了!)

前言:在Java编程语言中,集合框架(Collection Framework)提供了一系列用于存储和操作数据的接口和类。其中,Map和Set是两个非常重要的接口,分别用于存储键值对和无重复元素的集合。 ✨✨✨这里是秋刀鱼不做梦…

Nerd Fonts

文章目录 关于 Nerd Fonts重要告示TL;DR字体的各种下载选项 特点 Glyph Setsshell中的图标名称 修补字体Variations 字体安装Option 1: Release Archive DownloadOption 2: Homebrew FontsOption 3: Unofficial Chocolatey or Scoop RepositoriesOption 4: Arch Extra Reposito…

AI在医学领域:医学成像中针对深度神经网络(DNN)的对抗性攻击及其防御策略

关键词:对抗性攻击、医学图像、深度神经网络、模型安全、鲁棒性 机器学习(ML)是医学领域快速发展的一个分支,它利用计算机科学和统计学的方法来解决医学问题。众所周知,攻击者可能通过故意为机器学习分类器创建输入来…

C++11 包装器

1.function包装器 1.1 概念介绍 ret func(x); 上面 func 是什么呢?那么 func 可能是函数名,函数指针,函数对象 ( 仿函数对象 ), 也可能是lamber 表达式对象,这些都是可调用的类型。 函数包装器,也称为函…

comfyui老照片修复工作流,直接复制到comfyui中即可使用

ComfyUI是一个基于web的图形用户界面,用于直观地构建和运行AI模型流程。它特别适合于使用Stable Diffusion等模型进行图像生成任务。然而,ComfyUI本身并不直接提供老照片修复的功能,但你可以通过组合不同的节点来实现这一目标。 老照片修复通常涉及到几个关键步骤: 图像去…

人像修复-插件磨皮

破锤和DR5插件磨皮 破锤插件(更快磨皮)DR5(更好保留皮肤纹理) 破锤插件(更快磨皮) 打开方式:滤镜->Imagenomic->Portraiture 磨皮阈值一般控制在10-20之间若环境与肤色接近,容…

PYTHON专题-(3)你应该知道python内置函数

abs() 函数返回数字的绝对值。dict() 函数用于创建一个字典。help() 函数用于查看函数或模块用途的详细说明。min() 方法返回给定参数的最小值,参数可以为序列。max() 方法返回给定参数的最大值,参数可以为序列。round() 方法返回浮点数 x 的四舍五入值&…

【独家原创】基于APO-Transformer多变量回归预测【24年新算法】 (多输入单输出)Matlab代码

【独家原创】基于APO-Transformer多变量回归预测【24年新算法】 (多输入单输出)Matlab代码 目录 【独家原创】基于APO-Transformer多变量回归预测【24年新算法】 (多输入单输出)Matlab代码效果一览基本介绍程序设计参考资料 效果一…

中国数字孪生进入爆发期,平台级产品决定市场高度

MIT 教授 Geoffrey Parker在《平台革命》中认为,平台正在吞噬整个世界,平台赋予开放的参与式架构,设定合理的参与规则,通过创新的产品、服务为所有参与者创造价值。 与现实世界类似,在数字孪生世界中,数字…

分享5款.NET开源免费的Redis客户端组件库

前言 今天大姚给大家分享5款.NET开源、免费的Redis客户端组件库,希望可以帮助到有需要的同学。 StackExchange.Redis StackExchange.Redis是一个基于.NET的高性能Redis客户端,提供了完整的Redis数据库功能支持,并且具有多节点支持、异步编…

JavaScript基础——Date日期对象常见的用法

Date日期对象 查看Date日期对象的数据类型 创建Date日期对象的实例 获取Date日期对象的属性 设置Date日期对象的属性 日期和时间的比较 获取时间戳 比较时间戳 Date日期对象 JavaScript中的Date类型,提供了一种处理日期和时间的方法,用于创建表示…

OD C卷 - 多线段数据压缩

多段 线 数据压缩 (200) 如图中每个方格为一个像素(i,j),线的走向只能水平、垂直、倾斜45度;图中线段表示为(2, 8)、(3,7)、(3, 6)、&#xff08…

tcp westwood 比 reno,cubic 好在哪

今天说说 tcp 韦斯特伍德,和昨天 dctcp 的路子一样,主要还是一个观点,信息带来性能收益。 reno,cubic 仅做孤立 aimd,没有将 rtt 用到极致,信息相当于浪费掉了,而 westwood 却充分利用 ack 和 …