非极大值抑制,简称为NMS算法,英文为Non-Maximum Suppression。其思想是搜素局部最大值,抑制极大值。NMS算法在不同应用中的具体实现不太一样,但思想是一样的。非极大值抑制,在计算机视觉任务中得到了广泛的应用,例如边缘检测、人脸检测、目标检测(DPM,YOLO,SSD,Faster R-CNN)等。

使用非极大抑制的原因在于:

以目标检测为例,目标检测的过程中在同一目标的位置上会产生大量的候选框,这些候选框相互之间可能会有重叠,此时我们需要利用非极大值抑制找到最佳的目标边界框,消除冗余的边界框。

上图中,左边是人脸检测的候选框结果,每个边界框有一个置信度得分(confidence score),如果不使用非极大值抑制,就会有多个候选框出现。右图是使用非极大值抑制之后的结果,符合我们人脸检测的预期结果。

算法流程:

✔️ 给出一张图片和上面许多物体检测的候选框(即每个框可能都代表某种物体),但是这些框很可能有互相重叠的部分,我们要做的就是只保留最优的框。假设有N个框,每个框被分类器计算得到的分数为 Si, 1 ⩽ i ⩽ N。

  1. 建造一个存放待处理候选框的集合H,初始化为包含全部N个框;建造一个存放最优框的集合M,初始化为空集。
  2. 将所有集合 H 中的框进行排序,选出分数最高的框 m,从集合 H 移到集合 M;
  3. 遍历集合 H 中的框,分别与框 m 计算交并比(Interection-over-union,IoU),如果高于某个阈值(一般为0~0.5),则认为此框与 m 重叠,将此框从集合 H 中去除。
  4. 回到第2步进行迭代,直到集合 H 为空。集合 M 中的框为我们所需。

<Eg> :以人脸检测为例:

已经识别出了5个候选框,但是我们只需要最后保留两个人脸。

① 首先选出分数最大的框(0.98),然后遍历剩余框,计算 IoU,会发现露丝脸上的两个绿框都和 0.98 的框重叠率很大,都要去除。

② 然后只剩下杰克脸上两个框,选出最大框(0.81),然后遍历剩余框(只剩下0.67这一个了),发现0.67这个框与 0.81 的 IoU 也很大,去除。

至此所有框处理完毕,算法结果:

代码:

✔️ NMS算法一般是为了去掉模型预测后的多余框,其一般设有一个nms_threshold=0.5,具体的实现思路如下:

  • 选取这类box中scores最大的哪一个,它的index记为 i ,并保留它;
  • 计算 boxes[i] 与其余的 boxes 的 IOU 值;
  • 如果其 IOU>0.5 了,那么就舍弃这个box(由于可能这两个box表示同一目标,所以保留分数高的哪一个);
  • 从最后剩余的boxes中,再找出最大scores的哪一个,如此循环往复。
def nms(boxes, scores, threshold=0.5, top_k=200):'''Args:boxes: 预测出的box, shape[M,4]scores: 预测出的置信度,shape[M]threshold: 阈值top_k: 要考虑的box的最大个数Return:keep: nms筛选后的box的新的index数组count: 保留下来box的个数'''keep = scores.new(scores.size(0)).zero_().long()x1 = boxes[:, 0]y1 = boxes[:, 1]x2 = boxes[:, 2]y2 = boxes[:, 3]area = (x2-x1)*(y2-y1)  # 面积,shape[M]_, idx = scores.sort(0, descending=True) # 降序排列scores的值大小# 取前top_k个进行nmsidx = idx[:top_k]count = 0while idx.numel():# 记录最大score值的indexi = idx[0]# 保存到keep中keep[count] = i# keep 的序号count += 1if idx.size(0) == 1: # 保留框只剩一个breakidx = idx[1:] # 移除已经保存的index# 计算boxes[i]和其他boxes之间的iouxx1 = x1[idx].clamp(min=x1[i])yy1 = y1[idx].clamp(min=y1[i])xx2 = x2[idx].clamp(max=x2[i])yy2 = y2[idx].clamp(max=y2[i])w = (xx2 - xx1).clamp(min=0)h = (yy2 - yy1).clamp(min=0)# 交集的面积inter = w * h  # shape[M-1]iou = inter / (area[i] + area[idx] - inter)# iou满足条件的idxidx = idx[iou.le(threshold)] # Shape[M-1]return keep, count

其中:

  • torch.numel(): 表示一个张量总元素的个数
  • torch.clamp(min, max): 设置上下限
  • tensor.le(x): 返回tensor<=x的判断

