经典NMS算法详解

简介

在这里插入图片描述

目标检测在使用了基于深度学习的端到端模型后效果斐然。目前,常用的目标检测算法,无论是One-stage的SSD系列算法、YOLO系列算法还是Two-stage的基于RCNN系列的算法,非极大值抑制都是其中必不可少的一个组件。在现有的基于anchor的目标检测算法中,都会产生数量巨大的候选矩形框,这些矩形框有很多是指向同一目标,因此就存在大量冗余的候选矩形框。非极大值抑制算法的目的正在于此,它可以消除多余的框,找到最佳的物体检测位置。

非极大值抑制(Non-Maximum Suppression,以下简称NMS算法)的思想是搜索局部极大值,抑制非极大值元素。

原理

IoU(Intersection over Union)为交并比,如图1所示,IoU相当于两个区域交叉的部分除以两个区域的并集部分得出的结果。图2是IoU为各个取值时的情况展示,一般来说,这个score > 0.5 就可以被认为一个不错的结果了。
在这里插入图片描述
经典NMS最初第一次应用到目标检测中是在RCNN算法中,其实现严格按照搜索局部极大值,抑制非极大值元素的思想来实现的,具体的实现步骤如下:

(1)设定目标框的置信度阈值,常用的阈值是0.5左右

(2)根据置信度降序排列候选框列表

(3)选取置信度最高的框A添加到输出列表,并将其从候选框列表中删除

(4)计算A与候选框列表中的所有框的IoU值,删除大于阈值的候选框

(5)重复上述过程,直到候选框列表为空,返回输出列表

代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
NMS function(Non-Maximum Suppression,  抑制不是极大值的元素)
        psedocode:
            1. choose the highest score element  a_1  in set B, add a_1 to the keep set C
            2. compute the IOU between the chosen element(such as a_1) and others elements in set B
            3. only keep the nums  at set B whose IOU value is less than thresholds (can be set as >=0.5), delete the nums similiar
                to a_1(the higher IOU it is , the more interseciton between a_1 and it will have)
            4. choose the highest score value a_2 left at set B  and add a_2 to set C
            5. repeat the 2-4 until  there is nothing in set B, while set C is the NMS value set

"""
import numpy as np
# boxes表示人脸框的xywh4点坐标+相关置信度
boxes = np.array([[100, 100, 210, 210, 0.72],
                  [250, 250, 420, 420, 0.8],
                  [220, 220, 320, 330, 0.92],
                  [100, 100, 210, 210, 0.72],
                  [230, 240, 325, 330, 0.81],
                  [220, 230, 315, 340, 0.9]])


def py_cpu_nms(dets, thresh):
    # dets:(m,5)  thresh:scaler

    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]

    areas = (y2 - y1 + 1) * (x2 - x1 + 1)
    scores = dets[:, 4]
    keep = []
    # index表示按照scores从高到底的相关box的序列号
    index = scores.argsort()[::-1]

    while index.size > 0:
        print("sorted index of boxes according to scores", index)
        # 选择得分最高的score直接加入keep列表中
        i = index[0]
        keep.append(i)
        # 计算score最高的box和其他box分别的相关交集坐标
        x11 = np.maximum(x1[i], x1[index[1:]])
        y11 = np.maximum(y1[i], y1[index[1:]])
        x22 = np.minimum(x2[i], x2[index[1:]])
        y22 = np.minimum(y2[i], y2[index[1:]])

        print("x1 values by original order:", x1)
        print("x1 value by scores:", x1[index[:]])
        print("x11 value means  replacing the less value compared"\
              " with the value by the largest score :" , x11)
        # 计算交集面积
        w = np.maximum(0, x22 - x11 + 1)  # the weights of overlap
        h = np.maximum(0, y22 - y11 + 1)  # the height of overlap
        overlaps = w * h
        # 计算相关IOU值(交集面积/并集面积,表示边框重合程度,越大表示越相似,越该删除)
        ious = overlaps / (areas[i] + areas[index[1:]] - overlaps)
        # 只保留iou小于阈值的索引号,重复上步
        idx = np.where(ious <= thresh)[0]
        # 因为第一步index[0]已经被划走,所以需要原来的索引号需要多加一
        index = index[idx + 1]

    return keep


import matplotlib.pyplot as plt


def plot_bbox(dets, c='k', title_name="title"):
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]

    plt.plot([x1, x2], [y1, y1], c)
    plt.plot([x1, x1], [y1, y2], c)
    plt.plot([x1, x2], [y2, y2], c)
    plt.plot([x2, x2], [y1, y2], c)
    plt.title(title_name)

if __name__ == '__main__':
    plot_bbox(boxes, 'k', title_name="before nms")  # before nms
    plt.show()

    keep = py_cpu_nms(boxes, thresh=0.7)

    plot_bbox(boxes[keep], 'r', title_name="after_nme")  # after nms
    plt.show()

相关效果图

在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
YOLOv5的算法可以详细地解释为以下几个步骤: 1. 特征提取:YOLOv5的网络结构采用了CSPNet,它是一种基于ResNet的新型卷积神经网络结构,采用了跨阶段部分网络(Cross Stage Partial Network)的思想,可以有效地加速特征提取过程。具体来说,CSPNet通过将特征图分成两部分,分别进行卷积和池化操作,然后将两部分特征图进行拼接,得到更加丰富的特征表达。 2. 特征融合:为了检测不同尺度的目标,YOLOv5采用了FPN(Feature Pyramid Network)的思想,将来自不同层的特征图进行融合。具体来说,YOLOv5将高层的特征图通过上采样的方式与低层的特征图进行拼接,得到更加全面的特征表达。 3. 特征划分:对于每个特征图,YOLOv5将其划分成多个网格,每个网格负责检测包含在该网格内的物体。具体来说,YOLOv5将特征图分成S × S个网格,每个网格负责检测一个物体。 4. 目标检测:对于每个网格,YOLOv5预测其包含的物体的中心点位置和边界框大小,以及物体的类别概率。具体来说,对于每个网格,YOLOv5预测5个值,分别为中心点的x、y坐标、边界框的宽、高以及物体的类别概率。其中,中心点的x、y坐标和边界框的宽、高是相对于该网格的坐标和大小,需要进行归一化处理。 5. 非极大值抑制:由于一个物体可能会被多个网格检测到,因此需要进行非极大值抑制(NMS)来去除重复的检测结果。具体来说,对于同一类别的检测结果,选择概率最大的一个作为代表,然后计算其余检测结果与代表之间的IoU(交并比),若IoU大于阈值,则将该检测结果去除。 在训练过程中,YOLOv5采用了交叉熵损失函数来优化模型,同时还采用了Momentum优化器和学习率衰减策略等方法来加速训练和提高模型精度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊猫小伙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值