基本思路:从待检测目标中先按照分类置信度,找一个最可信的框。然后判断其他框和它的交并比(IoU),如果大于阈值TH,说明相似,抑制掉就好了。

算法:1.按照置信度排序 2.判断其他框和得分最高的框的IoU,大于阈值则剔除得分较小的建议框 3.从没有处理的框中继续选择一个得分最高的,重复上述过程。 4.遍历所有的建议框,即所有物体种类都做一遍非极大值抑制。

注意在faster rcnn中有两个阈值0.7,第一次是判断正负样本的时候,大于0.7标为正样本,小于0.3为负样本(背景),中间的样本舍弃。 第二个是在nms中,用来判断和得分最高框的相似度,剔除相似样本。

1.局部最大搜索

目标检测问题的老大难问题之一就是如何提高召回率(所有标注的真实边界框有多少被预测出来了)。

         即recall=正检/(正检+未检)

这就导致最后输出的边界框数量往往远大于实际数量,而这些模型的输出边界框往往是堆叠在一起的。因此,我们需要NMS从堆叠的边框中挑出最好的那个。

  

2.何时使用NMS? When NMS?

回顾我在R-CNN中提到的流程:

  1. 提议区域(选择性搜索)
  2. 提取特征
  3. 目标分类
  4. 回归边框

NMS使用在4. 回归边框之后,即所有的框已经被分类且精修了位置。且所有区域提议的预测结果已经由置信度与阈值初步筛选之后。

3. 如何非极大值抑制 How NMS?

一维简单例子

由于重点是二维(目标检测)的实现,因此一维只放出伪代码便于理解。

判断一维数组I[W]的元素I[i](2<=i<=W-1)是否为局部极大值,即大于其左邻元素I[i-1]和右邻元素I[i+1]

算法流程如下图所示:

  

算法流程3-5行判断当前元素是否大于其左邻与右邻元素,如符合条件,该元素即为极大值点。对于极大值点I[i],已知I[i]>I[i+1],故无需对i+1位置元素做进一步处理,直接跳至i+2位置,对应算法流程第12行。

若元素I[i]不满足算法流程第3行判断条件,将其右邻I[i+1]作为极大值候选,对应算法流程第7行。采用单调递增的方式向右查找,直至找到满足I[i]>I[i+1]的元素,若i<=W-1,该点即为极大值点,对应算法流程第10-11行。

推广至目标检测

首先,根据之前分析确认NMS的前提,输入与输出。

使用前提

目标检测模型已经完成了整个前向计算,并给出所有可能的边界框(位置已精修)。

算法输入

算法对一幅图产生的所有的候选框,每个框有坐标与对应的打分(置信度)。

如一组5维数组:

  • 每个组表明一个边框,组数是待处理边框数
  • 4个数表示框的坐标:X_max,X_min,Y_max,Y_min
  • 1个数表示对应分类下的置信度

注意:每次输入的不是一张图所有的边框,而是一张图中属于某个类的所有边框(因此极端情况下,若所有框的都被判断为背景类,则NMS不执行;反之若存在物体类边框,那么有多少类物体则分别执行多少次NMS)。

除此之外还有一个自行设置的参数:阈值 TH。

算法输出

输入的一个子集,同样是一组5维数组,表示筛选后的边界框。

算法流程

  • 将所有的框按类别划分,并剔除背景类,因为无需NMS。
  • 对每个物体类中的边界框(B_BOX),按照分类置信度降序排列。
  • 在某一类中,选择置信度最高的边界框B_BOX1,将B_BOX1从输入列表中去除,并加入输出列表。
  • 逐个计算B_BOX1与其余B_BOX2的交并比IoU,若IoU(B_BOX1,B_BOX2) > 阈值TH,则在输入去除B_BOX2。
  • 重复步骤3~4,直到输入列表为空,完成一个物体类的遍历。
  • 重复2~5,直到所有物体类的NMS处理完成。
  • 输出列表,算法结束

代码实现及参考:https://www.zhihu.com/question/39405815/answer/791341975

