YOLOv5基础知识入门(7)— NMS(非极大值抑制)原理解析

news2024/11/24 9:08:48

前言:Hello大家好,我是小哥谈。NMS是指非极大值抑制(non maximum suppression),它是一种常用于物体检测任务的算法。在物体检测中,通常会有多个预测框(bounding box)被提议出来,并且这些框可能存在重叠或者重复的情况。NMS的目的就是通过抑制非极大值的方式,来选择出最具代表性的框。本节课就给大家介绍一下非极大值抑制的概念、原理及其算法实现。🌈 

 前期回顾:

           YOLOv5基础知识入门(1)— YOLO算法的发展历程

           YOLOv5基础知识入门(2)— YOLOv5核心基础知识讲解

           YOLOv5基础知识入门(3)— 目标检测相关知识点

           YOLOv5基础知识入门(4)— 神经网络的基本概念与原理 

           YOLOv5基础知识入门(5)— 损失函数(IoU、GIoU、DIoU、CIoU和EIoU)

           YOLOv5基础知识入门(6)— 激活函数(Mish、Sigmoid、Tanh、ReLU、Softmax、SiLU等)

           目录

🚀1.NMS概念

🚀2.目标检测中的NMS

🚀3.NMS算法实现

🚀4.YOLOv5中的NMS

🚀1.NMS概念

非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法(参考论文《Efficient Non-Maximum Suppression》对1维和2维数据的NMS实现),而是用于目标检测中提取分数最高的窗口的。🌳

举例:在人脸检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数,但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高,并且抑制那些分数低的窗口。🍁


🚀2.目标检测中的NMS

目标检测一般分为两个过程:训练过程+检测(推理)过程。🌻

训练过程中,目标检测算法会根据给定的ground truth调整深度学习网络参数来拟合数据集的目标特征,训练完成后,神经网络的参数固定,因而能够直接对新的图像进行目标预测。 然而,在实际的目标预测中,一般的目标检测算法(R-CNN、YOLO等等)都会产生非常多的目标框,其中有很多重复的框定位到同一个目标,NMS作为目标检测的最后一步,用来去除这些重复的框,获得真正的目标框。🍄

两阶段目标检测算法中,以Faster-RCNN为例,有两处使用NMS,第一处是在训练的时候,利用 ProposalCreator 来生成 proposal 的时候,因为只需要一部分 proposal,所以利用NMS进行筛选。第二处使用是在预测的时候,当得到300个分类与坐标偏移结果的时候,需要对每个类别逐一进行非极大值抑制。那为什么对于每个类别不直接取置信度最高的那一个作为最终的预测呢?因为一张图中某个类别可能不止一个,例如一张图中有多个人,直接取最高置信度的只能预测其中的一个人,而通过NMS理想情况下可以使得每个人(每类中的每个个体)都会有且仅有一个 bounding box 框。🌺

一阶段目标检测算法中,以YOLOv5为例,输入一张640*640的图像,NMS之前会产生(80*80+40*40+20*20)*3=25200个目标框,这些框都有相应的分类置信度,当置信度满足正样本条件时(比如100个框,这些框密集的分布在目标周围),被送入NMS,NMS后会产生个数位个目标框(比如7个),如下图所示。👇

目标检测中应用NMS算法的主要目的是消除多余(交叉重复)的窗口,找到最佳物体检测位置。由于目标在图像中的形状和大小可能是各种各样的,所以为了能够较好地在图像中检测这些目标,通常会设计生成数量众多、长宽各异的候选边界框。但是对于一个目标检测任务来说,理想的情况是一个,所以目标只需输出一个最准确的边界框即可。💞


🚀3.NMS算法实现

为了从多个候选边界框中选择一个最佳边界框,通常会使用非极大值抑制(NMS)算法,这种算法用于“抑制”置信度低的边界框并只保留置信度最高的边界框。🌿

算法的实现过程为:

输入: 候选边界框集合B(每个候选框都有一个置信度)、IoU阈值N

输出: 最终的边界框集合D(初始为空集合)

1. 对集合B根据置信度进行降序排序;

2. 从集合B中选择第一个候选框(置信度最高),把它放入集合D中并从集合B中删除;

3. 遍历集合B中的每个候选框,计算它们与D集合中这个候选框的IoU值。如果IoU值大于阈值N, 则把它从集合B中删除;

