NMS(non maximum suppression,非极大值抑制)
"""
nms输入的数据为box的左上角x1,y1与右下角x2,y2+confidence,rows=batch_size,line=[x1,y1,x2,y2,confidence];
首先将batch_size按照已给的confidence从大到小排序,将最大confidence的box保存,而后与其它batch_size-1个boxes进行iou,
得到新的batch_size-1个iou(confidence),然后与阈值(threshold)相比较,保留满足阈值的boxes,
而后将保留后的boxes按照求解的confidence进行从大到小排序,保留最大box,以此类推,最终保留下来的为需要的boxes,
包含对应原来的confidence
其具体做法如下code。
"""
import numpy as np
boxes = np.array([
[204, 102, 358, 250, 0.5],
[257, 118, 380, 250, 0.7],
[280, 135, 400, 250, 0.6],
[255, 118, 360, 235, 0.7]])
box_threshold = 0.7
def NMS(BOXES, box_threshold):
"""Pure Python NMS baseline."""
x1 = BOXES[:, 0] # xmin
y1 = BOXES[:, 1] # ymin
x2 = BOXES[:, 2] # xmax
y2 = BOXES[:, 3] # ymax
confidence = BOXES[:, 4] # confidence
boxes_areas = (x2 - x1 + 1) * (y2 - y1 + 1) # the size of bbox
confidence_index = confidence.argsort()[::-1] # sort bounding boxes by decreasing order, returning array([3, 1, 2, 0])
save_boxes_end_index = [] # store the final bounding boxes of index
while confidence_index.size > 0: # 此行代码表示存在有置信度的box,才会运行。若只有一个box则下面将会和自己比较
i = confidence_index[0] # 永远取置信率最高的框作为物体的最佳框
save_boxes_end_index.append(i) # 第一次运行保存置信度最大box的索引值
# 获取两个框相交矩形的坐标
# 左上角坐标取二者最大;右下角取二者最小
xx1 = np.maximum(x1[i], x1[confidence_index[1:]]) # array([ 257., 280., 255.]) 保存相交区域左上角x
yy1 = np.maximum(y1[i], y1[confidence_index[1:]]) # array([ 118., 135., 118.]) 保存相交区域左上角y
xx2 = np.minimum(x2[i], x2[confidence_index[1:]]) # array([ 360., 360., 358.]) 保存相交区域右下角x
yy2 = np.minimum(y2[i], y2[confidence_index[1:]]) # array([ 235., 235., 235.]) 保存相交区域右下角y
w = np.maximum(0.0, xx2 - xx1 + 1) # array([ 104., 81., 104.])
h = np.maximum(0.0, yy2 - yy1 + 1) # array([ 118., 101., 118.])
# 计算相交矩形面积
boxes_cross_areas = w * h # array([ 12272., 8181., 12272.])
# 计算IOU
# Cross Area / (bbox + particular area - Cross Area)
boxes_iou = boxes_cross_areas / (boxes_areas[i] + boxes_areas[confidence_index[1:]] - boxes_cross_areas)
# reserve all the bounding box whose ovr less than thresh
confidence_process_index = np.where(boxes_iou <= box_threshold)[0] # 返回boxes_iou中小于box_threshold的索引值
# 与置信度最大的box比较,分别求解出其它boxes的iou值(是下次其它boxes置信度的值),而后只保留比例小于阙值的框,然后继续处理
confidence_index = confidence_index[confidence_process_index + 1] # 因为boxes_iou根据其它boxes与最大box得到一维矩阵,实际少了第一个box,因此confidence_process_index需要+1,而后得到新的confidence——index
boxes_end = []
for i in range(len(save_boxes_end_index)):
boxes_end.append(BOXES[save_boxes_end_index[i]])
boxes_end=np.array(boxes_end)
return boxes_end
boxes_end = NMS(boxes, box_threshold)
print(boxes_end) 其运行结果如下:
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 ...
- 非极大值抑制算法(Python实现)
date: 2017-07-21 16:48:02 非极大值抑制算法(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)
非极大值抑制(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算法,而是用于在目标检测中提取分数 ...
随机推荐
- mac系统InetAddress.getLocalHost().getHostAddress() 很慢
java.net.InetAddress.getLocalHost() 这个调用在新版的mac os中可能会耗时很久. 解决办法有两种: 1. 就是把本机的hostname 添加到 hosts 中,例 ...
- Behavior Trees for Path Planning (Autonomous Driving)
Behavior Trees for Path Planning (Autonomous Driving) 2019-11-13 08:16:52 Path planning in self-driv ...
- SpringBoot——配置文件加载位置及外部配置加载顺序
声明 本文部分转自:SpringBoot配置文件加载位置与优先级 正文 1. 项目内部配置文件 spring boot 启动会扫描以下位置的application.properties或者applic ...
- Canal - 数据同步 - 阿里巴巴 MySQL binlog 增量订阅&消费组件
背景 早期,阿里巴巴 B2B 公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求 ,主要是基于trigger的方式获取增量变更.从 2010 年开始,公司开始逐步尝试数据库日志解析,获取增量变 ...
- ES6----拓展运算符 三个点【...】
[...]拓展运算符是什么? es6中引入扩展运算符(...),它用于把一个数组转化为用逗号分隔的参数序列,它常用在不定参数个数时的函数调用,数组合并等情形.因为typeScript是es6的超集,所 ...
- 《原创视频》牛腩学docker简记
牛腩学docker简记 http://blog.niunan.net/blog/show/1258https://www.cnblogs.com/niunan/p/10917506.htmlhttps ...
- Android 使用NDK编译二进制文件并运行
Android 使用NDK编译二进制文件并运行本文介绍如何编译可以在Android平台上运行的二进制可执行文件. 首先我们,知道,Android是基于Linux的,而在Linux上,可以执行二进制文件 ...
- Linux 等待信号(sigsuspend)
/* sigsuspend()函数说明 */ #include <stdio.h> #include <signal.h> /* 知识补充: sigsuspend()函数 函数 ...
- C# 动态执行JS
有时候需要,在程序中灵活的嵌入自定义的计算逻辑,使用C#加载JS脚本形式可以实现: // 添加引用 using Microsoft.JScript; string jsStr = "var ...
- promise简单实现
function isFunction(fn){ return Object.prototype.toString.call(fn) === '[object Function]'; } let ST ...