目标检测之非极大值抑制相关推荐

  1. 睿智的目标检测31——非极大抑制NMS与Soft-NMS

    睿智的目标检测31--非极大抑制NMS与Soft-NMS 注意事项 学习前言 什么是非极大抑制NMS 1.非极大抑制NMS的实现过程 2.柔性非极大抑制Soft-NMS的实现过程 注意事项 Soft- ...

  2. Opencv学习笔记(二十六)文本检测mser+非极大值抑制nms

    文章目录 mser检测 nms非极大值抑制 代码 mser检测 nms非极大值抑制 代码 import cv2 import matplotlib.pyplot as plt import numpy ...

  3. 目标检测之—非极大抑制(NMS)综述

    非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素.它在目标检测中起着非常关键的作用. 目标检测一般分为两个过程:训练过程+检测(推理)过程. 在 ...

  4. Shi-tomasi角点检测python实现及基于opencv实现 (角点检测、非极大值抑制)

    写在前面: 已经是七月中旬,黄宁然,你依然在这里. 参考文献镇楼: [1]龚思宇宙,基于平面模板的摄像机标定及相关技术研究 [2]汪洋,扫地机器人定位算法设计与嵌入式系统实现 [3]Denny#,[o ...

  5. 目标检测 nms非极大抑制算法

    nms算法就是对同一个anhor 的box 进行基于阈值的去重 1.目的 对于尺寸为416×416的输入图像,YOLO预测((52×52)+(26×26)+ 13×13))×3 = 10647个边界框 ...

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

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

  7. 深度学习笔记(38) 非极大值抑制

    深度学习笔记(38) 非极大值抑制 1. 对象多次检测问题 2. 非极大值抑制 3. 独立性 1. 对象多次检测问题 到目前为止学到的对象检测中的一个问题是,算法可能对同一个对象做出多次检测 所以算法 ...

  8. 吴恩达神经网络和深度学习-学习笔记-44-交并比IoU + 非极大值抑制

    交并比IoU--衡量定位精确度 在对象检测任务中,我们希望能够同时定位对象. 人们定义IoU这个概念,是为了评价你的对象定位算法是否精准,但更一般地说,IoU衡量了两个边界框重叠的相对大小. 如果实际 ...

  9. 【目标检测系列】非极大值抑制(NMS)的各类变体汇总

    关注上方"深度学习技术前沿",选择"星标公众号", 技术干货,第一时间送达! [导读]前面已经先后为大家详细介绍过了目标检测领域的基础知识:[目标检测基础积累] ...

最新文章

  1. R语言ggplot2可视化分组散点图、使用scale_shape_manual函数、scale_color_manual函数、scale_size_manual函自定义设置分组散点的形状、大小、颜色
  2. python表单防重复提交_防止表单重复提交的几种策略
  3. java 快排和堆排序
  4. 第一个 Dubbo 应用
  5. Building Android App Without an IDE
  6. Linux Shell脚本 - 什么是Shell
  7. nessus重置密码
  8. 【CF603E】Pastoral Oddities cdq分治+并查集
  9. 如何把html转换cad,Tab2Xls插件(捷克版)将AutoCAD表格转换为XLS、CSV或HTML。
  10. linux的文件 I/O操作
  11. SpringCloud(一)系统架构演进
  12. 简单动画(过渡)与复杂动画
  13. J2EE框架技术(SpringMVC) 知识点笔记(2)
  14. 你必须知道的 NET(第2版)
  15. Matlab实现sift特征检测和两幅图像的特征点匹配(D. Lowe)
  16. 20190527-陈静初-文件操作-笔记
  17. 数据挖掘学习笔记3-贝叶斯与决策树
  18. 现代交换技术学习笔记
  19. java工程师的工作述职报告,java程序员述职报告
  20. 【2021-07-31】港股打新网

热门文章

  1. sh脚本中一些命令使用总结及sed命令
  2. 百度文库和豆丁文库的外链推广技巧差异性分析【唯有网络】
  3. flash cs4安装闪一下红的界面
  4. CTF-入门四(续)
  5. 计算机毕业设计Python+uniapp+安卓电影院售票管理APP论文(WEB+APP+LW)
  6. svn 合并分支到主干
  7. sts安装CheckStyle
  8. Golang TCP服务器用户修改名字、查询用户在线以及私聊功能
  9. Linux操作系统下如何查看SQLite的数据库文件
  10. 编写一个java后台