目标检测从入门到精通——常见iou及变体算法介绍

news2024/12/25 9:27:19

目标检测中的 IoU 算法及其变体

绪论

在计算机视觉领域,目标检测是一个重要的研究方向,广泛应用于自动驾驶、安防监控、图像搜索等多个场景。为了评估目标检测模型的性能,Intersection over Union(IoU)作为一种常用的评估指标,扮演着至关重要的角色。IoU 衡量的是预测边界框与真实边界框之间的重叠程度,能够有效地反映模型的检测精度。

随着研究的深入,许多 IoU 的变体被提出,以解决传统 IoU 在某些情况下的不足。本文将详细介绍几种常见的 IoU 算法及其变体,包括它们的数学原理、特点以及适用场景,以期为目标检测领域的研究者和工程师提供参考。

IoU 算法及其变体

1. 基本 IoU(Intersection over Union)

在这里插入图片描述

原理
基本的 IoU 计算公式如下:
IoU = Area of Overlap Area of Union = A ∩ B A ∪ B \text{IoU} = \frac{\text{Area of Overlap}}{\text{Area of Union}} = \frac{A \cap B}{A \cup B} IoU=Area of UnionArea of Overlap=ABAB
其中, A A A 是预测框, B B B 是真实框。

  • 交集(Area of Overlap):预测框与真实框重叠的区域面积。
  • 并集(Area of Union):预测框和真实框的总面积,计算方式为:
    A ∪ B = A + B − A ∩ B A \cup B = A + B - A \cap B AB=A+BAB
import numpy as np

def iou(boxA, boxesB):
    # 计算交集的坐标
    xA = np.maximum(boxA[0], boxesB[:, 0])
    yA = np.maximum(boxA[1], boxesB[:, 1])
    xB = np.minimum(boxA[2], boxesB[:, 2])
    yB = np.minimum(boxA[3], boxesB[:, 3])

    # 计算交集面积
    interArea = np.maximum(0, xB - xA) * np.maximum(0, yB - yA)

    # 计算各自的面积
    boxAArea = (boxA[2] - boxA[0]) * (boxA[3] - boxA[1])
    boxBArea = (boxesB[:, 2] - boxesB[:, 0]) * (boxesB[:, 3] - boxesB[:, 1])

    # 计算并集面积
    unionArea = boxAArea + boxBArea - interArea

    # 计算IoU
    return interArea / unionArea if unionArea > 0 else 0

特点

  • IoU 的值范围在 [ 0 , 1 ] [0, 1] [0,1] 之间,值越大表示重叠程度越高。
  • 通常设定一个阈值(如 0.5),当 IoU 大于该阈值时,认为检测是成功的。

2. GIoU(Generalized Intersection over Union)

在这里插入图片描述

原理
GIoU 是对基本 IoU 的扩展,旨在解决 IoU 在某些情况下的不足,特别是当预测框与真实框没有重叠时。GIoU 的计算公式如下:
GIoU = IoU − Area of the smallest enclosing box − Area of Union Area of the smallest enclosing box \text{GIoU} = \text{IoU} - \frac{\text{Area of the smallest enclosing box} - \text{Area of Union}}{\text{Area of the smallest enclosing box}} GIoU=IoUArea of the smallest enclosing boxArea of the smallest enclosing boxArea of Union

def giou(boxA, boxesB):
    iou_values = iou(boxA, boxesB)

    # 计算最小外接框的坐标
    x_min = np.minimum(boxA[0], boxesB[:, 0])
    y_min = np.minimum(boxA[1], boxesB[:, 1])
    x_max = np.maximum(boxA[2], boxesB[:, 2])
    y_max = np.maximum(boxA[3], boxesB[:, 3])

    # 计算最小外接框的面积
    enclosing_area = (x_max - x_min) * (y_max - y_min)

    # 计算GIoU
    return iou_values - (enclosing_area - (boxA[2] - boxA[0]) * (boxA[3] - boxA[1]) - (boxesB[:, 2] - boxesB[:, 0]) * (boxesB[:, 3] - boxesB[:, 1])) / enclosing_area

特点

  • GIoU 在 IoU 为 0 时仍然可以提供有意义的反馈,避免了 IoU 在无重叠情况下的无效评估。
  • GIoU 通过考虑最小外接框的面积来惩罚预测框与真实框之间的距离。

3. DIoU(Distance Intersection over Union)

