【深度学习】一分钟速学

2023-10-26

非极大抑制

NMS的英文是Non-maximum suppression的缩写。

简单的说,就是模型给出了多个重叠在一起的候选框,我们只需要保留一个就可以了。其他的重叠的候选框就删掉了,效果可见下图:

交并比

IoU的英文全称Interp over Union,就是两个候选框区域的交集面积比上并集的面积,用下图可以理解:

hard-NMS

hard-nms其实就是经典版本的NMS的方法。就是根据模型给出每个box的置信度从大到小进行排序,然后保留最大的,删除所以与这个最大置信度的候选框的IoU大于阈值的其他候选框。

举个例子吧,现在有4个候选框:(box1,0.8),(box2,0.9), (box3,0.7),(box4,0.5)

我们把这四个候选框按照置信度从大到小排序:box2>box1>box3>box4

现在我们保留置信度最大的候选框box2,然后计算剩下三个box与box2之间的IoU,如果IoU大于一个事先设置的阈值,那么就删除这个box。假设,阈值是0.5:

IoU(box1,box2)=0.1<0.5,保留;

IoU(box3,box2)=0.7<0.5,删除;

IoU(box4,box2)=0.2<0.5,保留;

现在还有box1和box4,然后再重复上面的过程,排序,然后删除。

下面是python实现的hard-NMS:

def hard_nms(box_scores, iou_threshold, top_k=-1, candidate_size=200):
    """
    Args:
        box_scores (N, 5): box的集合,N为框的数量,5即4(位置信息)+1(可能为物体的概率)
        iou_threshold: 我们用IOU标准去除多余检测框的阈值
        top_k: 保留多少个计算后留下来的候选框,如果为-1则全保留
        candidate_size: 参与计算的boxes数量
    Returns:
         picked: 经过nms计算后保留下来的box
    """
    scores = box_scores[:, -1]                # 首先我们取出box中的最后一个元素也就是当前box检测到物体的概率
    boxes = box_scores[:, :-1]                # 取出box中的四个坐标(左上、右下)
    picked = []  
    _, indexes = scores.sort(descending=True) # 按照降序排列所有的物体的概率,得到排序后在原数组中的索引信息 indexes
    indexes = indexes[:candidate_size]        # 只保留前 candidate_size 个 boxes 其余的不考虑了
    while len(indexes) > 0:
        current = indexes[0]                  # 每次取出当前在 indexes 中 检测到物体概率最大的一个 
        picked.append(current.item())         # 将这个最大的存在结果中
        if 0 < top_k == len(picked) or len(indexes) == 1:
            break
        current_box = boxes[current, :]       # 当前第一个也就是最高概率的box
        indexes = indexes[1:]                
        rest_boxes = boxes[indexes, :]        # 剩下其余的box
        iou = iou_of(                         # 将当前的box与剩下其余的boxes用IOU标准进行筛选
            rest_boxes,
            current_box.unsqueeze(0),
        )
        indexes = indexes[iou <= iou_threshold]# 保留与当前box的IOU小于一定阈值的boxes,

    return box_scores[picked, :]

如何计算iou的面积呢?实现方法在下面:

def area_of(left_top, right_bottom) -> torch.Tensor:
    """Compute the areas of rectangles given two corners.

    Args:
        left_top (N, 2): left top corner.
        right_bottom (N, 2): right bottom corner.

    Returns:
        area (N): return the area.
    """
    hw = torch.clamp(right_bottom - left_top, min=0.0)
    return hw[..., 0] * hw[..., 1]


def iou_of(boxes0, boxes1, eps=1e-5):
    """Return interp-over-union (Jaccard index) of boxes.

    Args:
        boxes0 (N, 4): ground truth boxes.
        boxes1 (N or 1, 4): predicted boxes.
        eps: a small number to avoid 0 as denominator.
    Returns:
        iou (N): IoU values.
    """
    overlap_left_top = torch.max(boxes0[..., :2], boxes1[..., :2])
    overlap_right_bottom = torch.min(boxes0[..., 2:], boxes1[..., 2:])

    overlap_area = area_of(overlap_left_top, overlap_right_bottom)
    area0 = area_of(boxes0[..., :2], boxes0[..., 2:])
    area1 = area_of(boxes1[..., :2], boxes1[..., 2:])
    return overlap_area / (area0 + area1 - overlap_area + eps)

soft-NMS

在密集目标检测任务中,hard-NMS会有一些问题,看下面的例子:两个物体重叠起来了,但是根据hard-NMS绿色的框会被掉。

