当前位置: 首页 > news >正文

【AI面试】NMS 与 Soft NMS 的辨析

往期文章:

  • AI/CV面试,直达目录汇总
  • 【AI面试】L1 loss、L2 loss和Smooth L1 Loss,L1正则化和L2正则化

一、NMS

非极大值抑制Non-Maximum Suppression,NMS),并不是深度学习时期,目标检测的产物。在传统的图像处理领域,就已经引入了NMS算法。所以,他是老算法的新使用。

  • 目的: 为了消除多余的框,找到最佳的物体检测的位置
  • 思想:选取那些邻域里分数最高的窗口,同时抑制那些分数低的窗口
  • 本质:搜索局部极大值,抑制非极大值元素

NMS算法的步骤:

  1. 按某个数值从高到低进行排序(高低的可以是置信度)
  2. 低的依次与最高的进行IOU的对比,超过指定阈值的,将会被踢除(分数又低,还跟高的长的相近,活该被删除),否则,就先暂时留着
  3. 留下来的,重复步骤1和2,直到不再发生改变为止

Canny边缘检测、霍夫变换圆形检测里面,也都会用到NMS对多余的点、圆心进行去除。那此事排序用到的值就不再是置信度了,是梯度的值、圆心点的投票数了。

这两个更多细节的,可以参考这里:

  • 图像处理笔记3-Canny边缘检测算法与原理
  • 图像处理笔记4-霍夫变换直线检测、圆检测

问一个面试官常快问快答的问题:

是阈值低,最后留下的多,还是阈值高,最后留下的多?

答案是:阈值高,留下的多

因为你的目的是要把次的、不重要的给剔除掉。那么你设定的重复阈值高,自然重复的就少,删除的也就少,最后留下来的自然就变多了。

在这里插入图片描述

二、Soft NMS

Soft NMSNMS 的一种变种,改进版本。从名字我们就大概能猜出来一些:没有NMS那么的硬(hard),比较的软(soft)。

绝大部分目标检测方法,最后都要用到 NMS-非极大值抑制进行后处理。 通常的做法是将检测框按得分排序,然后保留得分最高的框,同时删除与该框重叠面积大于一定比例的其它框。那为什么还要改进,推出一个Soft NMS

NMS 的这种贪心式方法存在如下图所示的问题:

红色框绿色框是当前的检测结果,二者的得分分别是0.950.80。如果按照传统的NMS进行处理,首先选中得分最高的红色框,然后绿色框就会因为与之重叠面积过大而被删掉。

另一方面,NMS的阈值也不太容易确定,设小了会出现绿色框因为和红色框重叠面积较大而被删掉,设置过高又容易增大误检。

nms我两个都要,那该给个什么思路呢?不要粗鲁地删除所有IOU大于阈值的框,而是降低其置信度。

Soft NMS思路和做法如下:

  • 相邻区域内(IOU超过阈值)的检测框的分数进行调整,而非彻底的抑制,从而提高了高检索率的情况下的准确率;
  • 在低检索率时,仍能对物体检测性能有明显提升。

三、NMS和SoftNMS的对比学习

原来的NMS可以描述为:IOU大于阈值的窗口的得分全部置为0。公式如下:
nms
用人话解释下NMS的公式,就是:

  • 分数低的框与分数高的框的iou小于阈值的,不变
  • 分数低的框与分数高的框的iou大于或等于于阈值的,置信度直接置为0,也就是被踢出了

而SoftNMS可以描述为:将IOU大于阈值的窗口的得分进行改写,iou越大,(1-iou)就越小。线性加权的公式如下:
softnms
对比NMS,用人话解释下softNMS的公式,就是:

  • 分数低的框与分数高的框的iou小于阈值的,不变,与NMS处理一样
  • 分数低的框与分数高的框的iou大于或等于于阈值的,置信度不再置为0,而是通过置信分数*(1-iou),得到新的分数,进行替换.

对比总结:

  • 在NMS的算法里面,对于IOU超于阈值的检测框,直接剔除;
  • 而Soft NMS,对于IOU超过阈值的检测框,不是直接删除,而是改变该检测框的置信度,踢出的工作留给了置信度阈值来做。