原理
DIoU 进一步扩展了 GIoU,考虑了预测框与真实框中心点之间的距离。DIoU 的计算公式如下:
DIoU = IoU − ρ 2 c 2 \text{DIoU} = \text{IoU} - \frac{\rho^2}{c^2} DIoU=IoUc2ρ2
其中:

  • ρ \rho ρ 是预测框中心与真实框中心之间的欧几里得距离。
  • c c c 是最小外接框的对角线长度。
def diou(boxA, boxesB):
    iou_values = iou(boxA, boxesB)

    # 计算中心点
    centerA = np.array([(boxA[0] + boxA[2]) / 2, (boxA[1] + boxA[3]) / 2])
    centerB = np.array([(boxesB[:, 0] + boxesB[:, 2]) / 2, (boxesB[:, 1] + boxesB[:, 3]) / 2]).T

    # 计算中心距离
    rho2 = np.sum((centerA - centerB) ** 2, axis=1)

    # 计算最小外接框的对角线长度
    x_min = np.minimum(boxA[0], boxesB[:, 0])
    y_min = np.minimum(boxA[1], boxesB[:, 1])
    x_max = np.maximum(boxA[2], boxesB[:, 2])
    y_max = np.maximum(boxA[3], boxesB[:, 3])
    c2 = (x_max - x_min) ** 2 + (y_max - y_min) ** 2

    # 计算DIoU
    return iou_values - (rho2 / c2)

特点

  • DIoU 不仅考虑了重叠区域,还考虑了框中心之间的距离,鼓励模型更好地定位目标。

4. CIoU(Complete Intersection over Union)

原理
CIoU 是 DIoU 的进一步扩展,综合考虑了 IoU、中心距离和长宽比。CIoU 的计算公式如下:
CIoU = IoU − ρ 2 c 2 − α v \text{CIoU} = \text{IoU} - \frac{\rho^2}{c^2} - \alpha v CIoU=IoUc2ρ2αv
其中:

  • v v v 是长宽比的惩罚项,计算方式为:
    v = 4 π 2 ( arctan ⁡ ( w p r e d h p r e d ) − arctan ⁡ ( w g t h g t ) ) 2 v = \frac{4}{\pi^2} \left( \arctan\left(\frac{w_{pred}}{h_{pred}}\right) - \arctan\left(\frac{w_{gt}}{h_{gt}}\right) \right)^2 v=π24(arctan(hpredwpred)arctan(hgtwgt))2
  • α \alpha α 是一个平衡因子,用于调节长宽比的影响。
def ciou(boxA, boxesB):
    iou_values = iou(boxA, boxesB)

    # 计算中心点
    centerA = np.array([(boxA[0] + boxA[2]) / 2, (boxA[1] + boxA[3]) / 2])
    centerB = np.array([(boxesB[:, 0] + boxesB[:, 2]) / 2, (boxesB[:, 1] + boxesB[:, 3]) / 2]).T

    # 计算中心距离
    rho2 = np.sum((centerA - centerB) ** 2, axis=1)

    # 计算最小外接框的对角线长度
    x_min = np.minimum(boxA[0], boxesB[:, 0])
    y_min = np.minimum(boxA[1], boxesB[:, 1])
    x_max = np.maximum(boxA[2], boxesB[:, 2])
    y_max = np.maximum(boxA[3], boxesB[:, 3])
    c2 = (x_max - x_min) ** 2 + (y_max - y_min) ** 2

    # 计算长宽比的惩罚项
    wA, hA = boxA[2] - boxA[0], boxA[3] - boxA[1]
    wB, hB = boxesB[:, 2] - boxesB[:, 0], boxesB[:, 3] - boxesB[:, 1]
    v = (4 / (np.pi ** 2)) * (np.arctan(wA / hA) - np.arctan(wB / hB)) ** 2

    # 计算CIoU
    return iou_values - (rho2 / c2) - v

特点

  • CIoU 综合考虑了重叠区域、中心距离和长宽比,使得目标检测更加精确。

5. Alpha-IoU

原理
Alpha-IoU 是一种改进的 IoU 计算方法,通过引入一个可调节的参数 α \alpha α 来平衡不同的 IoU 计算方式。Alpha-IoU 的计算公式通常表示为:
Alpha-IoU = IoU − ρ 2 c 2 − α v \text{Alpha-IoU} = \text{IoU} - \frac{\rho^2}{c^2} - \alpha v Alpha-IoU=IoUc2ρ2αv

