YOLOv11改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性

news2024/10/11 3:39:24

一、背景

  1. 目标检测和实例分割中的关键问题
    • 现有的大多数边界框回归损失函数在不同的预测结果下可能具有相同的值,这降低了边界框回归的收敛速度和准确性。
  2. 现有损失函数的不足
    • 现有的基于 ℓ n \ell_n n范数的损失函数简单但对各种尺度敏感。
    • 当预测框与真实框具有相同的宽高比但不同的宽度和高度值时,现有损失函数可能会存在问题,限制了收敛速度和准确性。

文章目录

  • 一、背景
  • 二、原理
    • 2.1 IoU计算原理
    • 2.2. 基于最小点距离的IoU度量
    • 2.3. 作为边界框回归损失函数
    • 2.4 MPDIoU的计算公式
  • 三、添加步骤
    • 3.1 ultralytics/utils/metrics.py
    • 3.2 修改ultralytics/utils/loss.py
    • 3.3 修改ultralytics/utils/tal.py
  • 四、成功运行截图


MPDIoU(Intersection over Union with Minimum Points Distance)是一种用于高效且准确的边界框回归的损失函数。

二、原理

2.1 IoU计算原理

IoU(Intersection over Union)即交并比,用于衡量预测边界框和真实边界框的重合程度。

1. 交集计算:
- 首先确定预测边界框和真实边界框的交集区域。
- 对于两个以左上角和右下角坐标表示的矩形框,分别找出它们在横坐标和纵坐标方向上的重叠区间。
- 如果两个矩形框在横坐标和纵坐标方向上都有重叠部分,那么这个重叠区域就是一个矩形,其面积就是交集的大小。
2. 并集计算:
- 计算预测边界框和真实边界框的并集区域。
- 并集的大小等于两个矩形框各自的面积之和减去它们的交集面积。
3. 比值计算:
- 最后,IoU的值就是交集面积与并集面积的比值。

2.2. 基于最小点距离的IoU度量

  • 原论文中受水平矩形的几何特性启发,设计了一种基于最小点距离的新型IoU度量MPDIoU,直接最小化预测边界框和真实边界框的左上角和右下角点之间的距离。
  • MPDIoU的计算通过两个任意凸形状 A A A B B B,用其左上角和右下角点的坐标来表示,通过计算两个框的交集与并集之比,再减去左上角和右下角两点距离的归一化值来得到MPDIoU

2.3. 作为边界框回归损失函数

  • 在训练阶段,通过最小化基于MPDIoU的损失函数 L M P D I o U = 1 − M P D I o U L_{MPDIoU}=1-MPDIoU LMPDIoU=1MPDIoU,使模型预测的每个边界框 B p r d B_{prd} Bprd接近其真实框 B g t B_{gt} Bgt
  • 现有损失函数中的所有因素(如非重叠区域、中心点距离、宽高偏差等)都可以通过左上角和右下角两点的坐标确定,这意味着提出的 L M P D I o U L_{MPDIoU} LMPDIoU不仅考虑了这些因素,还简化了计算过程。

在这里插入图片描述

2.4 MPDIoU的计算公式

  1. MPDIoU的计算公式:

    • M P D I o U = A ∩ B A ∪ B − d 1 2 w 2 + h 2 − d 2 2 w 2 + h 2 MPDIoU=\frac{A\cap B}{A\cup B}-\frac{d_{1}^{2}}{w^{2}+h^{2}}-\frac{d_{2}^{2}}{w^{2}+h^{2}} MPDIoU=ABABw2+h2d12w2+h2d22
    • 其中 A A A B B B是两个任意凸形状, ( x A 1 , y A 1 ) (x_{A1}, y_{A1}) (xA1,yA1) ( x A 2 , y A 2 ) (x_{A2}, y_{A2}) (xA2,yA2)表示(A)的左上角和右下角点坐标, ( x B 1 , y B 1 ) (x_{B1}, y_{B1}) (xB1,yB1) ( x B 2 , y B 2 ) (x_{B2}, y_{B2}) (xB2,yB2)表示 B B B的左上角和右下角点坐标。
    • d 1 2 = ( x 1 B − x 1 A ) 2 + ( y 1 B − y 1 A ) 2 d_{1}^{2}=(x_{1}^{B}-x_{1}^{A})^{2}+(y_{1}^{B}-y_{1}^{A})^{2} d12=(x1Bx1A)2+(y1By1A)2 d 2 2 = ( x 2 B − x 2 A ) 2 + ( y 2 B − y 2 A ) 2 d_{2}^{2}=(x_{2}^{B}-x_{2}^{A})^{2}+(y_{2}^{B}-y_{2}^{A})^{2} d22=(x2Bx2A)2+(y2By2A)2
  2. 基于MPDIoU的损失函数计算公式:

    • L M P D I o U = 1 − M P D I o U L_{MPDIoU}=1-MPDIoU LMPDIoU=1MPDIoU

