目标检测算法——YOLOv5将NMS替换为DIoU-NMS

论文题目:《Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression》
论文地址:https://arxiv.org/pdf/1807.06521.pdf

非最大抑制(NMS)主要用于基于深度学习 的目标检测模型输出的后处理,从而去除冗余的检测框,获得正确的检测结果。具体意义:在目标检测的预测阶段时,会输出许多候选的anchor box,其中有很多是明显重叠的预测边界框都围绕着同一个目标,这时候就可以使用NMS来合并同一目标的类似边界框,或者说是保留这些边界框中最好的一个。

在经典的NMS中,得分最高的检测框和其它检测框逐一算出一个对应的IOU值,并将该值超过NMS threshold的框全部过滤掉。可以看出,在经典NMS算法中,IOU是唯一考量的因素。但是在实际应用场景中,当两个不同物体挨得很近时,由于IOU值比较大,往往经过NMS处理后,只剩下一个检测框,这样导致漏检的错误情况发生。基于此,DIOU-NMS就不仅仅考虑IOU,还考虑两个框中心点之间的距离。如果两个框之间IOU比较大,但是两个框的距离比较大时,可能会认为这是两个物体的框而不会被过滤掉。

实验证明,将NMS替换为DIoU-NMS,可初步改善YOLOv5对重叠遮挡目标的识别。近期较忙,想要代码的小伙伴请私信!

DIoU-NMS代码如下:


   def diou_box_nms(self, scores, boxes, iou_thres):
        if boxes.shape[0] == 0:
            return torch.zeros(0,device=boxes.device).long()
        x1,y1,x2,y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:,3]
        areas = (x2 - x1 + 1) * (y2 - y1 + 1)
        order = torch.sort(scores, descending=True)[1] #(?,)
        keep =[]
        while order.numel() > 0:
            if order.numel() == 1:
                keep.append(order.item())
                break
            else:
                i = order[0].item()
                keep.append(i)

                xmin = torch.clamp(x1[order[1:]], min = float(x1[i]))
                ymin = torch.clamp(y1[order[1:]], min = float(y1[i]))
                xmax = torch.clamp(x2[order[1:]], max = float(x2[i]))
                ymax = torch.clamp(y2[order[1:]], max = float(y2[i]))

                inter_area = torch.clamp(xmax - xmin, min=0.0) * torch.clamp(ymax - ymin, min=0.0)

                iou = inter_area / (areas[i] + areas[order[1:]] - inter_area + 1e-16)

                # diou add center
                # inter_diag
                cxpreds = (x2[i] + x1[i]) / 2
                cypreds = (y2[i] + y1[i]) / 2

                cxbbox = (x2[order[1:]] + x1[order[1:]]) / 2
                cybbox = (y1[order[1:]] + y2[order[1:]]) / 2

                inter_diag = (cxbbox - cxpreds) ** 2 + (cybbox - cypreds) ** 2

                # outer_diag
                ox1 = torch.min(x1[order[1:]], x1[i])
                oy1 = torch.min(y1[order[1:]], y1[i])
                ox2 = torch.max(x2[order[1:]], x2[i])
                oy2 = torch.max(y2[order[1:]], y2[i])

                outer_diag = (ox1 - ox2) ** 2 + (oy1 - oy2) ** 2

                diou = iou - inter_diag / outer_diag
                diou = torch.clamp(diou, min=-1.0, max=1.0)

                # mask_ind = (iou <= iou_thres).nonzero().squeeze() mask_ind="(diou" <="iou_thres).nonzero().squeeze()" if mask_ind.numel()="=" 0: break order="order[mask_ind" + 1] return torch.longtensor(keep) code></=>

由于原始的NMS中,IoU指标用于抑制多余的检测框,但由于仅考虑了重叠区域,经常会造成错误的抑制,特别是在bbox包含的情况下。因此,可以使用DIoU作为NMS的标准,不仅考虑重叠区域,还考虑了中心点距离。基于DIoU作为NMS标准,虽然多了距离这个维度去考虑问题,但和NMS面对的同样的情况是当两个不同的目标本身就靠的很近的时候还是会造成错误的抑制。

单纯的使用NMS,即是使用IOU作为阈值去筛掉其他预测框时,当两个物体过于接近时,很有可能另外一个物体的预测框就被滤除了。然而,使用DIOU-NMS可以一定程度上提升对于靠近物体的检测。