def alpha_iou(boxA, boxesB, alpha=0.5):
    iou_values = iou(boxA, boxesB)

    # 计算中心点
    centerA = np.array([(boxA[0] + boxA[2]) / 2, (boxA[1] + boxA[3]) / 2])
    centerB = np.array([(boxesB[:, 0] + boxesB[:, 2]) / 2, (boxesB[:, 1] + boxesB[:, 3]) / 2]).T

    # 计算中心距离
    rho2 = np.sum((centerA - centerB) ** 2, axis=1)

    # 计算最小外接框的对角线长度
    x_min = np.minimum(boxA[0], boxesB[:, 0])
    y_min = np.minimum(boxA[1], boxesB[:, 1])
    x_max = np.maximum(boxA[2], boxesB[:, 2])
    y_max = np.maximum(boxA[3], boxesB[:, 3])
    c2 = (x_max - x_min) ** 2 + (y_max - y_min) ** 2

    # 计算长宽比的惩罚项
    wA, hA = boxA[2] - boxA[0], boxA[3] - boxA[1]
    wB, hB = boxesB[:, 2] - boxesB[:, 0], boxesB[:, 3] - boxesB[:, 1]
    v = (4 / (np.pi ** 2)) * (np.arctan(wA / hA) - np.arctan(wB / hB)) ** 2

    # 计算Alpha-IoU
    return iou_values - (rho2 / c2) - alpha * v

特点

  • Alpha-IoU 通过调整参数 α \alpha α,可以控制长宽比和中心距离对最终 IoU 评分的影响,提供更灵活的评估。

6. SIoU(Scaled Intersection over Union)

原理
SIoU 是对 CIoU 的进一步扩展,考虑了目标框的缩放因素。SIoU 的计算公式如下:
SIoU = IoU − ρ 2 c 2 − α v − β s \text{SIoU} = \text{IoU} - \frac{\rho^2}{c^2} - \alpha v - \beta s SIoU=IoUc2ρ2αvβs
其中, s s s 是缩放惩罚项, β \beta β 是平衡因子。

def siou(boxA, boxesB, beta=0.5):
    iou_values = iou(boxA, boxesB)

    # 计算中心点
    centerA = np.array([(boxA[0] + boxA[2]) / 2, (boxA[1] + boxA[3]) / 2])
    centerB = np.array([(boxesB[:, 0] + boxesB[:, 2]) / 2, (boxesB[:, 1] + boxesB[:, 3]) / 2]).T

    # 计算中心距离
    rho2 = np.sum((centerA - centerB) ** 2, axis=1)

    # 计算最小外接框的对角线长度
    x_min = np.minimum(boxA[0], boxesB[:, 0])
    y_min = np.minimum(boxA[1], boxesB[:, 1])
    x_max = np.maximum(boxA[2], boxesB[:, 2])
    y_max = np.maximum(boxA[3], boxesB[:, 3])
    c2 = (x_max - x_min) ** 2 + (y_max - y_min) ** 2

    # 计算长宽比的惩罚项
    wA, hA = boxA[2] - boxA[0], boxA[3] - boxA[1]
    wB, hB = boxesB[:, 2] - boxesB[:, 0], boxesB[:, 3] - boxesB[:, 1]
    v = (4 / (np.pi ** 2)) * (np.arctan(wA / hA) - np.arctan(wB / hB)) ** 2

    # 计算缩放惩罚项
    s = (wA - wB) ** 2 + (hA - hB) ** 2

    # 计算SIoU
    return iou_values - (rho2 / c2) - beta * v - s

特点

  • SIoU 通过考虑目标框的缩放因素,使得目标检测在不同尺度下的表现更加稳定。

7. RIoU(Relative Intersection over Union)

原理
RIoU 是一种相对 IoU 计算方法,主要用于处理小目标检测问题。RIoU 的计算公式如下:
RIoU = Area of Overlap Area of Union + ϵ \text{RIoU} = \frac{\text{Area of Overlap}}{\text{Area of Union} + \epsilon} RIoU=Area of Union+ϵArea of Overlap
其中, ϵ \epsilon ϵ 是一个小常数,用于避免除零错误。

def riou(boxA, boxesB, epsilon=1e-6):
    interArea = iou(boxA, boxesB) * (boxA[2] - boxA[0]) * (boxA[3] - boxA[1])
    unionArea = (boxA[2] - boxA[0]) * (boxA[3] - boxA[1]) + (boxesB[:, 2] - boxesB[:, 0]) * (boxesB[:, 3] - boxesB[:, 1]) - interArea
    return interArea / (unionArea + epsilon)

特点

  • RIoU 在处理小目标时表现更好,因为它通过引入小常数来稳定计算。

