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

在物体检测领域中,最后预测的结果一般有很多,其中会有一部分预测框重叠在一起。NMS的操作就是去除重叠的预测框,一般是物体检测任务中检测的最后一步处理操作。

如上图所示,可以看到图片中共有两个狗和一个猫,但是根据模型预测一共有3个狗和2个猫。并且我们人类可以很直观地发现有几个框重复预测同一个物体,那么该如何使用算法让计算机去除掉重复的框呢?

NMS过程解析

假设我们已经有了预测的框,每个预测框对应的类别,每个预测框对应的类别得分。

  1. 第一步,对于每个类别,按照类别得分的从大到小顺序排列:

  2. 第二步,对于每个类别,计算得分最大的框与其余预测框之间的IoU
    关于IoU的说明,详见 IOU(Jaccard系数)概念及实现
    预测框与自身的IoU为1,但是不用考虑,因此我们用 - 划掉

  3. 第三步,根据设定的阈值,剔除掉IOU大于阈值的预测框

  4. 第四步,对下一个没被去除的得分最大的框重复2,3操作,直到所有没被抑制的框遍历完毕。

    经过NMS操作后,我们得到了一个预测更好的结果

Pytorch代码实现

def nms(nms_threshold, pred_bbox, pred_classes, pred_scores):"""对预测结果进行非极大值抑制:param nms_threshold: 0~1之间的浮点数,最大重叠程度,IoU高于此阈值的框将会被抑制:param pred_bbox: torch.FloatTensor类型,形状为 [num_box, 4],4表示边界坐标,即 $(x_{min}, y_{min}, x_{max}, y_{max})$:param pred_classes: torch.LongTensor类型,形状为 [num_box],表示预测框的类别:param pred_scores: torch.FloatTensor类型,形状为 [num_box],表示预测框的类别得分,其中的值范围在 [0, 1]:return: 经过非极大值抑制后的预测框、对应类别和对应得分"""# 首先按照得分进行排序,并将预测框和预测类别保持相对应的关系pred_scores, sort_index = pred_scores.sort(dim=0, descending=True)pred_bbox = pred_bbox[sort_index]pred_classes = pred_classes[sort_index]# 全局记录需要被抑制的预测框suppress = torch.zeros_like(pred_classes, dtype=torch.uint8, device=pred_classes.device)# 对每种类别进行处理for c in torch.unique(pred_classes):index = pred_classes == c  # 获取属于该类别的索引bbox = pred_bbox[index, :]  # 提取属于该类别的预测框# 计算该类别预测框的IoUoverlap = find_jaccard_overlap(bbox, bbox)# 记录属于该类别预测框的抑制结果mask = torch.zeros(bbox.shape[0], dtype=torch.uint8, device=pred_classes.device)for b in range(bbox.shape[0]):# 如果该框已经被标记为抑制,则不进行处理if mask[b] == 1:continue# 将IoU大于阈值的标记为抑制mask = torch.maximum(mask, (overlap[b, :] > nms_threshold).to(torch.uint8))# 自己与自己的IoU为1,但是不应该被自己抑制mask[b] = 0# 更新全局记录suppress[index] = mask# 处理完所有类别后,将会得到所有框的抑制结果,需要抑制的框对应位置为1,反之为0# 将结果取反,获取不需要被抑制的布尔索引suppress = (1 - suppress).to(torch.bool)# 根据布尔索引提取最终结果pred_bbox = pred_bbox[suppress]pred_classes = pred_classes[suppress]pred_scores = pred_scores[suppress]# 如果没有结果符合,则返回Noneif len(pred_classes) == 0:return Nonereturn pred_bbox, pred_classes, pred_scores