三、添加步骤

3.1 ultralytics/utils/metrics.py

此处需要查看的文件是ultralytics/utils/metrics.py

metrics.py中定义了模型的损失函数和计算方法,我们想要加入新的损失函数就只需要将代码放到这个文件内即可

将下方的bbox_iou函数替换原本的bbox_iou函数即可:

def bbox_iou(box1, box2, xywh=True, GIoU=False, DIoU=False, CIoU=False, MDPIoU=False, feat_h=640, feat_w=640, eps=1e-7):
    # Returns Intersection over Union (IoU) of 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 + eps
        w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + eps

    # Intersection area
    inter = (torch.min(b1_x2, b2_x2) - torch.max(b1_x1, b2_x1)).clamp(0) * \
            (torch.min(b1_y2, b2_y2) - torch.max(b1_y1, b2_y1)).clamp(0)

    # Union Area
    union = w1 * h1 + w2 * h2 - inter + eps

    # IoU
    iou = inter / union
    if CIoU or DIoU or GIoU:
        cw = torch.max(b1_x2, b2_x2) - torch.min(b1_x1, b2_x1)  # convex (smallest enclosing box) width
        ch = torch.max(b1_y2, b2_y2) - torch.min(b1_y1, 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.pow(torch.atan(w2 / h2) - torch.atan(w1 / h1), 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
    elif MDPIoU:
        d1 = (b2_x1 - b1_x1) ** 2 + (b2_y1 - b1_y1) ** 2
        d2 = (b2_x2 - b1_x2) ** 2 + (b2_y2 - b1_y2) ** 2
        mpdiou_hw_pow = feat_h ** 2 + feat_w ** 2
        return iou - d1 / mpdiou_hw_pow - d2 / mpdiou_hw_pow  # MPDIoU
    return iou  # IoU

在这里插入图片描述

3.2 修改ultralytics/utils/loss.py

utils\loss.py用于计算各种损失。

BboxLoss函数内修改如下代码,使模型调用此MPDIoU损失函数。


iou = bbox_iou(pred_bboxes[fg_mask], target_bboxes[fg_mask], xywh=False, MDPIoU=True)

在这里插入图片描述

3.3 修改ultralytics/utils/tal.py

tal.py中是一些损失函数的功能应用。

iou_calculation函数内修改如下代码,使模型调用此MPDIoU损失函数。

return bbox_iou(gt_bboxes, pd_bboxes, xywh=False, MPDIoU=True).squeeze(-1).clamp_(0)

在这里插入图片描述

四、成功运行截图

在这里插入图片描述

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

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

相关文章

【LLM论文日更】| BGE经典论文-CPACK

论文:https://arxiv.org/pdf/2309.07597代码:GitHub - FlagOpen/FlagEmbedding: Retrieval and Retrieval-augmented LLMs机构:BAAI领域:embedding model发表:SIGIR 2024 ​ 研究背景 研究问题:这篇文章…

第十一章:规划过程组(11.18规划风险管理--11.24规划干系人参与)

前面几次考试几乎都考了风险管理的相关内容和试题~!尤其是下午题所以感觉还是挺重要的! 11.18 规划风险管理 11.18.1 风险基本概念 每个项目都在两个层面上存在风险:一是每个项目都有会影响项目达成目标的单个风险;二是由单个风险和不确定性的其他来源联…

RandLA-Net PB C++

tensorflow pb 模型 实现 c++ 部署 Code: https://github.com/QingyongHu/RandLA-Net RandLA-Net PB C++ randlanet_tf.h #ifndef RANDLANET_TF_H_

人工智能在免疫组化以及虚拟多重免疫荧光染色中的应用|文献速递·24-10-10

小罗碎碎念 这期推文准备了四篇文章,覆盖了AI在免疫组化、多重免疫组化以及虚拟多重免疫荧光染色中的应用。 目前来看,免疫组化这些技术大多用于验证,那么我们是否可以把从免疫组化分析得到的结论作为模型的先验知识,或者直接进…

vue3中 a-table设置某一个单元格的背景颜色

需求:根据某一个单元格中的某个条件不同,设置动态的颜色; 思路:通过官方文档提供的customCell进行判断设置不同的颜色背景,案例中进行了简单的行列判断,同学们可以根据自己的需求修改判断条件,动…

知乎信息流广告开户是啥政策?

作为国内领先的知识分享平台,知乎以其高质量的内容和精准的用户群体,成为了品牌营销的新蓝海。为了帮助更多企业抓住这一机遇,云衔科技正式推出知乎信息流广告开户及代运营服务,旨在为企业提供一站式的营销解决方案。 一、为什么…

mapbox解决wmts请求乱码问题

贴个群号 WebGIS学习交流群461555818,欢迎大家 事故现场 如图所示,wmts请求全是乱码,看起来像是将一个完整的请求拆成一个一个的字母了,而且控制台打印map.getStyle() 查看该source发现不出异常 解决办法 此类问题就是由于更…

服装生产管理的现代化:SpringBoot框架

2 关键技术简介 2.1 JAVA技术 Java是一种非常常用的编程语言,在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中,Java的身影无处不在,并且拥有旺盛的生命力。Java的跨平台能力十分强大,只需一次编译&#xff0…

私域电商新纪元:消费增值模式引领百万业绩飞跃

各位朋友,我是吴军,专注于带领大家深入探索私域电商领域的非凡魅力与潜在机会。 今天,我想与大家分享一个鼓舞人心的真实故事。在短短的一个月内,我们的合作伙伴实现了业绩的飞跃,突破百万大关,并且用户活跃…

怎么给视频调色,新手一键调色的技巧

视频调色是视频创作的灵魂,赋予影像色彩魅力,化平凡为视觉盛宴。调整视频的色调,唤醒画面生机,营造独特氛围。下面就来教大家如何快速给视频调色,揭秘高效调色秘籍,享受视觉情感双重盛宴,新手也…

Folx Pro – Mac平台上替代迅雷的首选下载器

虽然许多人认为迅雷是 mac 系统上最好的下载管理器,但实际上,如果你不花钱购买会员,迅雷下载速度会非常慢,因为会出现云限速。即使你花了数百元购买白金或超级会员,也面临着敏感资源被封禁无法加速下载的问题&#xff…

【功能模块】-- 水印

目录 👊🏻实现思路 创建canvas 创建div并添加canvas 将div加入document中 具体实现 创建canvas 创建div并添加canvas 将div加入document中 总结 很多时候,我们会遇到各种各样的需求。今天我们来讲讲水印的实现方式,通俗易…

镭速助力解决企业大文件传输难题

在数字化时代,数据已成为企业的核心资产。无论是高清视频、大规模数据库备份还是复杂的3D设计文件,企业每天都要处理大量数据。然而,在享受数据带来的便利和价值的同时,企业也面临着一个现实问题——如何高效、安全地传输大文件&a…

Spring框架 - 下篇

预备知识:MyBatis Spring框架-上篇 文章目录 注解开发注解开发定义bean纯注解开发bean管理bean作用范围、生命周期 依赖注入自动装配加载properties文件 第三方bean第三方bean管理第三方bean依赖注入 总结 Spring整合MyBatis小结 整合junitAOPAOP简介AOP核心概念A…

穷人就不该乱买电车

文 | AUTO芯球 作者 | 雷慢 买车最怕的是什么你知道吗? 是没钱的穷人还要去买豪华电车, 比买电车更可怕的是什么你知道吗? 是买了电车没两年又卖了! 真不是讲鬼故事, 新能源车尤其是纯电车,一年打五折…

压缩包格式详解:RAR、ZIP、7z等格式的优劣与使用场景

随着数字信息的迅猛增长,文件压缩已成为日常生活和工作中的必要操作。通过压缩技术,文件可以被减小体积,便于传输和存储。 目前,市面上常见的压缩格式有 RAR、ZIP 和 7z 等,不同的压缩格式在效率、兼容性和功能方面各…

FFmpeg 简介及其下载安装步骤

目录 一、FFmpeg 简介 二、FFmpeg 安装步骤 2.1 打开官网 2.2 选择FFmpeg系统版本 2.3 下载FFmpeg压缩包 2.4 将下载好的压缩包进行解压 2.5 设置环境变量 2.5.1 在搜索栏中搜索【环境变量】,然后单击将其打开 2.5.2 找到系统变量中的【Path】,点…

实景三维赋能地下管线综合智管应用

在现代城市基础设施管理中,地下管线作为城市的生命线,其安全、高效的管理至关重要。随着实景三维技术的快速发展,地下管线管理迎来了新的发展机遇。本文将探讨实景三维技术如何赋能地下管线的综合智管应用。 一、地下管线管理面临的挑战 地…

Qt_软件添加版本信息

文章内容: 给生成的软件添加软件的版权等信息 #include <windows.h> //中文的话增加下面这一行 #pragma code_page(65001)VS_VERSION_INFO VERSIONINFO

java遍历数组填充排序

java数组 遍历数组 for循环 遍历二维数组 小案例 // 定义一个包名为nb package nb;// 定义一个名为ErWei的公共类 public class ErWei {// 主方法&#xff0c;程序的入口点public static void main(String[] args) {// 声明并初始化一个二维数组a&#xff0c;其中包含三个一…