非极大值抑制(Non-maximum suppression,NMS)是一种去除非极大值的算法,常用于计算机视觉中的边缘检测、物体识别等。

算法流程

给出一张图片和上面许多物体检测的候选框(即每个框可能都代表某种物体),但是这些框很可能有互相重叠的部分,我们要做的就是只保留最优的框。假设有N个框,每个框被分类器计算得到的分数为Si,(1<=i<=N)S_i, (1<=i<=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. 回到第1步进行迭代,直到集合 H 为空。集合 M 中的框为我们所需。

需要优化的参数

IoU 的阈值是一个可优化的参数,一般范围为0~0.5,可以使用交叉验证来选择最优的参数。

示例

比如人脸识别的一个例子:

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

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

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

至此所有框处理完毕。
​​
再比如定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。

(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;

(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。

(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

就这样一直重复,找到所有被保留下来的矩形框A、E。

代码

import numpy as npdef py_cpu_nms(dets, thresh):# 单独获取各个参数,以下参数shape = (5,)x1 = dets[:,0]y1 = dets[:,1]x2 = dets[:,2]y2 = dets[:,3]scores = dets[:,4]areas = (y2-y1+1) * (x2-x1+1)print("areas.shape: {}".format(areas.shape))print("areas: {}".format(areas))keep = []# 得分按照由高到低排序的索引, index.shape = (6,)index = scores.argsort()[::-1]print("index.shape: {}".format(index.shape))print("index: {}".format(index))while index.size >0:# i为得分最高的索引i = index[0]      # 将得分最高的索引追加到列表中keep.append(i)# 计算两个box左上角点坐标的最大值x11、y11和右下角坐标的最小值x22、y22# x11、y11、x22、y22 shape = (5,)x11 = np.maximum(x1[i], x1[index[1:]])y11 = np.maximum(y1[i], y1[index[1:]])x22 = np.minimum(x2[i], x2[index[1:]])y22 = np.minimum(y2[i], y2[index[1:]])print("index[1:]: {}".format(index[1:]))print("x1[index[1:]]: {}".format(x1[index[1:]]))print("x11: {}".format(x11))print("x11.shape: {}".format(x11.shape))# 当两个方框相交时,22-11最后得到w,h是正值# 当两个方框不相交的时候,22-11最后得到w,h是负值,则设置为0# w、h shape = (5,)w = np.maximum(0, x22-x11+1)h = np.maximum(0, y22-y11+1)print("w: {}".format(w))print("w.shape: {}".format(w.shape))# 计算交集面积# overlaps.shape = (5,)overlaps = w * hprint("overlaps: {}".format(overlaps))print("overlaps.shape: {}".format(overlaps.shape))# 计算交并比# ious.shape = (5,)ious = overlaps / (areas[i] + areas[index[1:]] - overlaps)print("ious.shape: {}".format(ious.shape))print("ious: {}".format(ious))# 得到满足阈值条件的ious中的索引(ious相比index缺少第一个最大值)ious_idx = np.where(ious<=thresh)[0]print("ious<=thres idx: {}".format(ious_idx))# ious_idx+1得到在index中的索引index = index[ious_idx + 1]   # because index start from 1print("index: {}".format(index))return keepif __name__ == "__main__":boxes=np.array([[100,100,210,210,0.72], # 0[250,250,420,420,0.8],  # 1[220,220,320,330,0.92], # 2[100,100,210,210,0.72], # 3[230,240,325,330,0.81], # 4[220,230,315,340,0.9]]) # 5keep = py_cpu_nms(boxes, thresh=0.7)print("keep: {}".format(keep))

深度学习之非极大值抑制(Non-maximum suppression,NMS)相关推荐

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

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

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

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

  3. 非极大值抑制(non-maximum suppression)的理解

    最近在学习RCNN时看到了非极大值抑制,一开始有点不明白,在网上学习了之后记录一下. 非极大值抑制就是一个寻找局部最大值的过程. 在进行目标检测时一般会采取窗口滑动的方式,在图像上生成很多的候选框,然 ...

  4. 非极大值抑制(Non-maximum suppression)在物体检测领域的应用

    转载自:http://blog.csdn.net/pb09013037/article/details/45477591 一.Nms主要目的 在物体检测非极大值抑制应用十分广泛,主要目的是为了消除多余 ...

  5. 非极大值抑制算法总结(NMS, soft-NMS)

    NMS-非极大值抑制算法总结 greedy-nms.soft-nms 标准非极大值抑制 - NMS 软阈值NMS - soft-NMS greedy-nms.soft-nms greedy-NMS是最 ...

  6. 非极大值抑制(non-maximum suppression)的理解与实现

    非极大抑制(Non-Maximum Suppression) Non-Maximum Suppression for Object Detection in Python RCNN 和微软提出的 SP ...

  7. 【YOLOv3 NMS】YOLOv3中的非极大值抑制

    文章目录 1 NMS问题由来 2 NMS操作流程 2.1 进行NMS前要先有什么 2.2 NMS流程 3 NMS代码解读 4 感谢链接 1 NMS问题由来 利用YOLOv3网络结构提取到out0.ou ...

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

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

  9. 深度学习自学(三):NMS非极大值抑制总结

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

最新文章

  1. androidwakelock_Android中的WakeLock
  2. 配置zabbix监控windows,cmd运行报错cannot connect to Service Manager: [0x00000005]
  3. 为什么需要ORM 框架
  4. python错误处理
  5. MySQL进阶:从删库到跑路
  6. c语言上机实验第五章答案,安徽大学C语言上机实验参考答案
  7. 完工后的决算书范本_工程决算书范本
  8. 【Android】实例 忐忑的精灵
  9. Python 安装配置VLFeat
  10. Oracle(7)——Oracle修改国家字符集
  11. win8.1修改用户名
  12. xp系统如何更改计算机用户名,windows xp电脑如何设置、修改开机密码
  13. open judge 1.6.3
  14. 微信号开通检测软件选择需谨慎
  15. WinCC在C脚本创建电子签名对话框
  16. 自己动手做一个绿色便携版的谷歌浏览器Chrome,可以放入U盘随意带走的
  17. 蓝桥杯12题c语言,2012.C语言‘蓝桥杯“预赛.真题.高职
  18. 计算机编写代码简介,Vcomputer简介
  19. 华为交换机与h3c交换机端口聚合
  20. php 调整图片色温,php – 以K计算色温

热门文章

  1. MySQL 客户端命令
  2. 利用MFC调用libvlc.dll作一个简单的播放器
  3. 来自前苹果高管Heidi Roizen的经验之谈
  4. 项目经理沟通的四个好习惯
  5. Mysql中DATE_SUB 使用方法结合查询一天内,一周内,一月内的信息实例讲解
  6. BigDecimal 加减乘除运算
  7. 基于BISS0001构成的热释电红外延时照明控制器电路图
  8. 神马是线程?PHP对其具体的应用?应用在哪里?
  9. php课程 4-15 数组遍历、超全局数组、表单提交数据(多看学习视频)
  10. 自定义SeekBar 实时显示百分比进度