8. Focal IoU

原理
Focal IoU 是一种结合了 Focal Loss 的 IoU 计算方法,旨在解决类别不平衡问题。Focal IoU 的计算公式如下:
Focal IoU = − α ( 1 − IoU ) γ log ⁡ ( IoU ) \text{Focal IoU} = -\alpha (1 - \text{IoU})^\gamma \log(\text{IoU}) Focal IoU=α(1IoU)γlog(IoU)
其中, α \alpha α γ \gamma γ 是调节参数。

def focal_iou(boxA, boxesB, alpha=0.25, gamma=2.0):
    iou_values = iou(boxA, boxesB)
    return -alpha * (1 - iou_values) ** gamma * np.log(iou_values + 1e-6)

特点

  • Focal IoU 通过加权 IoU 计算,增强了对难以检测目标的关注。

总结

在目标检测任务中,IoU 是评估模型性能的重要指标。随着研究的深入,许多 IoU 的变体被提出,以解决传统 IoU 在某些情况下的不足。每种 IoU 变体都有其独特的优点和适用场景,选择合适的 IoU 计算方法可以根据具体应用需求来决定。

指标计算方式特点
IoU交集面积 / 并集面积简单易懂,但在无重叠情况下无法提供有效反馈
GIoUIoU - (最小外接框面积 - 并集面积) / 最小外接框面积解决了 IoU 的不足,考虑了框之间的距离
DIoUIoU - (中心距离的平方 / 最小外接框对角线的平方)考虑了框中心之间的距离,鼓励更好的定位
CIoUIoU - (中心距离的平方 / 最小外接框对角线的平方) - 长宽比惩罚综合考虑了重叠、中心距离和长宽比,提供更全面的评估
Alpha-IoUIoU - (中心距离的平方 / 最小外接框对角线的平方) - 长宽比惩罚可调节的参数,灵活性高
SIoUIoU - (中心距离的平方 / 最小外接框对角线的平方) - 长宽比惩罚 - 缩放惩罚考虑目标框的缩放因素
RIoU交集面积 / (并集面积 + 小常数)处理小目标检测问题
Focal IoU-α(1 - IoU)ᵞ log(IoU)解决类别不平衡问题

通过理解这些 IoU 算法及其变体,研究者和工程师可以更好地评估和优化目标检测模型,提高其在实际应用中的表现。希望本文能为您在目标检测领域的研究和实践提供有价值的参考。

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

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

相关文章

SpringBoot OAuth2自定义登陆/授权页

背景 5 月份的时候,我实践并整理了一篇博客:SpringBoot搭建OAuth2,该博客完成之后,很长一段时间里我都有种意犹未尽的感觉。诚然,我把OAuth2搭起来了,各种场景的用例也跑通了,甚至源码也看了&am…

HTTP请求⽅法

HTTP请求⽅法 1. GET :申请获取资源,不对服务器产⽣影响 2. POST : POST 请求通常⽤于发送数据,例如提交表单数据、上传⽂件等,会影响服务器,服务器可能动态创建新的资源或更新原有资源。 3. HEAD &#…

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 &…

UE4_后期处理_后期处理材质四—场景物体描边

一、效果如下图: 二、分析: 回顾复习:在后期处理材质三中,我们通过计算开启自定义深度通道物体的像素点上下左右4个像素SceneTextureCustomDepth深度之和来判断物体的外部(包含物体的边)和内部&#xff0c…

【漏洞利用】2018年-2024年HVV 6000+个漏洞 POC 合集分享

此份poc 集成了Zabbix、用友、通达、Wordpress、Thinkcmf、Weblogic、Tomcat等 下载链接: 链接: https://pan.quark.cn/s/1cd7d8607b8a

Java小白一文讲清Java中集合相关的知识点(七)

LinkedHashSet LinkedHashSet是HashSet的子类 LinkedHashSet底层是一个LinkedHashMap,底层维护了一个数组双向链表 而在之前讲的HashSet中的链表是单向的哈,注意区分! LinkedHashSet根据元素的hashcode值来决定元素的存储位置,同时使用链表…

从搜索热度上看Arcgis的衰退

Arcgis已被qgis快速赶上 google trends是一个google综合了每日的搜索情况的统计网站,可以追踪从2004年开始各个关键字的搜索热度。 我用arcgis和qgis作为对比,简单探索了arcgis和qgis的全球相关热度。 假设,搜索arcgis越高的区域&#xff…

机器学习 第8章 集成学习