4. 重复步骤2~3直到集合B为空。


🚀4.YOLOv5中的NMS

YOLOv5的通用工具类中有一段核心代码是处理后处理的NMS(非极大值抑制)部分。NMS是一种用于去除重叠较多的边界框的算法,以筛选出最准确的目标框。🐳

下面就对YOLOv5的NMS进行详解。🍎 🍏  🍒

NMS的主要思路是通过计算目标框之间的重叠度(即IOU,交并比),并选择IOU较低的目标框保留下来。YOLOv5的NMS代码使用了一个循环来遍历所有的预测框,并进行判断和筛选。🌴

首先,通过设定置信度阈值IOU阈值,将预测框中置信度低于阈值的框过滤掉,只保留置信度高的框。

接着,对剩下的框按照置信度进行降序排序,确保置信度高的框排在前面。

然后,从置信度最高的框开始,与其余框逐一计算IOU。如果某个框的IOU高于设定的IOU阈值,则将其删除,否则保留。

最后,重复上述步骤,直到遍历完所有的预测框,并得到最终筛选出来的目标框。

以上就是YOLOv5的NMS的主要讲解。这段代码的作用是在目标检测过程中,根据置信度和IOU阈值对预测框进行筛选,以得到准确的目标框。📚

名词解释:

置信度:置信度是介于0-1(或100%)之间的数字,它描述模型认为此预测边界框包含某类别目标的概率。

IoU(Intersection over Union,IoU):即两个边界框相交面积与相并面积的比值,边界框的准确度可以用IoU进行表示;一般约定,在检测中,IOU>0.5,则认为检测正确,一般阈值设为0.5。

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

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

相关文章

3D图像驱动live2d--Kalidokit--人脸动作捕捉

3D图像驱动live2d–Kalidokit 可在线实时根据摄像头中人脸动作实现动作捕捉 Kalidokit https://kit.kalidoface.com/live2d/ https://github.com/yeemachine/kalidokit

Spring系列篇--关于AOP【面向切面】的详解

目录 一.AOP是什么 二.案例演示 1.前置通知1.1 先准备接口 1.2然后再准备好实现类 1.3对我们的目标对象进行JavaBean配置 1.4 编写前置系统日志通知 1.5配置系统通知XML中的JavaBean 1.6 配置代理XML中的JavaBean 1.7 测试代码开始测试 注意这里有一个报错问题&…

谷歌在Chrome浏览器中推进抗量子加密技术

近日,Chromium博客上发表的一篇博文称,为了加强网络安全,应对迫在眉睫的量子计算机威胁,谷歌各个团队密切合作,为网络向抗量子密码学的过渡做好准备。 谷歌的Chrome团队在博客中写道,该项目涉及修订技术标准…

python3实现线性规划求解

Background 对于数学规划问题,有很多的实现。MatlabYALMIPCPLEX这个组合应该是比较主流的,尤其是在电力相关系统中占据着比较重要的地位。MATLAB是一个强大的数值计算工具,用于数学建模、算法开发和数据分析。Yalmip是一个MATLAB工具箱&#…

VS2022 CMake报错解决小结

目录 一、问题背景 二、问题分析 三、问题解决 一、问题背景 VS2022中能够跨平台的工程类型就是CMake项目,一套代码能跨windows/Linux/Mac多种操作系统。而实际使用时,发现相关资料比较少,需要摸索一下。 碰到的问题简述: 1、C…

VMware虚拟机Ubuntu无法连接网络的解决方法

一、解决办法 网络适配器设置 终端依次执行下面命令即可 sudo nmcli networking off sudo nmcli networking onsudo service network-manager start #或者 sudo service NetworkManager start成功出现这个图标,即代表网络连接成功。

Ubuntu中安装OpenSSL

文章目录 一、前期准备1.1 压缩包下载1.2 gcc, make等的安装二、安装配置 一、前期准备 1.1 压缩包下载 在安装openssl之前,我们需要下载对应的压缩包 https://www.openssl.org/source/openssl-3.0.1.tar.gz 此压缩包可以选择win上下载后解压再复制到本地虚拟机中…

python学习笔记——软件安装

