SOFT-NMS (二) (non maximum suppression,非极大值抑制)
import numpy as np boxes = np.array([[200, 200, 400, 400], [220, 220, 420, 420], [200, 240, 400, 440], [240, 200, 440, 400], [1, 1, 2, 2]], dtype=np.float32)
boxscores = np.array([0.9, 0.8, 0.7, 0.6, 0.5], dtype=np.float32) # 不放在里面是因为scores会发生变化 def softnms(boxes_x1y1x2y2, score_boxes, threshold_iou = 0.3, sigma=0.5, threshold_end=0.001, method=2):
"""
softnms
:param boxes_x1y1x2y2: boexs 坐标矩阵 format [y1, x1, y2, x2]
:param score_boxes: 每个 boxes 对应的分数
:param threshold_iou: 其余boxes与一个最好score的box分别求解iou,大于score_boxes值表示与该box重叠很高的重复框去掉,小于该值的可能是其它object的框, 交叠门限
:param sigma: 使用 gaussian 函数的方差
:param threshold_end: 最后的分数门限,将一次一次求解最好的box对应的iou值保存在scores中,而后保留大于此阈值的scores对应boxes
:param method: 使用的方法
:return: 留下的 boxes 的 index
"""
# indexes concatenate boxes with the last column
N = boxes_x1y1x2y2.shape[0] # 表示boxes的个数
# the order of boxes coordinate is [y1,x1,y2,x2]
y1 = boxes_x1y1x2y2[:, 0]
x1 = boxes_x1y1x2y2[:, 1]
y2 = boxes_x1y1x2y2[:, 2]
x2 = boxes_x1y1x2y2[:, 3]
scores = score_boxes
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
for i in range(N):
# intermediate parameters for later parameters exchange
tBD = boxes_x1y1x2y2[i, :].copy() # 对应的第i个坐标
tscore = scores[i].copy() # 对应的第i个scores
tarea = areas[i].copy() # 对应的第i个面积
pos = i + 1 # pos为跳过当前第i个的box的索引
if i != N - 1: # 判断i是否取最大了
maxscore = np.max(scores[pos:], axis=0) # 跳过当前第i个后的scores分数取最大的
maxpos = np.argmax(scores[pos:], axis=0) # 跳过当前第i个后的scores分数取最大的分数对应的索引
else:
maxscore = scores[-1] # 如果没有(即只有一个),就取这个
maxpos = 0 # 因为只有一个,即索引为0
if tscore < maxscore: # 第一个与
# 每次把最高score的 往上拿
boxes_x1y1x2y2[i, :] = boxes_x1y1x2y2[maxpos + i + 1, :] # 行置换,score,area也一样
boxes_x1y1x2y2[maxpos + i + 1, :] = tBD
tBD = boxes_x1y1x2y2[i, :]
scores[i] = scores[maxpos + i + 1]
scores[maxpos + i + 1] = tscore
tscore = scores[i]
areas[i] = areas[maxpos + i + 1]
areas[maxpos + i + 1] = tarea
tarea = areas[i]
# IoU calculate
xx1 = np.maximum(boxes_x1y1x2y2[i, 1], boxes_x1y1x2y2[pos:, 1])
yy1 = np.maximum(boxes_x1y1x2y2[i, 0], boxes_x1y1x2y2[pos:, 0])
xx2 = np.minimum(boxes_x1y1x2y2[i, 3], boxes_x1y1x2y2[pos:, 3])
yy2 = np.minimum(boxes_x1y1x2y2[i, 2], boxes_x1y1x2y2[pos:, 2])
w = np.maximum(0.0, xx2 - xx1 + 1)
h = np.maximum(0.0, yy2 - yy1 + 1)
inter = w * h
ovr = inter / (areas[i] + areas[pos:] - inter)
# Three methods: 1.linear 2.gaussian 3.original NMS
if method == 1: # linear
weight = np.ones(ovr.shape)
weight[ovr > threshold_iou] = weight[ovr > threshold_iou] - ovr[ovr > threshold_iou]
elif method == 2: # gaussian
weight = np.exp(-(ovr * ovr) / sigma)
else: # original NMS
weight = np.ones(ovr.shape)
weight[ovr > threshold_iou] = 0 # 表示大于Nt的iou值就和比较的box重合很多,因此大于这个阈值的iou为0,则相当于该score为0
scores[pos:] = weight * scores[pos:] # 给定scores的值,若不好就删除
# select the boxes and keep the corresponding indexes
boxes_new = boxes_x1y1x2y2[scores > threshold_end] # 判断求解的scores是否满足阈值,若满足就保留
return boxes_new
# boxes and scores boees_slect = softnms(boxes, boxscores, method=3)
print(boees_slect) 原始NMS结果如下:

