深度学习之非极大值抑制(Non-maximum suppression,NMS)
非极大值抑制(Non-maximum suppression,NMS)是一种去除非极大值的算法,常用于计算机视觉中的边缘检测、物体识别等。
算法流程
给出一张图片和上面许多物体检测的候选框(即每个框可能都代表某种物体),但是这些框很可能有互相重叠的部分,我们要做的就是只保留最优的框。假设有N个框,每个框被分类器计算得到的分数为Si,(1<=i<=N)S_i, (1<=i<=N)Si,(1<=i<=N)。
建造一个存放待处理候选框的集合H,初始化为包含全部N个框;建造一个存放最优框的集合M,初始化为空集。
将所有集合 H 中的框进行排序,选出分数最高的框 m,从集合 H 移到集合 M;
遍历集合 H 中的框,分别与框 m 计算交并比(Interection-over-union,IoU),如果高于某个阈值(一般为0~0.5),则认为此框与 m 重叠,将此框从集合 H 中去除。
回到第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)相关推荐
- 【深度学习】非极大值抑制Non-Maximum Suppression(NMS)一文搞定理论+多平台实现...
薰风说 Non-Maximum Suppression的翻译是非"极大值"抑制,而不是非"最大值"抑制.这就说明了这个算法的用处:找到局部极大值,并筛除(抑制) ...
- 非极大值抑制(Non-Maximum Suppression,NMS)(转)
概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二 ...
- 非极大值抑制(non-maximum suppression)的理解
最近在学习RCNN时看到了非极大值抑制,一开始有点不明白,在网上学习了之后记录一下. 非极大值抑制就是一个寻找局部最大值的过程. 在进行目标检测时一般会采取窗口滑动的方式,在图像上生成很多的候选框,然 ...
- 非极大值抑制(Non-maximum suppression)在物体检测领域的应用
转载自:http://blog.csdn.net/pb09013037/article/details/45477591 一.Nms主要目的 在物体检测非极大值抑制应用十分广泛,主要目的是为了消除多余 ...
- 非极大值抑制算法总结(NMS, soft-NMS)
NMS-非极大值抑制算法总结 greedy-nms.soft-nms 标准非极大值抑制 - NMS 软阈值NMS - soft-NMS greedy-nms.soft-nms greedy-NMS是最 ...
- 非极大值抑制(non-maximum suppression)的理解与实现
非极大抑制(Non-Maximum Suppression) Non-Maximum Suppression for Object Detection in Python RCNN 和微软提出的 SP ...
- 【YOLOv3 NMS】YOLOv3中的非极大值抑制
文章目录 1 NMS问题由来 2 NMS操作流程 2.1 进行NMS前要先有什么 2.2 NMS流程 3 NMS代码解读 4 感谢链接 1 NMS问题由来 利用YOLOv3网络结构提取到out0.ou ...
- 深度学习笔记(38) 非极大值抑制
深度学习笔记(38) 非极大值抑制 1. 对象多次检测问题 2. 非极大值抑制 3. 独立性 1. 对象多次检测问题 到目前为止学到的对象检测中的一个问题是,算法可能对同一个对象做出多次检测 所以算法 ...
- 深度学习自学(三):NMS非极大值抑制总结
非极大值抑制(Non-Maximum Suppression,NMS) 顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域 ...
最新文章
- androidwakelock_Android中的WakeLock
- 配置zabbix监控windows,cmd运行报错cannot connect to Service Manager: [0x00000005]
- 为什么需要ORM 框架
- python错误处理
- MySQL进阶:从删库到跑路
- c语言上机实验第五章答案,安徽大学C语言上机实验参考答案
- 完工后的决算书范本_工程决算书范本
- 【Android】实例 忐忑的精灵
- Python 安装配置VLFeat
- Oracle(7)——Oracle修改国家字符集
- win8.1修改用户名
- xp系统如何更改计算机用户名,windows xp电脑如何设置、修改开机密码
- open judge 1.6.3
- 微信号开通检测软件选择需谨慎
- WinCC在C脚本创建电子签名对话框
- 自己动手做一个绿色便携版的谷歌浏览器Chrome,可以放入U盘随意带走的
- 蓝桥杯12题c语言,2012.C语言‘蓝桥杯“预赛.真题.高职
- 计算机编写代码简介,Vcomputer简介
- 华为交换机与h3c交换机端口聚合
- php 调整图片色温,php – 以K计算色温