论文展示结果又回到前面两匹马的问题上来。假设框1的置信度是0.95框2的置信度是0.8,还有一个框3的置信度是0.7。我们最终的目的是将框1和框2保留下来,将框3进行剔除掉。

  • 假设使用的是NMS,那么框2和3都会被剔除掉,因为他们与框1的iou都比较高,很大可能性是高于阈值的,都被提除掉了。
  • 那假设使用的是softNMS,框2和3的置信度就会被重新改写。2和1的iou较小,改写之后的置信度是0.4;3和1的iou较大,置信度会更低,大概是0.2。那假设筛选阈值正好是0.3,就恰好把2留下,把3踢出了。
  • 但是,这里也有一个问题就是置信度的阈值如何选择?作者在这里依然使用手工设置的值,依然存在很大的局限性,所以该算法依然存在改进的空间。

最后
针对这个问题,我也帮你们提前问了chatGPT,也给出了一个较为总结性的回答,如下所示。你们觉得它回答的如何呢?

1
2
3
4
在这里插入图片描述
4

  • Soft-NMS – Improving Object Detection With One Line of Code
  • IOU-Net , Acquisition of Localization Confidence for Accurate Object Detection
  • Matrix NMS,SOLOv2: Dynamic and Fast Instance Segmentation

通过对chatGPT的询问,我们又知道了两个NMS,分别是IoU NMS Matrix NMS,这是我们新的收获。后面我们会继续补充这块内容

在这里插入图片描述

上图是IoU-Net论文的测试结果,展示了 IoU和召回率的关系,No-NMS是召回率的上界,可以看到IoU-NMS的召回率更高,且在更高的IoU下,IoU-NMS与上界的差距越小。

参考链接:

  • NMS和soft-nms算法
  • 哔哩哔哩视频

相关文章:

【AI面试】NMS 与 Soft NMS 的辨析

往期文章: AI/CV面试,直达目录汇总【AI面试】L1 loss、L2 loss和Smooth L1 Loss,L1正则化和L2正则化 一、NMS 非极大值抑制(Non-Maximum Suppression,NMS),并不是深度学习时期,目标…...

一文让你彻底理解Linux内核多线程(互斥锁、条件变量、读写锁、自旋锁、信号量)

一、互斥锁(同步) 在多任务操作系统中,同时运行的多个任务可能都需要使用同一种资源。这个过程有点类似于,公司部门里,我在使用着打印机打印东西的同时(还没有打印完),别人刚好也在…...

利用python写一个gui小公举--环境搭建

文章目录背景搭建环境安装必要库添加工具快捷方式检验背景 在实习过程中遇到一个问题,某项目是通过python代码实现的,而且需要一直修改参数实现功能,过程有些繁琐。虽然师兄用PHP study搭了一个网站用于查看结果,但是还是过于繁琐…...

英飞凌Tricore实战系列02_ENDINIT属性看门狗原理及应用