目录 1. 安装并验证Python环境 2. 安装并设置Visual Studio Code编辑器 3. 设置Visual Studio Code编辑器 4.软件安装包 1. 安装并验证Python环境 首先,双击打开python安装包。 注意⚠️ : 安装之前需要关闭杀毒软件,比如360。 然后&am…

盘点九个可使用免费CDN的云服务商(2023版)

CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络&#x…

利用文本探测(text-detection)手写一个文本区域mask的生成

今天遇到这样一个需求:需要针对用户输入的图片生成对应文本区域的mask,按理说这应该是一个很容易实现的问题。 初步设想 要生成对应区域的mask,首先要找到文本所在的位置,针对不同的图片,文本位置自然是不同的&#xf…

每日一题——不同路径的数目(一)

题目 一个机器人在mn大小的地图的左上角&#xff08;起点&#xff09;。 机器人每次可以向下或向右移动。机器人要到达地图的右下角&#xff08;终点&#xff09;。 可以有多少种不同的路径从起点走到终点&#xff1f; 数据范围&#xff1a;0<n,m≤100&#xff0c;保证计算结…

129.【Spring 注解 IOC】

Spring 注解 (一)、组件注册1. Configuration 与 Bean 容器注册组件(1).无注解注入方式(2).注解注入方式 2. ComponentScan 自动扫描组件和自动扫描规则(1).无注解扫描方式(2).注解扫描注入方式(3).指定扫描或不扫描的包 (过滤) 3. 自定义TypeFilter指定过滤规则 Filter(1).自定…

宝塔端口监听不到端口

场景&#xff1a; 两个服务器同时在安装nginx 出问题导致20011没有在监听&#xff0c;重新删除nginx 就行了 当时一直以为是安全组没有放过端口&#xff0c;其实是没有监听 排查问题 php -S 0.0.0.0:端口 如果可以访问说明链接可以到服务器只是nginx没监听 sudo netstat …

Linux 发送信号

进程可以通过系统调用kill函数向包括它本身在内的其他进程发送一个信号。如果程序没有发送该信号的权限&#xff0c;对kill函数的调用就将失败&#xff0c;失败的常见原因是目标进程由另一个用户所拥有。这个函数和shell命令完成相同的功能。 一、kill函数的定义 发送信号的k…

01- 中断

中断 中断1.1 NVIC中断优先级分组1.2 外部中断<1> 映射中断线<2> 设置中断触发方式<3> 编写中断服务函数外部中断常用的库函数&#xff1a;中断函数初始化外部中断的一般配置步骤&#xff1a;部分示例&#xff1a; 中断 1.1 NVIC中断优先级分组 《stm32中文…

自动驾驶——车辆动力学模型

/*lat_controller.cpp*/ namespace apollo { namespace control {using apollo::common::ErrorCode;//故障码 using apollo::common::Status;//状态码 using apollo::common::TrajectoryPoint;//轨迹点 using apollo::common::VehicleStateProvider;//车辆状态信息 using Matri…

分模块开发的意义及开发步骤

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Maven进阶 一、分模块开发1.1分模块开发的意义1.2分模块开…

FlexTools plugin and 3dWindow plugin for SketchUp Crack

FlexTools v2.3.6 plugin for SketchUp 3dWindow v.4.5 plugin for SketchUp 建筑师和3D艺术家使用FlexTools创建SketchUp门、窗、楼梯和其他建筑元素&#xff0c;具有卓越的速度和控制水平。 SketchUp功能强大但易于使用的扩展。对于在施工图或建筑图中使用SketchUp的每个人…

Python 学习笔记——代码基础

目录 Python基础知识 变量 赋值 数据类型 print用法 print格式化输出 运算符 if-else 数据结构 元组 in运算符 列表 切片 [ : ] 追加 append() 插入 insert&#xff08;&#xff09; 删除 pop() 字典 循环 for循环 for循环应用——遍历 for循环应用——累加…

企业如何有效进行远程控制权限管理?向日葵权限管理能力解析

企业对于远程控制这一技术的管理&#xff0c;主要分为两部分&#xff0c;一种管理的目的是提升效率&#xff0c;另一种的目的是降低风险&#xff0c;我们这里着重聊聊后者。 企业管理远控行为&#xff0c;核心关键词是“权限”&#xff0c;通过不同的权限策略和能力&#xff0…