Soft-NMS就改动了一个地方。 在判断最高的置信度的box和其他box的IoU的时候增加了一个系数,可以更好的选择哪些才是多余的box。

对于hard-NMS来说,   的时候,保留,大于等于的时候删除,   表示置信度:

对于soft-NMS来说,   的时候,保留,大于的时候削减:

可以看出来,hard-NMS对于IoU大于阈值的候选框,直接把其置信度变成0,这样就相当于删除了这个box;但是soft-NMS的会根据IoU的大小,去适当的削减置信度,从而留下一些余地。

【如何削减】这里有两种方法来降低重叠候选框的置信度:

  1. 简单的线性衰减;

  2. 指数衰减。其中sigma是常数,一般是0.5.

第二种方法更为常见。


下面是python来实现的soft-NMS,其实跟hard-NMS相比,就多了一行代码罢了:

def soft_nms(box_scores, score_threshold, sigma=0.5, top_k=-1):
    """Soft NMS implementation.

    References:
        https://arxiv.org/abs/1704.04503
        https://github.com/facebookresearch/Detectron/blob/master/detectron/utils/cython_nms.pyx

    Args:
        box_scores (N, 5): boxes in corner-form and probabilities.
        score_threshold: boxes with scores less than value are not considered.
        sigma: the parameter in score re-computation.
            scores[i] = scores[i] * exp(-(iou_i)^2 / simga)
        top_k: keep top_k results. If k <= 0, keep all the results.
    Returns:
         picked_box_scores (K, 5): results of NMS.
    """
    picked_box_scores = []
    while box_scores.size(0) > 0:
        max_score_index = torch.argmax(box_scores[:, 4])
        cur_box_prob = torch.tensor(box_scores[max_score_index, :])
        picked_box_scores.append(cur_box_prob)
        if len(picked_box_scores) == top_k > 0 or box_scores.size(0) == 1:
            break
        cur_box = cur_box_prob[:-1]
        box_scores[max_score_index, :] = box_scores[-1, :]
        box_scores = box_scores[:-1, :]
        ious = iou_of(cur_box.unsqueeze(0), box_scores[:, :-1])

        # 以下这句是新加的,如果没有这句就是Hard-NMS了
        box_scores[:, -1] = box_scores[:, -1] * torch.exp(-(ious * ious) / sigma) 

        box_scores = box_scores[box_scores[:, -1] > score_threshold, :]
    if len(picked_box_scores) > 0:
        return torch.stack(picked_box_scores)
    else:
        return torch.tensor([])

往期精彩回顾




适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群请扫码进群:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【深度学习】一分钟速学 的相关文章