Original: https://blog.csdn.net/m0_53578855/article/details/124056523
Author: 加勒比海带66
Title: 目标检测算法——YOLOv5将NMS替换为DIoU-NMS

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/24239/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Pytest allure 定制化测试报告

    1、定制报告 Feature:标注主要功能模块 Story:标注 Features 功能模块下的分支功能 Severity:标注测试用例的重要级别 Step:标注测试用例的重要步骤…

    Python 2023年1月17日
    021
  • 【Spring系列】- 手写模拟Spring框架

    简单模拟Spring 😄生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德德🌝分享学习心得,欢迎指正,大家一起学习…

    Python 2023年1月29日
    022
  • 免费申请Jetbrains全家桶

    文章目录 Jetbrains全家桶 * 免费申请的人群 学生和老师 – 申请的要求 申请方式 申请流程 解决收不到邮件的问题 – 编辑内容 进行认证 申请成…

    Python 2023年1月28日
    036
  • 工具推荐-使用RedisInsight工具对Redis集群CURD操作及数据可视化和性能监控

    [点击 👉 关注「 WeiyiGeek」公众号 ] 设为「⭐️ 星标」每天带你玩转网络安全运维、应用开发、物联网IOT学习! 我希望你能看着你的朋友们[关注,点赞,评论,收藏,投币…

    Python 2023年1月31日
    023
  • DHCP

    1、DHCP服务又两个角色,一个是server,一个是client。DHCP是基于UDP传输,server的端口号为67,client的端口号为68。 2、DHCP请求过程: ①c…

    Python 2022年11月10日
    074
  • 【Linux操作系统】多线程(一)

    文章目录 * – 1. 线程概念 – 2. 线程控制 – + 2.1 创建线程 + 2.2 线程ID + 2.3 线程等待 + 2.4 线程终止…

    Python 2023年1月24日
    036
  • numpy

    文章目录 * – 为什么要学numpy?? – 什么是numpy?? – numpy数组基础 – + numpy创建数组(矩阵) +…

    Python 2023年1月12日
    039
  • python pytest allure_Allure+pytest 生成测试报告

    简介: python 主流自动化测试报告插件有三个:HTMLTestRunner、BeautifulReport 和 Allure。HTMLTestRunner是一个比较古老的报告…

    Python 2023年1月19日
    032
  • GhostNet网络详解

    1. GhostNet网络 一张图片经过神经网络进行特征提取后,能够得到很多特征图。在特征图中会有一些 相似性很高,这就是神经网络中存在的 特征图冗杂的情况(如图中扳手相连的两幅特…

    2022年8月28日
    0231
  • python跨年表白神器–你值得拥有!

    教你做python跨年表白神器 点赞收藏后,快去表白!!! 这里是文章的表白神器所有代码+图片+思路解析,对文章不是太懂得小伙伴们可以自取一下哟: 跨年表白神器所有完整配置,直接拿…

    Python 2023年1月22日
    027
  • 语音信号处理:预处理【预加重、分帧、加窗】

    ; 一、预处理 预加重是语音信号处理的前提,主要目的是提升语音信号中的高频分量。 人的发生系统是从肺开始,肺作为能量源,气流通过声带,引发周期性震动(元音),能量经过咽、口腔、唇、…

    Python 2023年1月23日
    022
  • Karmada跨集群优雅故障迁移特性解析

    摘要:在 Karmada 最新版本 v1.3中,跨集群故障迁移特性支持优雅故障迁移,确保迁移过程足够平滑。 在多云多集群应用场景中,为了提高业务的高可用性,用户的工作负载可能会被部…

    Python 2023年1月29日
    037
  • 【youcans的OpenCV例程200篇】总目录

    版权声明:转载本系列作品时必须标注以下版权内容:【youcans@qq.com, youcans的OpenCV 例程200篇, https://blog.csdn.net/youc…

    Python 2022年8月19日
    0137
  • vscode配置django环境

    前言 之前有配置好vscode的python环境,现在就来配置一下django的环境 安装准备 打开vscode的插件中心,安装django插件,注意一定是如图所示的同款插件 先安…

    Python 2022年12月27日
    042
  • Part 9:Pandas 的字符串处理操作

    Pandas字符串处理 我们在前面已经使用了字符串处理程序: [En] We have used the string handler earlier:df[“bWen…

    Python 2023年1月9日
    021
  • Python网站导航项目-2.项目创建与环境配置

    每每用到别人的导航网站会充斥的各种的广告,以及很多无用的内容,用起来真的很烦人。把内容网址收藏到浏览器中又很不方便,因此基于git的前端代码结合Django Web开发自制一套简易…

    Python 2022年12月27日
    058
最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总