目录 1.概述2.ENDINIT功能及使用2.1 ENDINIT属性2.2 改写受ENDINIT保护寄存器的步骤3. Tricore 看门狗介绍及使用3.1 看门狗系统介绍3.1.1 安全看门狗介绍3.1.2 CPU看门狗介绍3.2 看门狗模式介绍3.2.1 Time-out模式3.2.2 正常模式(Normal Mode)3.2.3 禁用模式(Disabled Mode…...

Java Number类

Java Number 类是一个抽象类,它是所有数字类的基类。Java 中的数字类包括 Byte、Short、Integer、Long、Float 和 Double,它们都继承自 Number 类。Java Number 类提供了一些常用的方法,可以用于将数字类型转换为不同的格式,以及进…...

C++构造和析构

欢迎来观看温柔了岁月.c的博客 目前 设有C学习专栏 C语言项目专栏 数据结构与算法专栏 目前主要更新C学习专栏,C语言项目专栏不定时更新 待C专栏完毕,会陆续更新C项目专栏和数据结构与算法专栏 一周主要三更,星期三,星期五&#x…...

docker安装即docker连接mysql(window)

一 安装docker 1.什么是docker Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。 2.WSL2 WSL,即Windows Subsystem on Linux,中…...

HMM-维特比算法

HMM-维特比算法(viterbi)HMM回顾隐马科夫链解法:维特比算法(Viterbi)HMM回顾 最终的公式可以解释主要分为两个部分: P(xi|yi),发射概率,字面意思是从一个词性中发射/生成出某一个单…...

【C++初阶】2. 类和对象_1

1. 面向过程和面向对象的初步认识 2. 类的引入 C语言结构体中只能定义变量,在C中,结构体内不仅可以定义变量,也可以定义函数。比如: 之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量&#…...

kotlin把函数作为参数转递给另一个函数

kotlin把函数作为参数转递给另一个函数 fun say(s: String, foo: (String) -> Unit) {print("hello")foo(s) }fun hi(str: String) {println(str) }fun main(args: Array<String>) {say("hello", ::hi) } 输出&#xff1a; hellohello...

海思嵌入式开发-005-OpenHarmony源码编译问题

海思嵌入式开发-005-OpenHarmony源码编译问题一、问题描述二、解决方案2.1解决原理2.2获取OpenHarmony 3.1.1 Release源码2.3最后解决问题&#xff0c;编译成功。一、问题描述 按照链接拉取master源码&#xff0c;出现如下问题&#xff0c;打开build.log文件 提示相应位置的文…...

指针的进阶续(笔试题强化练习)

写在前面&#xff1a;在上次我们学习了指针的相关类型的知识&#xff0c;对指针家族的成员基本有了了解&#xff0c;这次让我们跟着一些题目来练习和补充一些知识&#xff0c;这有助于我们强化理解这些知识。 话不多说&#xff0c;我们马上开始&#xff1a; 1.指针和数组的笔…...

一个供参考的计算机的学习路线

本文是介绍如何成为一个Geek&#xff0c;一个真正的计算机高手。 适合有成为IT领域技术大牛的人参考。 写给大一新生和所有向深耕IT领域的人&#xff0c;避免走一些弯路。 仅代表个人想法&#xff0c;供批判性参考。 第一门入门的必备功课-语法与算法 什么是计算机&#xff1f…...

React(五):受控组件、高阶组件、Portals、Fragment、CSS的编写方式

React&#xff08;五&#xff09;一、受控组件1.什么是受控组件&#xff08;v-model&#xff09;2.收集表单数据:input和单选框3.收集表单数据:下拉框二、非受控组件三、高阶组件1.什么是高阶组件2.高阶组件的应用13.高阶组件的应用2-注入Context4.高阶组件的应用3-登录鉴权5.高…...

MATLAB——系统环境

MATLAB概述MATLAB的发展MATLAB:MATrix LABoratory1980年前后&#xff0c;Cleve Moler教授编写的Linpack 和Eispack的接口程序。1984年&#xff0c;MATLAB第1版(DOS版)1992年&#xff0c;MATLAB4.0版1994年&#xff0c;MATLAB 4.2版1997年&#xff0c;MATLAB 5.0版1999年&#x…...

2 GateWay工作流程+GateWay搭建

GateWay工作流程GateWay搭建 核心流程图如下&#xff1a; 核心概念&#xff1a; 客户端向 Spring Cloud Gateway 发出请求。如果Gateway Handler Mapping确定请求与路由匹配&#xff0c;则将其发送到Gateway Web Handler 处理程序。此处理程序通过特定于请求的Fliter链运行请求…...

【微信小程序】富文本rich-text的图片预览效果的几种方法

前言 使用原生小程序开发&#xff0c;实现在富文本rich-text中的图片预览效果的几种方法对比。 1.正则wx.previewImage&#xff08;有明显不足&#xff09; 一个不需要用额外组件或插件的方法&#xff1a; 思路&#xff1a;使用正则把图片的url进行剖离出来&#xff0c;push…...

通信网络-Socket、Java中的网络支持、多线程服务器

前言 通信网络-Socket、Java中的网络支持、多线程服务器 场景&#xff1a;使用java网络创建一个聊天室 博客地址&#xff1a;芒果橙的个人博客 文章目录前言通信网络-SocketTCP/IPTCP/IP 模型端口Java中的网络支持概念1. InetAddress2. URL3. Socket4. Datagram多线程服务器应用…...

搞懂 JS this、call、apply、bind

搞懂 JS this、call、apply、bind javascript 的 this ECMAScript 规范中这样写&#xff1a; this 关键字执行为当前执行环境的 ThisBinding。 MDN 上这样写&#xff1a; In most cases, the value of this is determined by how a function is called. 在绝大多数情况下&…...

力扣209长度最小的子数组

209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xf…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...