当前位置: 首页 > 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算法
  • 哔哩哔哩视频
http://www.lryc.cn/news/28942.html

相关文章:

  • 一文让你彻底理解Linux内核多线程(互斥锁、条件变量、读写锁、自旋锁、信号量)
  • 利用python写一个gui小公举--环境搭建
  • 英飞凌Tricore实战系列02_ENDINIT属性看门狗原理及应用
  • Java Number类
  • C++构造和析构
  • docker安装即docker连接mysql(window)
  • HMM-维特比算法
  • 【C++初阶】2. 类和对象_1
  • kotlin把函数作为参数转递给另一个函数
  • 海思嵌入式开发-005-OpenHarmony源码编译问题
  • 指针的进阶续(笔试题强化练习)
  • 一个供参考的计算机的学习路线
  • React(五):受控组件、高阶组件、Portals、Fragment、CSS的编写方式
  • MATLAB——系统环境
  • 2 GateWay工作流程+GateWay搭建
  • 【微信小程序】富文本rich-text的图片预览效果的几种方法
  • 通信网络-Socket、Java中的网络支持、多线程服务器
  • 搞懂 JS this、call、apply、bind
  • 力扣209长度最小的子数组
  • 【mysql是怎样运行的】-InnoDB数据页结构
  • VIM实用指南(10)语法自动补全插件coc.nvim
  • 【Vue3 第二十二章】过渡动画
  • 【linux】:进程状态(僵尸进程等)以及环境变量
  • 【C语言——练习题】指针,你真的学会了吗?
  • Linux用户空间与内核空间通信(Netlink通信机制)
  • 3.3日报
  • 并发编程-进程
  • LeetCode196_196. 删除重复的电子邮箱
  • Auto.js Pro 替代品
  • 红日(vulnstack)2 内网渗透ATTCK实战