• NMS的实现代码详解


    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

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

  • 相关阅读:
    记一次小程序的数字三分
    ES6
    ESLint中的globals——向ESLint规则中添加全局变量
    在Power BI报表和仪表板中显示刷新日期时间
    在Microsoft Power BI中创建地图的10种方法—2
    在Microsoft Power BI中创建地图的10种方法
    power bi使用按钮来实现页面的转化
    power bi爬取网页
    使用power bi三年各省旅客吞吐量
    体验PowerBI:零基础分分钟生成一份交互报表
  • 原文地址:https://www.cnblogs.com/tangjunjun/p/11387565.html
Copyright © 2020-2023  润新知