NMS代码说明(来自Fast-RCNN)

个人觉得NMS包含很多框,其坐标为(x1,y1,x2,y2),每个框对应了一个score,我们将按照score得分降序,并将第一个最高的score的框(我们叫做标准框)作为标准框与其它框对比,即计算出其它框与标准框的IOU值,然后设定阈值,与保留框的最大数量,若超过阈值,就删除该框,以此类推,所选框最大不能超出设定的数量,最后得到保留的框,结束NMS

接下来,请看代码:

import numpy as np

def py_cpu_nms(dets, thresh):
"""Pure Python NMS baseline."""
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
scores = dets[:, 4]

areas = (x2 - x1 + 1) * (y2 - y1 + 1)                                  # 我认为xy坐标应该包含了(0,0)坐标,所以需要+1(个人是这么认为)
order = scores.argsort()[::-1]                                            # [::-1]表示降序排序,输出为其对应序号

keep = []                                                                           #需要保留的bounding box
while order.size > 0:
i = order[0]                                                                        #取置信度最大的(即第一个)框
keep.append(i)                                                                 #将其作为保留的框

#以下计算置信度最大的框(order[0])与其它所有的框(order[1:],即第二到最后一个)框的IOU,以下都是以向量形式表示和计算
xx1 = np.maximum(x1[i], x1[order[1:]])                             #计算xmin的max,即overlap的xmin
yy1 = np.maximum(y1[i], y1[order[1:]])                             #计算ymin的max,即overlap的ymin
xx2 = np.minimum(x2[i], x2[order[1:]])                              #计算xmax的min,即overlap的xmax
yy2 = np.minimum(y2[i], y2[order[1:]])                              #计算ymax的min,即overlap的ymax

w = np.maximum(0.0, xx2 - xx1 + 1)                                #计算overlap的width,我认为xy坐标应该包含了(0,0)坐标,所以需要+1(个人是这么认为)
h = np.maximum(0.0, yy2 - yy1 + 1)                                 #计算overlap的hight
inter = w * h                                                                      #计算overlap的面积
ovr = inter / (areas[i] + areas[order[1:]] - inter)                 #计算并,-inter是因为交集部分加了两次。

inds = np.where(ovr <= thresh)[0]                                    #本轮,order仅保留IOU不大于阈值的下标坐标,但是是从第二个数开始当成第一个数
order = order[inds + 1]                                                      #删除IOU大于阈值的框,因为从第二个数开始,当作第一个数,所以需要+1,如[1,2,3,4],将从[2,3,4]开始,

#若选择第一个数2,下标为0,所以需要+1,才能对应原来数[1,2,3,4],选择为2.

return keep

单独对这句话的理解,如下:

NMS的实现代码详解的更多相关文章

  1. 非极大值抑制(NMS,Non-Maximum Suppression)的原理与代码详解

    1.NMS的原理 NMS(Non-Maximum Suppression)算法本质是搜索局部极大值,抑制非极大值元素.NMS就是需要根据score矩阵和region的坐标信息,从中找到置信度比较高的b ...

  2. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  3. ASP.NET MVC 5 学习教程:生成的代码详解

    原文 ASP.NET MVC 5 学习教程:生成的代码详解 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...

  4. Github-karpathy/char-rnn代码详解

    Github-karpathy/char-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-1-10 ...

  5. 代码详解:TensorFlow Core带你探索深度神经网络“黑匣子”

    来源商业新知网,原标题:代码详解:TensorFlow Core带你探索深度神经网络“黑匣子” 想学TensorFlow?先从低阶API开始吧~某种程度而言,它能够帮助我们更好地理解Tensorflo ...

  6. JAVA类与类之间的全部关系简述+代码详解

    本文转自: https://blog.csdn.net/wq6ylg08/article/details/81092056类和类之间关系包括了 is a,has a, use a三种关系(1)is a ...

  7. Java中String的intern方法,javap&cfr.jar反编译,javap反编译后二进制指令代码详解,Java8常量池的位置

    一个例子 public class TestString{ public static void main(String[] args){ String a = "a"; Stri ...

  8. Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测

    Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测 2017年12月13日 17:39:11 机器之心V 阅读数:5931   近日,Artur Suilin 等人发布了 Kaggl ...

  9. 基础 | batchnorm原理及代码详解

    https://blog.csdn.net/qq_25737169/article/details/79048516 https://www.cnblogs.com/bonelee/p/8528722 ...

随机推荐

  1. SLF4J使用,slf4j-api、slf4j-log4j12以及log4j的关系

    SLF4J不同于其他日志类库,与其它有很大的不同.SLF4J(Simple logging Facade for Java)不是一个真正的日志实现,而是一个抽象层( abstraction layer ...

  2. malloc分配到一块内存,读写操作时却发生segmentation falt的奇怪问题。

    期初现象:malloc一块内存,读写操作时发生segmentation falt.一般来讲malloc倘若失败应该抛出异常,所以malloc返回一个指针后,这个指针应该都是可用的,况且是进行读操作. ...

  3. grpc使用记录(二)简单同步服务实例

    目录 1.编写proto文件,定义服务 2.编译proto文件,生成代码 3.编写服务端代码 server.cpp 代码 编译 4.编写客户端代码 client.cpp代码 5.简单测试一下 已经折腾 ...

  4. 运维笔记--Linux查找指定目录下包含某字符串的文件

    待整理: 参考:http://blog.sina.com.cn/s/blog_53d496960102xg5c.html 例: find /home/logstash/ -type f | xargs ...

  5. 运维笔记--Docker环境ubuntu系统安装指定版本python[3.6]

    场景描述: 直接安装出现如下异常: root@ae2d02e458f3:/home# apt-get install python3.6 Reading package lists... Done B ...

  6. setTimeout的小尴尬

    我们都知道,alert这种内置弹框会阻塞后续代码执行: 之所以如此,就是因为JavaScript代码在浏览器中是单线程执行的.换句话说,浏览器中只有一个主线程负责运行所有JavaScript代码(不考 ...

  7. 列表初始化 分析initializer_list<T>的实现

    列表初始化(1)_统一初始化 1. 统一初始化(Uniform Initialization) (1)在C++11之前,很多程序员特别是初学者对如何初始化一个变量或对象的问题很容易出现困惑.因为可以用 ...

  8. npm 更换阿里云镜像

    来源:https://blog.csdn.net/a249040113/article/details/81567430 npm安装插件过程:从http://registry.npmjs.org下载对 ...

  9. Elasticsearch学习笔记——索引模板

    在索引模板里面,date类型的字段的format支持多种类型,在es中全部会转换成long类型进行存储,参考 https://zhuanlan.zhihu.com/p/34240906 一个索引模板范 ...

  10. VM无法正常使用桥接模式获取IP上网

    问题: 有时候会遇到VM使用桥接模式时无法正常获取IP的情况 原因: 初步怀疑是因为你的电脑是双网卡 解决方法: 这时候,就需要修改VM的虚拟网络编辑器的配置 解决步骤: 编辑->虚拟网络编辑器 ...