随机推荐

  • 快速入门PyTorch(3)--训练一个图片分类器和多 GPUs 训练

    2019 第 44 篇 总第 68 篇文章 本文大约14000字 建议收藏阅读 快速入门 PyTorch 教程前两篇文章 快速入门Pytorch 1 安装 张量以及梯度 快速入门PyTorch 2 如何构建一个神经网络 这是快速入门 PyT
  • Win使用VMware安装黑苹果+xcode安装+优化+win键位设置

    前言 有段时间想学ios开发 但是没有苹果电脑 所以琢磨着在win系统里安装CodeBlocks IDE 编译object c 或者在linux里装object c环境 后来整了两天没整好 编译时总是提示编译器错误啥的 想想还是算了用黑苹果
  • 解决eclipse中控制台中e.printStackTrace();的输出异常

    测试异常的代码 import java io File import java io IOException public class F public static void main String args File file new
  • C S S

    目录 1 样式定义方式 1 1行内样式表 1 2内部样式表 1 3外部样式表 2 注解 3 选择器 3 1标签选择器 3 2 id选择器 3 3 类选择器 3 4 派生选择器 3 5 伪类选择器 链接伪类选择器 位置伪类选择器 编辑 目标伪
  • C++数据结构题:DS 顺序表--连续操作

    建立顺序表的类 属性包括 数组 实际长度 最大长度 设定为 1000 该类具有以下成员函数 构造函数 实现顺序表的初始化 插入多个数据的 multiinsert int i int n int item 函数 实现在第 i 个位置 连续插入
  • 华为交换机istack堆叠配置

    拓扑图 操作步骤 提前规划堆叠方案 规划SwitchA的堆叠成员ID为1 SwitchB的成员ID为2 规划SwitchA作为主交换机 其堆叠优先级最高 为150 SwitchB的堆叠优先级为120 规划堆叠域编号 Domain ID 为1
  • 如何在Python中调用C++程序?(文中以Opencv为例,在Python中调用C++的Opencv)

    https www cnblogs com zf blog p 11906786 html 要注意什么 要注意在头文件 h中将需要引用的函数包括在 extern C 中 使用Opencv的时候 需要在CMakeLists txt中写入 ta
  • 笔记整理:西瓜书——第1章:绪论

    不知不觉就研一下啦 想了想 作为一个专硕狗也要开始考虑工作和实习了 不过在这之前打算先花那么一两个月再刷刷书 看书必然要做笔记 但是做笔记最痛苦的经常是 嗯 笔记做了 短时间还记得 过了一段 笔记不见了 东西也基本忘光了 经常发生 想了想
  • 中国AI大模型峰会“封神之作”!开发者不容错过这场夏季盛会

    年度最强大模型顶会来袭 喊话中国数百万AI开发者 速来 WAVE SUMMIT 定档8月16日 或将曝百度飞桨 文心大模型最新进展 2023年全球AI浪潮迭起 大语言模型热度空前 生成式人工智能为千行百业高质量发展带来更多想象空间 作为前沿
  • python递归计算N!的代码

    内容过程中 把写内容过程中常用的内容段备份一下 下面内容是关于python递归计算N 的内容 应该是对各朋友也有用 def factorial n if n 0 return 1 else 转载于 https www cnblogs com
  • 基于vue项目 vue-video-player实现rtmp hls视频流播放

    视频直播 在线监控 基于vue项目 vue video player实现rtmp hls视频流播放 问题背景 现在很多后台管理系统都会在项目中添加实时监控 实时直播的功能 最近刚好遇到项目需求 于是就分享一下经验以及在配置过程中出现的一些问
  • 【vue2】data中数据赋值失败找不到、data数据不声明的影响

    博主 初映CY的前说 前端领域 本文核心 vue2data作用 前言 当你看到这篇文章相比你已经对vue有了一定的了解 对data的有了一个基本的认识 data是存放我们当前页面数据地方 是的 没一点毛病 具体的来说是存放响应式数据地方 那
  • android中通过代码实现文件权限修改(chmod)

    在Unix和Linux的各种操作系统下 每个文件 文件夹也被看作是文件 都按读 写 运行设定权限 读 写 运行三项权限可以用数字表示 就是r 4 w 2 x 1 所以 rw r r 用数字表示成644 反过来说777就是rwxrwxrwx
  • php的协程

    在php中 实现协程主要由两种方式 1 yield生成器的实现 2 swoole扩展实现 协程不是进程或线程 其执行过程更类似于子例程 或者说不带返回值的函数调用 一个程序可以包含多个协程 可以对比与一个进程包含多个线程 因而下面我们来比较
  • 全光组网是什么?有什么优点优势

    去年底回山西老家了 在当地的某个运营商公司找了一份工作 最近接触到了全光组网Fttr全屋宽带覆盖方案 就研究了一下 任何方案都是适用一种类型的人群 这个Fttr应该是华为给运营商提供的技术方案 整个方案因为有移动的维护做售后 所以比自己找安
  • eclipse启动了tomcat正常,可页面还是404

    eclipse启动了tomcat正常 可页面还是404 这两天看到Eclipse 3 7 代号Indigo 正式版发布了 于是心想也试试看最新版有什么变动 于是就开始准备尝试下 终于在今天下载好也解压完 一切很正常 随便写了个web工程 在
  • 学习笔记(01):go快速入门-iota用法

    立即学习 https edu csdn net course play 26897 344142 utm source blogtoedu
  • Kubernetes:(七)k8s优化大法(江湖失传已久的武林秘籍)

    目录 一 内核参数优化 1 1增大内核选项配置 etc sysctl conf 1 2其他的内核参数 二 Etcd性能优化 2 1磁盘 2 2etcd进程设置优先级 2 3增大etcd的存储限制 2 4提高etcd对于对等网络流量优先级 2
  • C++57个入门知识点_番外2_C++中指针函数、函数指针和返回值为函数指针的函数

    文章目录 1 引言 2 指针函数 3 函数指针 4 返回值为函数指针的函数 5 从底层理解返回值为函数指针的函数 5 1 指针函数的定义 5 2 用函数指针作为函数的返回值 5 3 总结 1 引言 函数指针 指针函数是C中重要而容易混淆的概
  • 【深度学习】一分钟速学

    非极大抑制 NMS的英文是Non maximum suppression的缩写 简单的说 就是模型给出了多个重叠在一起的候选框 我们只需要保留一个就可以了 其他的重叠的候选框就删掉了 效果可见下图 交并比 IoU的英文全称Interp ov