线性soft-nms:

高斯nms:

SOFT-NMS (二) (non maximum suppression,非极大值抑制)的更多相关文章
- NMS(Non-Maximum Suppression) 非极大值抑制
NMS 非极大值抑制:找到局部最大值,并删除邻域内其他的值. 简单说一下流程: 首先剔除背景(背景无需NMS),假设有6个边界框,根据分类置信度对这6个边界框做降序排列,假设顺序为A.B.C.D.E ...
- Non-maximum suppression(非极大值抑制算法)
在RCNN系列目标检测中,有一个重要的算法,用于消除一些冗余的bounding box,这就是non-maximum suppression算法. 这里有一篇博客写的挺好的: http://www.c ...
- 非极大值抑制(Non-Maximum Suppression,NMS)
概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二 ...
- 非极大值抑制Non-Maximum Suppression(NMS)
非极大值抑制(Non-Maximum Suppression,NMS) 概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局 ...
- Non-Maximum Suppression,NMS非极大值抑制
Non-Maximum Suppression,NMS非极大值抑制概述非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索. ...
- 目标检测 非极大值抑制(Non-Maximum Suppression,NMS)
非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.也可以理解为只取置信度最高的一个识别结果. 举例:  如图所示,现在 ...
- 非极大值抑制(NMS)
转自:https://www.cnblogs.com/makefile/p/nms.html 概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的 ...
- 非极大值抑制(NMS)的几种实现
因为之前对比了RoI pooling的几种实现,发现python.pytorch的自带工具函数速度确实很慢,所以这里再对Faster-RCNN中另一个速度瓶颈NMS做一个简单对比试验. 这里做了四组对 ...
- 非极大值抑制(NMS)
非极大值抑制顾名思义就是抑制不是极大值的元素,搜索局部的极大值.这个局部代表的是一个邻域,邻域有两个参数可变,一个是邻域的维数,二是邻域的大小.这里不讨论通用的NMS算法,而是用于在目标检测中提取分数 ...
- IoU与非极大值抑制(NMS)的理解与实现
1. IoU(区域交并比) 计算IoU的公式如下图,可以看到IoU是一个比值,即交并比. 在分子中,我们计算预测框和ground-truth之间的重叠区域: 分母是并集区域,或者更简单地说,是预测框和 ...
随机推荐
- 【Gamma】设计与计划
目录 需求分析 已实现 功能 用户使用动机分析 当前阶段推广困难 当前阶段任务优先级 主要功能解析 社团活动场地申请 - 实现成本较高,正在调研社长的需求 完善入社流程的信息提示 通知功能 通知管理 ...
- [Beta阶段]第十一次Scrum Meeting
Scrum Meeting博客目录 [Beta阶段]第十一次Scrum Meeting 基本信息 名称 时间 地点 时长 第十一次Scrum Meeting 19/05/20 大运村寝室6楼 15mi ...
- vs2010怎么更改调试时使用的浏览器
在当前网站的起始网页上右击,在右击菜单中选择 浏览方式 步骤阅读 2
- Linux-Centos学习笔记
Linux目录结构: 只有1个目录,根目录 usr:相当于program files etc:存放系统配置文件 root:系统管理员默认目录 home:存放其他用户的目录 pwd: 打印当前目录 cd ...
- mysql8.0:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
忽然注意到的情况: 2018/7/19至2018/9/13之间发布的7.1.20.7.1.21.7.1.22和7.2.8.7.2.9.7.2.10这六个版本提供的对caching_sha2_passw ...
- JavaScript 工厂模式
//工厂 function FruitMaker() { //function 后不带方法名,这里cococola未定义,make return时,返回 FruitMaker.cococola thi ...
- (转) centos7 RPM包之rpm命令
原文:https://blog.csdn.net/capecape/article/details/78529159 RPM包与源码包的区别1.软件包分类 源码包:C源代码包 rpm包:编译之后的二进 ...
- 泡泡一分钟:Geometric and Physical Constraints for Drone-Based Head Plane Crowd Density Estimation
张宁 Geometric and Physical Constraints for Drone-Based Head Plane Crowd Density Estimation 基于无人机的向下平面 ...
- 泡泡一分钟:Collaborative Mapping with Pose Uncertainties using different Radio Frequencies and Communication Modules
张宁 Collaborative Mapping with Pose Uncertainties using different Radio Frequencies and Communication ...
- Docker守护式容器
1.什么是守护式容器 能够长期运行 没有交互式会话 适合运行应用程序和服务 2.以守护形式运行容器 运行交互式容器时以Ctrl+P Ctrl+Q 来退出容器,此时容器还在后台继续运行,我们可以通过do ...