深度学习基本功3:NMS(Non-Maximum Suppression,非极大值抑制)算法原理及实现

这篇具有很好参考价值的文章主要介绍了深度学习基本功3:NMS(Non-Maximum Suppression,非极大值抑制)算法原理及实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 为什么要使用NMS

大多数目标检测算法(稠密预测)在得到最终的预测结果时,特征图的每个位置都会输出多个检测结果,整个特征图上会出很多个重叠的框。例如要检测一辆车,可能会有多个bbox都把这辆车给框了出来,因此需要从这些bbox中选出框得最好的,删除掉其它的。要定义框得好与不好,就得看bbox的预测置信度;为了删掉重叠的多余的框,就得利用IoU来检查重叠程度。

2. NMS算法原理

2.1 IoU与置信度

在NMS中,需要将与当前bbox的IoU超过一定阈值的框给删除。而当前bbox的选择则是根据置信度的排序,置信度最高的说明框得最准,将它作为基准,删除掉和它重叠度(也就是IoU)过高的bbox。而置信度的计算在不同算法中也是不同的,可以参考YOLOv1算法中置信度的定义作为一种参考。为了定义重叠度是否过高,需要引入一个阈值超参数,这个阈值和计算mAP定义正负样本时的阈值是完全不一样的。此外,在执行NMS之前一般会先把置信度过低的bbox给初筛一遍,这些bbox框得不准,放到NMS中会增加计算负担,这里也会给置信度设置一个阈值,所以区分这几个阈值对于理解目标检测算法流程非常重要。并且,NMS一般是对每个类别的bbox分别使用的,这样的话就不会把重叠度高但属于不同类别的bbox给误删了。

2.2 算法流程

Step1:将原始列表中的所有bbox按照置信度从高到低进行排序;
Step2:选取当前置信度最高的bbox,记为 b b b,并将其放到最终的结果列表里;
Step3:计算剩余所有bbox与 b b b的IoU,将IoU大于阈值的bbox全部删除;
Step4:从原始列表中删除 b b b
Step5:重复Step2-4,直到原始列表中不再有bbox;
Step6:返回结果列表,即为NMS筛选后的结果。文章来源地址https://www.toymoban.com/news/detail-458971.html

3. Python代码实现

import numpy as np


# dets: 检测出的图中某一类别的bbox及对应的置信度,列表中的每个元素为[x1, y1, x2, y2, confidence];
# thresh: 设定的IoU阈值
def nms(dets, thresh):
	# 预处理
    # 提取各个bbox的位置,即左上角和右下角坐标,用于后续计算IoU里的各种面积
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]
    scores = dets[:, 4] # 提取各个bbox的置信度
    areas = (x2 - x1 + 1) * (y2 - y1 + 1)  # 计算各个bbox的面积
    # Step1:将原始列表中的所有bbox按照置信度从高到低进行排序
    order = scores.argsort()[::-1]  # 在从大到小排序后返回索引值,即order[0]表示scores列表里最大值的索引
    keep = []  # 保存筛选后重叠度低于阈值的bbox,注意,返回的是原始列表中要保留的bbox的索引
    # Step5:重复Step2-4,直到原始列表中不再有bbox
    while order.size > 0:
    	# Step2:选取当前置信度最高的bbox,记为$b$,并将其放到最终的结果列表里
        i = order[0]  # scores列表里置信度最高的bbox对应的的索引
        keep.append(i)  # 将当前这个框得最准的bbox保存到输出结果里
        # Step3:计算剩余所有bbox与$b$的IoU,将IoU大于阈值的bbox全部删除
        # 首先要计算出bbox重叠部分的左上角和右下角坐标
        # 即取两个bbox中左上角值较大者和右下角值较小者
        xx1 = np.maximum(x1[i], x1[order[1:]])
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])
        # 计算重叠部分的宽和高,如果算出来是负值则说明两个bbox不重叠,因此要把相应的宽/高置0
        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        # 计算重叠部分的面积
        inter = w * h
        # 计算$b$与剩余所有bbox的IoU
        ovr = inter / (areas[i] + areas[order[1:]] - inter)
        # 将IoU大于阈值的bbox全部删除,也就是把重叠度较小的bbox给保留下来
        inds = np.where(ovr <= thresh)[0]
        # Step4:从原始列表中删除$b$
        # 由于之前的操作都是算的剩余的bbox与$b$的关系,也就是排除了原始列表的首个元素(从算xx1开始)
        # 所以上面得到的inds要+1才是真正对应到原始列表中的索引,这个过程也就自动地把$b$拿掉了
        order = order[inds + 1]

	# Step6:返回结果列表,即为NMS筛选后的结果
    return keep


