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

前言: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。

相关文章:
YOLOv5基础知识入门(7)— NMS(非极大值抑制)原理解析
前言:Hello大家好,我是小哥谈。NMS是指非极大值抑制(non maximum suppression),它是一种常用于物体检测任务的算法。在物体检测中,通常会有多个预测框(bounding box)被提议出来&…...
Gpt微信小程序搭建的前后端流程 - 后端基础框架的搭建(三)
Gpt微信小程序搭建的前后端流程 - 后端基础框架的搭建(三) Gpt微信小程序 只需要几个API,API上一小节也有讲到。直接用 gin 或者 beego 简单搭web服务器就够了。我们这里还用 go-micro微服务 去搭建,主要也是为了学以致用,把之前go-micro系列…...
jstat(JVM Statistics Monitoring Tool):虚拟机统计信息监视工具
jstat(JVM Statistics Monitoring Tool):虚拟机统计信息监视工具 用于监视虚拟机各种运行状态信息的命令行工具。 它可以显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据,在没有GUI图形界面、只提…...
【ARM】Day6 cotex-A7核UART总线实验
cotex-A7核UART总线实验 1. 键盘输入一个字符‘a’,串口工具显示‘b’ 2. 键盘输入一个字符串"nihao",串口工具显示“nihao” uart.h #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_rcc.h" #include "stm3…...
HTTPS代理搭建技巧分享
今天我们来分享一下如何搭建一个能够实现中间人 检测和防护的HTTPS代理。保护我们的网络通信安全是至关重要的,让我们一起学习如何构建一个安全可靠的HTTPS代理吧! 什么是中间人 ? 首先,让我们来了解一下什么是中间人 。中间人 是…...
第四章:树形结构的关联式容器(map+set)
系列文章目录 文章目录 系列文章目录前言1、关联式容器与序列式容器1.1 键值对 2、set的介绍3、multiset的介绍3.1 接口count与容器multiset 4、map的介绍4.1 接口insert4.2 operator[]和at 5、multimap的介绍 前言 根据应用场景的不桶,STL总共实现了两种不同结构的…...
SpringBoot +Vue3 简单的前后端交互
前端:Vue3 创建项目: npm create vuelatest > cd <your-project-name> > npm install > npm run dev 项目结构图如下: 1、查看入口文件内容:main.js 代码如下: import ./assets/main.css impor…...
【Android】Mobile-Security-Framework-MobSF Manifest 静态扫描规则
前言 移动安全框架(MobSF)是一个自动化的一体化移动应用程序(Android/iOS/Windows)测试、恶意软件分析和安全评估框架,能够执行静态和动态分析。MobSF支持移动应用程序二进制文件(APK、XAPK、IPA和APPX&am…...
【C++】初谈迭代器
文章目录 前言一、什么是迭代器二、迭代器的分类三、迭代器的用法总结 前言 迭代器是一种可以访问和遍历容器中元素的对象,它类似于指针,但是具有更多的功能和灵活性。本文将介绍C迭代器的基本概念、分类、用法和注意事项。 一、什么是迭代器 迭代器&a…...
PL端案例开发手册
目 录 前 言 1 工程编译、程序加载方法 1.1 工程编译 1.2 程序加载 2 led-flash 2.1 案例说明 2.2 操作说明 2.3 关键代码 更多帮助 前 言 本文主要介绍PL端案例的使用说明,适用开发环境:Windows 7/10 64bit、Xilinx Unified 20…...
华为OD-整数对最小和
题目描述 给定两个整数数组array1、array2,数组元素按升序排列。假设从array1、array2中分别取出一个元素可构成一对元素,现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值 代码实现 # coding:utf-8 class Solution:…...
Ubuntu 22LTS 配置静态IP
可行方法,需界面配置 转载自:哔哩哔哩链接地址 命令行配置:待补充...
【Python】Python爬虫:网络数据的提取利器
随着互联网的快速发展,网络数据已经成为了一项重要的资源。如何从海量的网络数据中提取出我们需要的信息,就成为了各个行业都需要解决的问题。而Python爬虫,就是解决这个问题的利器。 首先,让我们了解一下什么是Python爬虫。Pyth…...
20.图的遍历
目录 一. 深度优先遍历 二. 广度优先遍历 图的遍历算法和二叉树不同的是,图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。为了避免重复访问,我们的解决思…...
ARM DIY(一)电源、SD卡座、SOC 调试
文章目录 前言加热台焊接热风枪吹焊电烙铁补焊电源调试SD 卡座调试DRAM 电路调试串口电路调试SOC 调试成品 前言 之前打样的几块 ARM 板,一直放着没去焊接。今天再次看到,决定把它焊起来。 加热台焊接 为了提高焊接效率,先使用加热台焊接…...
数学建模知识之小白入门篇
数学建模知识--小白入门篇 一、数学模型的定义二、建立数学模型的方法和步骤1. 模型准备2. 模型假设3. 模型构成4. 模型求解5. 模型分析 三、数模竞赛出题的指导思想四、竞赛中的常见题型1. 实际问题背景2.若干假设条件3.要求回答的问题 五、提交一篇论文…...
【日常积累】Linux下ftp服务安装
概述 FTP是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20用于进行数据传输,端口21用于接受客户端发出的相关FTP命令与参数。FTP服务器普遍部署于内网中,具有容易搭建、方…...
确定了,TikTok将于9月12日正式关闭美国半闭环
外媒报道称,TikTok已对其官网的常见问题页面进行了更新。消息显示,其在美国和英国市场运营的半封闭模式将于9月12日正式结束,并将全力推进TikTok闭环小店业务。尽管我们早在本月初就获悉了这一消息,但实际得知后仍不免有些感慨。曾…...
ATFX汇评:英国7月零售销售年率大降,GBPUSD仍未升破1.3000
ATFX汇评:7月季调后零售销售年率,最新值-3.2%,前值-1.6%,降幅扩大;7月季调后核心零售销售年率,最新值-3.4%,前值-1.6%,降幅扩大。零售销售综合衡量除服务业外包括所有主要从事零售业…...
CTFhub-sqli注入-Referer注入
在最后添加 Referer: (注意 R 大写, Referer后面是 :,Content-Length: 与 Referer: 之间没有空行) 1 2 3 1 union select 1,database() -1 union select 1,database() -1 union select 1,group_concat(table_name)from information_sche…...
小白也能玩转DeepSeek-R1:Ollama一键部署推理模型实战
小白也能玩转DeepSeek-R1:Ollama一键部署推理模型实战 还在为复杂的AI模型部署而烦恼吗?DeepSeek-R1-Distill-Llama-8B作为一款强大的文本生成模型,现在通过Ollama平台可以轻松实现一键部署。本文将带你从零开始,只需3个简单步骤…...
Rockchip Android 12编译踩坑记:手把手教你修改BoardConfig.mk生成userdata.img
Rockchip Android 12编译实战:从BoardConfig.mk修改到userdata.img生成的避坑指南 第一次在Rockchip平台上编译Android 12系统时,我遇到了一个令人抓狂的问题——编译过程看似顺利,但生成的固件烧写到设备后,系统始终无法正常启动…...
出国旅行手机没信号?Nrfr免Root工具一键解锁全球网络
出国旅行手机没信号?Nrfr免Root工具一键解锁全球网络 【免费下载链接】Nrfr 🌍 免 Root 的 SIM 卡国家码修改工具 | 解决国际漫游时的兼容性问题,帮助使用海外 SIM 卡获得更好的本地化体验,解锁运营商限制,突破区域限制…...
MAX7319 GPIO输入扩展库:硬件边沿检测与中断驱动实践
1. 项目概述iotec_MAX7319 是一款面向嵌入式系统的轻量级 C 驱动库,专为 Maxim Integrated(现属 Analog Devices)推出的 IC 接口 GPIO 扩展芯片 MAX7319 设计。该芯片并非通用型端口扩展器,而是一款带可屏蔽边沿检测功能的专用输入…...
SDMatte多风格背景生成:抠图后智能匹配艺术化背景
SDMatte多风格背景生成:抠图后智能匹配艺术化背景 1. 效果亮点预览 SDMatte带来的不仅是简单的透明背景抠图。它开创性地将精准抠图与智能背景生成相结合,让每张图片都能拥有无限可能的艺术化呈现。想象一下,你的产品照片可以瞬间变成油画风…...
VCAM虚拟摄像头:革新移动设备视觉交互的技术探索
VCAM虚拟摄像头:革新移动设备视觉交互的技术探索 【免费下载链接】com.example.vcam 虚拟摄像头 virtual camera 项目地址: https://gitcode.com/gh_mirrors/co/com.example.vcam VCAM虚拟摄像头是一款基于Xposed框架的安卓应用,通过HOOK技术&…...
QQ空间历史数据备份创新解决方案:从技术实现到场景落地
QQ空间历史数据备份创新解决方案:从技术实现到场景落地 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字记忆日益珍贵的今天,个人数据管理已成为信息时代的…...
Qwen2.5-Coder-1.5B应用案例:快速生成网页爬虫代码实战
Qwen2.5-Coder-1.5B应用案例:快速生成网页爬虫代码实战 1. 引言:为什么选择Qwen2.5-Coder生成爬虫代码 在日常开发工作中,网页爬虫是数据采集和分析的重要工具。传统编写爬虫代码需要开发者熟悉HTTP请求、HTML解析、反爬机制处理等多个技术…...
FastAPI安全防线:OAuth2 + JWT 实现无状态认证的完整流程
更多内容请见: 《Python Web项目集锦》 - 专栏介绍和目录 在现代Web应用开发中,安全认证是构建可靠API的基石。FastAPI通过其强大的安全组件,为开发者提供了实现安全、可扩展认证系统的工具。本文将深入剖析OAuth2与JWT在FastAPI中的整合实现,揭示无状态认证的完整流程,提…...
Jailer命令行大师课:自动化数据库子集化的10个技巧
Jailer命令行大师课:自动化数据库子集化的10个技巧 【免费下载链接】Jailer Database Subsetting and Relational Data Browsing Tool. 项目地址: https://gitcode.com/gh_mirrors/ja/Jailer Jailer是一款强大的开源数据库子集化工具,专注于从生产…...
