1.  
  2. """
    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)
  3.  
  4. 其运行结果如下:

  1.  

NMS(non maximum suppression,非极大值抑制)的更多相关文章

  1. NMS(Non-Maximum Suppression) 非极大值抑制

    NMS  非极大值抑制:找到局部最大值,并删除邻域内其他的值. 简单说一下流程: 首先剔除背景(背景无需NMS),假设有6个边界框,根据分类置信度对这6个边界框做降序排列,假设顺序为A.B.C.D.E ...

  2. Non-maximum suppression(非极大值抑制算法)

    在RCNN系列目标检测中,有一个重要的算法,用于消除一些冗余的bounding box,这就是non-maximum suppression算法. 这里有一篇博客写的挺好的: http://www.c ...

  3. 非极大值抑制算法(Python实现)

    date: 2017-07-21 16:48:02 非极大值抑制算法(Non-maximum suppression, NMS) 算法原理 非极大值抑制算法的本质是搜索局部极大值,抑制非极大值元素. ...

  4. 非极大值抑制(Non-Maximum Suppression,NMS)

    概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二 ...

  5. 非极大值抑制Non-Maximum Suppression(NMS)

    非极大值抑制(Non-Maximum Suppression,NMS)   概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局 ...

  6. Non-Maximum Suppression,NMS非极大值抑制

    Non-Maximum Suppression,NMS非极大值抑制概述非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索. ...

  7. 目标检测 非极大值抑制(Non-Maximum Suppression,NMS)

    非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.也可以理解为只取置信度最高的一个识别结果. 举例:  如图所示,现在 ...

  8. 非极大值抑制(NMS)

    转自:https://www.cnblogs.com/makefile/p/nms.html 概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的 ...

  9. 非极大值抑制(NMS)的几种实现

    因为之前对比了RoI pooling的几种实现,发现python.pytorch的自带工具函数速度确实很慢,所以这里再对Faster-RCNN中另一个速度瓶颈NMS做一个简单对比试验. 这里做了四组对 ...

  10. 非极大值抑制(NMS)

    非极大值抑制顾名思义就是抑制不是极大值的元素,搜索局部的极大值.这个局部代表的是一个邻域,邻域有两个参数可变,一个是邻域的维数,二是邻域的大小.这里不讨论通用的NMS算法,而是用于在目标检测中提取分数 ...

随机推荐

  1. Windows版:Nginx部署React项目并访问Spring Boot后台数据

    一, 打包react项目 1,在工作空间目录下create-react-app test-arrange 创建项目test-arrange 2,在新建的项目中写好请求与页面 3,打包, 在项目目录下 ...

  2. adb命令和fastboot有什么区别

    ADB中文解释就是调试桥的作用.既然是调试作用,需要开机并连接电脑,所以adb的命令是需要手机开启usb调试,比较典型的命令比如从电脑端敲入adb命令来安应用:adb install .还有一个命令我 ...

  3. The Snowflake Elastic Data Warehouse

    开篇说的是,Shared-nothing当前已经是主流的架构,需要用自身的local disks来存储数据,Tables被水平划分到各个partitions上 这种架构,比较适合star-schema ...

  4. 【maven】命令

    一.maven打包命令 mvn打包,并指定 Profiles配置文件 和 模块名 mvn clean package {-P prod} -pl {groupId}:{artifactId} -am ...

  5. MSSQL中 float转换为varchar 变成科学计数法解决方案

    在系统初始化的时候,没有在数值型的数据前面加上 单引号,导致进入数据库后都变成float型我们需要做以下转换就能将数据变为 varchar类型 declare @a float //定义一个float ...

  6. java拼接字符串、格式化字符串方式

    1.代码 //+ String arg0 = "Bob"; String arg1 = "Alice"; System.out.println("he ...

  7. Window及document对象

    注:页面上元素name属性以及JavaScript引用的名称必须一致包括大小写 否则会提示你1个错误信息 "引用的元素为空或者不是对象" 一.Window对象 ---------- ...

  8. 《深入理解Linux内核》 读书笔记

    深入理解Linux内核 读书笔记 一.概论 操作系统基本概念 多用户系统 允许多个用户登录系统,不同用户之间的有私有的空间 用户和组 每个用于属于一个组,组的权限和其他人的权限,和拥有者的权限不一样. ...

  9. linq to entity group by 时间

    CreationTime是DateTime类型 group by 年/月/日/小时 group by 年 (from d in YourData.OrderBy(x => x.CreationT ...

  10. adb 命令简介

    adb命令配置 1 在命令行下,进入用户目录 cd $HOME 2 .bash_profile文件 输入下行命令获取当前文件列表: ls -al 查看文件列表,如果没有.bash_profile文件, ...