参考文章:【SSD算法】史上最全代码解析-核心篇 - 知乎 (zhihu.com)

非极大值抑制(Non-Maximum Suppression) - 简书 (jianshu.com)

NMS(Non-Maximum Suppression,非极大值抑制)解析相关推荐

  1. yunyang tensorflow-yolov3 NMS:non maximum suppression 非极大值抑制方法

    文章目录 NMS: non maximum suppression 非极大值抑制的背景 非极大值抑制的步骤 NMS: non maximum suppression 非极大值抑制的背景 生成器对一张图 ...

  2. NMS(Non-Maximum Suppression)非极大值抑制

    非极大值抑制 概述 在目标检测领域,我们经常用到非极大值抑制(NMS),NMS就是在局部范围内抑制不是极大值的目标,只保留极大值. 原理 在检测任务重,我们会得到一批具有置信度S的bbox列表B,首先 ...

  3. Non-Maximum Suppression,NMS非极大值抑制

    Non-Maximum Suppression,NMS非极大值抑制 概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜 ...

  4. 【深度学习】非极大值抑制Non-Maximum Suppression(NMS)一文搞定理论+多平台实现...

    薰风说 Non-Maximum Suppression的翻译是非"极大值"抑制,而不是非"最大值"抑制.这就说明了这个算法的用处:找到局部极大值,并筛除(抑制) ...

  5. 下拉多选择框 实现方式_非极大值抑制Non-Maximum Suppression(NMS)一文搞定理论+多平台实现...

    这是独立于薰风读论文的投稿,作为目标检测模型的拓展阅读,目的是帮助读者详细了解一些模型细节的实现. 薰风说 Non-Maximum Suppression的翻译是非"极大值"抑制, ...

  6. 深度学习之非极大值抑制(Non-maximum suppression,NMS)

    非极大值抑制(Non-maximum suppression,NMS)是一种去除非极大值的算法,常用于计算机视觉中的边缘检测.物体识别等. 算法流程 给出一张图片和上面许多物体检测的候选框(即每个框可 ...

  7. 非极大值抑制(Non-Maximum Suppression,NMS)(转)

    概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二 ...

  8. 非极大值抑制算法(Non-Maximum Suppression,NMS)

    所属知识点:Computer Vision:Object Detection 归纳和总结机器学习技术的库:ViolinLee/ML_notes 使用滴滴云AI大师码[0212]消费GPU有9折优惠哦! ...

  9. NMS(非极大值抑制)算法详解与示例

    一.NMS是什么? NMS(non maximum suppression)即非极大值抑制,广泛应用于传统的特征提取和深度学习的目标检测算法中. NMS原理是通过筛选出局部极大值得到最优解. 在2维边 ...

最新文章

  1. Python中fnmatch模块的使用
  2. Python常用扩展包
  3. ECshop商城程序常见的96个小问题汇总
  4. c 指针地址 突然改变_开发笔记 - Cpp - 指针 - 1.1 如何理解指针
  5. 一次完整较为渗透过程
  6. 免费流量监控软件,最大可同时监控1000台电脑
  7. 诗与远方:无题(七十)- 小熊熬夜记
  8. Python爬虫项目--爱拍视频批量下载
  9. 1.组合数据类型练习: 分别定义字符串,列表,元组,字典,集合,并进行遍历。 总结列表,元组,字典,集合的联系与区别。...
  10. 速查 Git 常用命令
  11. UVA10284 POJ2512 Chessboard in FEN【国际象棋】
  12. 用scanf输入long long 型的数
  13. mybatis之OGNL表达式
  14. OpenCV-绘制圆角矩形
  15. 微软软件实现技术授课系列内容之五:软件测试基础
  16. 【LSR标签平滑理解】
  17. 学习Node.js笔记(一)
  18. jQuery 事件 - blur() 方法
  19. flash控件使用手册
  20. Effective C++知识点

热门文章

  1. AOSP Android 8.0 冷启动流程分析(二)
  2. 构造方法:构造方法的格式和执行时机;构造方法的作用;构造方法的注意事项;
  3. php 单笔转账到支付宝账户,php实现单笔转账到支付宝功能
  4. 各向同性+随动硬化+过应力-vumat-理论推导
  5. 【Response】
  6. 如何成为一名大数据开发工程师
  7. 小程序发送 request请求失败 提示不在合法域名列表中的解决方法
  8. Mega2560(Arduino)Bootloader烧录指南
  9. 你的背包背到现在还没烂
  10. docxtpl 学习笔记