NMS 非极大值抑制原理及实现相关推荐

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

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

  2. 深度学习自学(三):NMS非极大值抑制总结

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

  3. 目标窗口检测算法-NMS非极大值抑制

    1. NMS(non maximum suppression)的定义和算法步骤 NMS(non maximum suppression),中文名非极大值抑制,在很多计算机视觉任务中都有广泛应用,如:边 ...

  4. 目标检测中的LOU(交并比)和NMS(非极大值抑制)代码实现

    1.LOU, 两个box框的交集比上并集,示意图如下所示: 代码如下所示: #假设box1的维度为[N,4] box2的维度为[M,4] def Lou(box1, box2):N = box1.si ...

  5. 【概念梳理】NMS 非极大值抑制

    写在最前 本文对网上关于 NMS 的解释整理了一下 一.原理 YOLO在最后的一个步骤就是对 SxSx(Bx5+C) 个向量进行非极大值抑制(Non-max suppression),一开始不是太明白 ...

  6. NMS 非极大值抑制

    非极大值抑制(non maximum suppression,NMS),顾名思义就是抑制不是极大值的元素,搜索局部的极大值. 定位一个车辆时,算法可能会找出一堆候选框,为了从中找出最佳候选框,非极大值 ...

  7. 目标检测的Tricks | 【Trick9】nms非极大值抑制处理(包括变体merge-nms、and-nms、soft-nms、diou-nms等介绍)

    如有错误,恳请指出. 用这篇博客记录一下nms,也就是非极大值抑制处理,算是目标检测后处理的一个难点. 在训练阶段是不需要nms处理的,只有在验证或者是测试阶段才需要将预测结果进行非极大值抑制处理,来 ...

  8. yolov3 NMS非极大值抑制

    基本原理:对于Bounding Box的列表B及其对应的置信度S,采用下面的计算方式.选择具有最大score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU ...

  9. NMS——非极大值抑制

    NMS(non maximum suppression),中文名非极大值抑制,在很多计算机视觉任务中都有广泛应用,如:边缘检测.目标检测等. 这里主要以人脸检测中的应用为例,来说明NMS,并给出Mat ...

  10. 【算法】非极大值抑制原理、流程和代码

    代码如下: # -------------------------------------------------------- # Fast R-CNN # Copyright (c) 2015 M ...

最新文章

  1. 【spring boot】使用RestTemplate调用百度坐标转换服务
  2. SAS 中计算总和或者计算总数的方法
  3. 查阅 arXiv 论文新神器,一行代码比较版本差别,Github 新开源!
  4. 巴菲特:承认错误“抄底”航空股,不看好航空公司
  5. Ubuntu18.04 LTS 安装nvidia驱动出现Ignoring CC version mismatch
  6. python并行任务之生产消费模式
  7. Mac删除声音输出设备
  8. 微信小程序 服务器代理转发,微信小程序转发功能
  9. 玩转Reactjs第三篇-组件(模式stateprops)
  10. AtoZ CSS快速提示:对文本使用OpenType
  11. python 压缩图片为指定大小
  12. 微信小程序 界面禁止下拉 左右滑动_微信 iOS 版更新,带来了这些新功能
  13. 遇到的文件从本地上传HDFS失败
  14. 布莱克斯科尔斯模型(五) 方程求解过程
  15. AGV移动机器人PID运动控制
  16. 什么是人工智能数据采集?
  17. 学习总结-《父与子的编程之旅》chapter 11
  18. 物联网蜜罐地理分布情况
  19. Linux下GUI开发:GTK+ 2.0 + anjuta + glade
  20. CoaXPress接口助CMOS相机实现更高速率

热门文章

  1. The Django Book(一)
  2. 吾爱破解论坛2021年11月11日,光棍节免费开放注册
  3. Linux编译安装PHP7.4.24及启动
  4. 判断输入的字符与已知字符相等_你会输入带圈字符吗?
  5. 车机没有carlife可以自己下载吗_雷克萨斯NX 原车carlife转换无线carplay
  6. 计算机232接口接线图,rs232串口接线图
  7. 【友元、异常和其他】——C++ Prime Plus CH15
  8. 友链导航源码php,2020优化版导航源码自动收录秘趣导航批量检查友链有效性导航源码...
  9. MyEclipse配置Tomcat 7
  10. cad抛物线曲线lisp_cad画缓和曲线lisp程序(1)