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


    1、NMS的原理

    NMS(Non-Maximum Suppression)算法本质是搜索局部极大值,抑制非极大值元素。NMS就是需要根据score矩阵和region的坐标信息,从中找到置信度比较高的bounding box。NMS是大部分深度学习目标检测网络所需要的,大致算法流程为:

    1.对所有预测框的置信度降序排序

    2.选出置信度最高的预测框,确认其为正确预测,并计算他与其他预测框的IOU

    3.根据2中计算的IOU去除重叠度高的,IOU>threshold就删除

    4.剩下的预测框返回第1步,直到没有剩下的为止

    需要注意的是:Non-Maximum Suppression一次处理一个类别,如果有N个类别,Non-Maximum Suppression就需要执行N次。

    2、NMS的实现代码详解(来自Fast-RCNN)

    # --------------------------------------------------------
    # Fast R-CNN
    # Copyright (c) 2015 Microsoft
    # Licensed under The MIT License [see LICENSE for details]
    # Written by Ross Girshick
    # --------------------------------------------------------
    
    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)
        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
            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大于阈值的框
    
        return keep   
  • 相关阅读:
    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
    linux_shell_根据网站来源分桶
    mac_Alfred_快捷设置
    linux_无密登录
    crawler_Docker_解决用 JavaScript 框架开发的 Web 站点抓取
    linux下查看最消耗CPU、内存的进程
    绕过登陆常用万能密码
    ctf比赛linux文件监控和恢复shell
    Python爬虫之Selenium的常用方法
    CTF比赛时准备的一些shell命令
  • 原文地址:https://www.cnblogs.com/houjun/p/10454117.html
Copyright © 2020-2023  润新知