首页>>人工智能->NMS技术总结(NMS原理、多类别NMS、NMS的缺陷、NMS的改进思路、各种NMS方法)

NMS技术总结(NMS原理、多类别NMS、NMS的缺陷、NMS的改进思路、各种NMS方法)

时间:2023-11-29 本站 点击:1

前言 本文介绍了NMS的应用场合、基本原理、多类别NMS方法和实践代码、NMS的缺陷和改进思路、介绍了改进NMS的几种常用方法、提供了其它不常用的方法的链接。

本文很早以前发过,有个读者评论说没有介绍多类别NMS让他不满意,因此特来补充。顺便补充了NMS的缺点和改进思路。

欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。

Non-Maximum Suppression(NMS)非极大值抑制。从字面意思理解,抑制那些非极大值的元素,保留极大值元素。其主要用于目标检测,目标跟踪,3D重建,数据挖掘等。

目前NMS常用的有标准NMS, Soft NMS, DIOU NMS等。后续出现了新的Softer NMS,Weighted NMS等改进版。

原始NMS

以目标检测为例,目标检测推理过程中会产生很多检测框(A,B,C,D,E,F等),其中很多检测框都是检测同一个目标,但最终每个目标只需要一个检测框,NMS选择那个得分最高的检测框(假设是C),再将C与剩余框计算相应的IOU值,当IOU值超过所设定的阈值(普遍设置为0.5,目标检测中常设置为0.7,仅供参考),即对超过阈值的框进行抑制,抑制的做法是将检测框的得分设置为0,如此一轮过后,在剩下检测框中继续寻找得分最高的,再抑制与之IOU超过阈值的框,直到最后会保留几乎没有重叠的框。这样基本可以做到每个目标只剩下一个检测框。

实现代码:(以pytorch为例)

def NMS(boxes,scores, thresholds):    x1 = boxes[:,0]    y1 = boxes[:,1]    x2 = boxes[:,2]    y2 = boxes[:,3]    areas = (x2-x1)*(y2-y1)    _,order = scores.sort(0,descending=True)    keep = []    while order.numel() > 0:        i = order[0]        keep.append(i)        if order.numel() == 1:            break        xx1 = x1[order[1:]].clamp(min=x1[i])        yy1 = y1[order[1:]].clamp(min=y1[i])        xx2 = x2[order[1:]].clamp(max=x2[i])        yy2 = y2[order[1:]].clamp(max=y2[i])        w = (xx2-xx1).clamp(min=0)        h = (yy2-yy1).clamp(min=0)        inter = w*h        ovr = inter/(areas[i] + areas[order[1:]] - inter)        ids = (ovr<=thresholds).nonzero().squeeze()        if ids.numel() == 0:            break        order = order[ids+1]    return torch.LongTensor(keep)

除了自己实现以外,也可以直接使用torchvision.ops.nms来实现。

torchvision.ops.nms(boxes, scores, iou_threshold)

多类别NMS

上面这种做法是把所有boxes放在一起做NMS,没有考虑类别。即某一类的boxes不应该因为它与另一类最大得分boxes的iou值超过阈值而被筛掉。

对于多类别NMS来说,它的思想比较简单:每个类别内部做NMS就可以了。

实现方法:把每个box的坐标添加一个偏移量,偏移量由类别索引来决定。

下面是torchvision.ops.batched_nms的实现源码以及使用方法

#实现源码max_coordinate = boxes.max()offsets = idxs.to(boxes) * (max_coordinate + torch.tensor(1).to(boxes))boxes_for_nms = boxes + offsets[:, None]keep = nms(boxes_for_nms, scores, iou_threshold)return keep#使用方法torchvision.ops.boxes.batched_nms(boxes, scores, classes, nms_thresh)

这里偏移量用boxes中最大的那个作为偏移基准,然后每个类别索引乘以这个基准即得到每个类的box对应的偏移量。这样就把所有的boxes按类别分开了。

在YOLO_v5中,它自己写了个实现的代码。

c = x[:, 5:6] * (0 if agnostic else max_wh)  # classesboxes, scores = x[:, :4] + c, x[:, 4]  # boxes (offset by class), scoresi = torchvision.ops.nms(boxes, scores, iou_thres)

征稿通知:欢迎可以写以下内容的朋友联系我(微信号:“FewDesire”)。

TVM入门到实践的教程

TensorRT入门到实践的教程

MNN入门到实践的教程

数字图像处理与Opencv入门到实践的教程

OpenVINO入门到实践的教程

libtorch入门到实践的教程

Oneflow入门到实践的教程

Detectron入门到实践的教程

CUDA入门到实践的教程

caffe源码阅读

pytorch源码阅读

深度学习从入门到精通(从卷积神经网络开始讲起)

最新顶会的解读。例如最近的CVPR2022论文。

各个方向的系统性综述、主要模型发展演变、各个模型的创新思路和优缺点、代码解析等。

若自己有想写的且这上面没提到的,可以跟我联系。

声明:有一定报酬,具体请联系详谈。若有想法写但觉得自己能力不够,也可以先联系本人(微信号:FewDesire)了解。添加前请先备注“投稿”。

其它文章

招聘 | 迁移科技招聘深度学习、视觉、3D视觉、机器人算法工程师等多个职位

计算机视觉入门路线

YOLO系列梳理(一)YOLOv1-YOLOv3

YOLO系列梳理(二)YOLOv4

YOLO系列梳理(三)YOLOv5

Attention Mechanism in Computer Vision

从零搭建Pytorch模型教程(三)搭建Transformer网络

从零搭建Pytorch模型教程(二)搭建网络

从零搭建Pytorch模型教程(一)数据读取

StyleGAN大汇总 | 全面了解SOTA方法、架构新进展

一份热力图可视化代码使用教程

一份可视化特征图的代码

工业图像异常检测研究总结(2019-2020)

关于快速学习一项新技术或新领域的一些个人思维习惯与思想总结

原文:https://juejin.cn/post/7095282171627175949


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/AI/1153.html