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. docker安装 与 基本配置

    1.安装docker #yum remove docker \ docker-common \ container-selinux \ docker-selinux \ docker-engine \ ...

  2. An overview of time series forecasting models

    An overview of time series forecasting models 2019-10-04 09:47:05 This blog is from: https://towards ...

  3. SqlComparison

    package com.ufo.leftjoin; import java.security.MessageDigest; import java.sql.Connection; import jav ...

  4. css3特效插件wow.js

    在使用css3写特效的时候,会遇到比较麻烦的就是css3代码需要大量的调试,但是现在有了wow.js,让写特效变得简单了很多. wow.js官网 https://www.delac.io/wow/in ...

  5. CobaltStrike3.14破解

    原文发布在:https://bithack.io/forum/310 8月6日已更新 之前发的是5月2号破解的,并且官方作者的exit暗桩没有去掉.看到很多人用此版本遇到问题,抽空修复了下bug.此版 ...

  6. Webpack 4 SplitChunksPlugin配置方案(转)

    通常情况下我们的 WebApp 是有我们的自身代码和第三方库组成的,我们自身的代码是会常常变动的,而第三方库除非有较大的版本升级,不然是不会变的,所以第三方库和我们的代码需要分开打包,我们可以给第三方 ...

  7. Angular2 输入完成后触发函数

    (blur)="keySearch($event)" ,鼠标点击其他地方触发 keySearch(e): void { var dom = $(e.target); var key ...

  8. 浅谈 Docker 安全合规建设

    通过阅读网上帖子及浏览相关信息,大家可能会产生一种错觉:Docker 安全性不足,对 Docker 导入生产环境持保守态度.不过实际情况是,虽然我们需要对容器的安全性高度关注,但只要使用得当,完全可以 ...

  9. Fiddler抓包工具的简单使用

    Fiddler的官方网站:http://www.fiddler2.com Fiddler的官方帮助:http://docs.telerik.com/fiddler/knowledgebase/quic ...

  10. RobotFrameWork基本语法练习

    1.基本使用如下图 2.运行日志如下(可对照查看语句输出) Starting test: Test.Test Suite.test_case1 20180810 15:48:58.525 : INFO ...