if __name__ == '__main__':
    bounding_boxes = np.array([[187, 82, 337, 317, 0.9], [150, 67, 305, 282, 0.75], [246, 121, 368, 304, 0.8]])
    threshold = 0.6
    keep = nms(bounding_boxes, threshold)
    print(keep)

到了这里,关于深度学习基本功3:NMS(Non-Maximum Suppression,非极大值抑制)算法原理及实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux基本功之fsck命令详解

    💓 大家好,我是沐风晓月,双一流院校英语+计算机双专业在读; 💓 想要学好Linux,命令是基本功,企业中常用的命令大约200多个,不管是写shell脚本还是管理操作系统,最常用的命令必须要牢牢掌握,像我们以前学乘法口诀一样,烂熟于心,唯有如此,才能打牢基础。 💓

    2024年02月06日
    浏览(51)
  • linux基本功系列之su命令

    前言🚀🚀🚀 想要学好Linux,命令是基本功,企业中常用的命令大约200多个,不管是写shell脚本还是管理操作系统,最常用的命令必须要牢牢掌握,像我们以前学乘法口诀一样,烂熟于心,唯有如此,才能打牢基础。 💓 知识最重要的是记忆 💓 入门须知: 想要人生从容,必

    2024年01月22日
    浏览(40)
  • Linux基本功系列之ping命令实战

    前言🚀🚀🚀 想要学好Linux,命令是基本功,企业中常用的命令大约200多个,不管是写shell脚本还是管理操作系统,最常用的命令必须要牢牢掌握,像我们以前学乘法口诀一样,烂熟于心,唯有如此,才能打牢基础。 💓 知识最重要的是记忆 💓 入门须知: 想要人生从容,必

    2024年02月02日
    浏览(36)
  • linux基本功系列之mount命令实战

    大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第50篇文章。 专栏地址:[linux基本功-基础命令专栏] , 此专栏是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。 如果文章有什么需要改进的地方还请

    2024年02月04日
    浏览(30)
  • linux基本功之历史记录history命令实战

    💓 想要学好Linux,命令是基本功,企业中常用的命令大约200多个,不管是写shell脚本还是管理操作系统,最常用的命令必须要牢牢掌握,像我们以前学乘法口诀一样,烂熟于心,唯有如此,才能打牢基础。 💓 只要地球不爆炸,我们永远不放假,只要宇宙不重启,我们永远不

    2024年02月08日
    浏览(42)
  • linux基本功系列之sudo命令实战一

    前言🚀🚀🚀 想要学好Linux,命令是基本功,企业中常用的命令大约200多个,不管是写shell脚本还是管理操作系统,最常用的命令必须要牢牢掌握,像我们以前学乘法口诀一样,烂熟于心,唯有如此,才能打牢基础。 💓 知识最重要的是记忆 💓 入门须知: 想要人生从容,必

    2024年02月05日
    浏览(32)
  • linux基本功之列之wget命令实战

    大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第56篇文章。 专栏地址:[linux基本功-基础命令专栏] , 此专栏是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象,以及帮助到其他的小伙伴😉😉。 如果文章有什么需要改进的地方还请

    2024年02月02日
    浏览(38)
  • 用vue实现列表的增删改查基本功能(简单易懂)

    目录 文章目录 前言 一、安装vue 二、使用vue 三、相关代码 四、效果图如下 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 vue开发文档参考

    2024年02月11日
    浏览(32)
  • 【MySQL】MySQL触发器入门宝典,助力MySQL初学者打下基本功

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:重温MySQL 在MySQL数据库中,大家都听过触发器。对于MySQL初学者而言,理解触发器的概念和应用是非常重要的。本文主

    2024年02月15日
    浏览(30)
  • 前端基本功 用 React Hooks + Antd 实现一个 Todo-List

    To-do list(待办事项列表)是用来记录和管理要完成的任务、活动或项目的列表。它是一种简单而常见的工具,用于帮助人们组织和安排日常生活中的任务。每当您有一项任务需要完成或者要记住某些事情时,您可以将它添加到待办事项列表中。 学习前端的一些新知识时,经

    2024年02月17日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包