目录 个体与集成BoostingBagging与随机森林Bagging随机森林 结合策略平均法投票法学习法 个体与集成 定义:集成学习,也叫多分类器系统、基于委员会的学习等,它是一种通过结合多个学习器来构建一个更强大的学习器的技术。如下图所示 在这里&a…

轨道交通系统详解,以及地铁如何精准停靠站台

ATC系统 全称“自动列车控制系统”,Automatic Train Control,ATC ATC是地铁运行的核心系统,它包括列车自动防护(ATP)、列车自动运行(ATO)和列车自动监控(ATS)三个子系统。…

嵌入式day41

哈希表 将要存储的数据的关键字和位置建立对应的关系,通过哈希函数(散列函数)将数据映射到存储的位置,方便快速查找 哈希冲突/哈希矛盾: key1 ! key2 f(key1) f(key2) 解决方法: 链地址法 算法 解决…

都2024年了还不明白Redis持久化?RDB文件、AOF文件、AOF重写

都2024年了,不会还有人不知道redis的RDB和Aof吧?不知道没关系,看完这篇文章我相信你就会有个大概的了解和认识了 1. Redis持久化 1.1 持久化概念 Redis本身是一个基于内存的数据库,它提供了RDB持久化、AOF持久化两种方式&#…

黑神话,XSKY 星飞全闪单卷性能突破310万

当下,云计算仍然是企业主要的基础架构,随着关键业务的逐步虚拟化和云化,对于块存储的性能要求也日益提高。企业对于低延迟、高稳定性的存储解决方案的需求日益迫切。为了满足这些日益增长的 IO 密集型应用场景,众多云服务提供商正…

大奖收割机!望繁信科技荣获年度技术创新和应用品牌奖

2023年8月14日,第七届GAIR全球人工智能与机器人大会在新加坡如期举行。 会上公布了「GAIR 2023 GPT Pioneer 5」榜单,望繁信科技凭借完全自主研发的流程智能平台,以及一系列在头部企业中的成功实践案例,与百度智能云、阿里云、知…

vector 容器基础操作及用法

目录 vector 容器基础操作及用法 一:定义及初始化 二:添加数据 三:删除数据 vector 容器基础操作及用法 CSTL是一个非常强大的容器库,其中 vector 是最为常用也较为方便的容器之一,下面主要介绍一下 vector 的一些…

学习threejs,创建立方体,并执行旋转动画

文章目录 一、前言二、代码示例三、总结 一、前言 本文基于threejs&#xff0c;实现立方体的创建&#xff0c;并加入立方体旋转动画 二、代码示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>l…

数据同步方式何来“高级”与“低级”之说?场景匹配才是真理!

导读&#xff1a;数据同步方式的重要性对于数据集成领域的兴从业者不言而喻&#xff0c;选择正确的数据同步方式能让数据同步工作的成果事半功倍。目市面上的数据同步工具很多&#xff0c;提供的数据同步方式也有多种&#xff0c;不同的数据同步方式有什么区别&#xff1f;如何…

免费SSL证书正在逐渐被淘汰,证书部署自动化的发展趋势即将到来!

目录 背景解决方案。1.使用自签证书&#xff08;浏览器报警、免费&#xff09;2.更换支持自签自续的CA机构&#xff08;免费&#xff09;3.付费选择CA机构 免费SSL证书正在逐渐被淘汰&#xff0c;证书部署自动化的发展趋势即将到来免费的SSL证书有以下弊端1.有效期短&#xff1…

Python的安装与配置并在本地盘符创建共享路径打造低成本私人云盘

文章目录 前言1.本地文件服务器搭建1.1.Python的安装和设置1.2.cpolar的安装和注册 2.本地文件服务器的发布2.1.Cpolar云端设置2.2.Cpolar本地设置 3.公网访问测试4.结语 前言 本文主要介绍如何在Windows系统电脑上使用python这样的简单程序语言&#xff0c;在自己的电脑上搭建…

Leetcode面试经典150题-98.验证搜索二叉树

解法都在代码里&#xff0c;不懂就留言或者私信 二叉树的递归套路&#xff0c;练练就习惯了 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this…

内联汇编 (28)

1 首先是基本的格式。 网上的截图&#xff1a; 命令换行使用 \n\t 这里的constraint 指的就是 寄存器。 r , m , 比较重要。 这里的输出的意思是 &#xff0c; 从汇编到 C语言。 输入指的是 从C语言到 汇编语言 这是个具体的例子 %1, %2,%3, 是指 从上往下算&#xff0c;…