YOLOv5图像分割中的NMS处理

这篇具有很好参考价值的文章主要介绍了YOLOv5图像分割中的NMS处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在上一篇文章YOLOv5图像分割--SegmentationModel类代码详解有讲到图像经过YOLOv5网络后得到的输出形式,主要是调用了BaseModel类下的forward得到的输出,输出的shape为【batch,25200,117】,这里的25200相当于总的anchors数量【以640*640的输入为例,共有anchors=80*80*3+40*40*3+20*20*3】,117为5[x,y,w,h,conf]+80个类+32【mask的数量】。

YOLOv5图像分割中的NMS处理

那么得到上面这张图的输出后又需要哪些处理呢?又是怎么处理的呢?本篇文章就是来刨析这个问题。

可以从下面的代码看到在进行model后会得到pred和proto。前者就是上面得到图的形式,后者的shape为【batch,32,160,160】,这里的32是mask的数量,160*160是针对80*80这个特征层的上采样得到的。然后是送入NMS进行处理得到新的pred输出。

        pred, proto = model(im, augment=augment, visualize=visualize)[:2]  # im[batch, 3, 640, 640]
        # pred:[batch,25200,117], proto:[batch,32,160,160]
        # NMS
        with dt[2]:
            pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det, nm=32)

目录

NMS中发生了什么?

通过conf_thres进行筛选

xywh2xyxy

取得对应anchor中conf最大的类

NMS处理 


NMS中发生了什么?

那么来看一下NMS中发生了什么 

 可以看到代码中传入的参数为:pred:model的输出,conf_thres:置信度阈值,iou_thres:iou阈值,classes:需要过滤的类,nm为mask的数量。

然后进入内部,prediction的shepe为【batch,25200,117】,因此通过下面的代码得到:

bs:batch size 这里得到是1

nc:117-32-5=80【coco类的数量】

xc:由于prediction在117这个维度的第5维度【这里的4维度】是指conf,所以可以通过conf_thres得到大于阈值的目标mask  xc,那么此时xc的shape为【1,25200】。通过这个步骤就可以将所有anchors中大于conf的目标筛选出来【形式为False or True】

通过conf_thres进行筛选

    bs = prediction.shape[0]  # batch size
    nc = prediction.shape[2] - nm - 5  # number of classes 85-5
    xc = prediction[..., 4] > conf_thres  # candidates 85=5+80=(x,y,w,h,conf) 第4维度为conf

然后新建一个output全零的张量,最后一个通道的shape为6+32=38。6指的【x1,y1,x2,y1,conf,class】。 

output = [torch.zeros((0, 6 + nm), device=prediction.device)] * bs

下面的xi是图像的index,对应该index的图像。

x = x[xc[xi]]:由于prediction当前batch为1 ,所以对应xi此时为0,xc是上面通过conf_thres得到shape为【1,25200】的mask,所以xc[xi]就是取出该batch中所有的anchors【这些anchors内已经内是经过conf筛选的目标】;x的shape为【25200,117】[忘记这个shape的含义可以看我最前面的图],那么x[xc[ix]]就可以表示为通过xc中的25200个含有False or True 的anchors,筛选出conf大于阈值的目标【这个目标维度为117,含有box信息,conf,80个类,32个mask】

在我这里得到新的x的shape为:【52,117】。这就表示了在25200个anchors中有52个anchors内有目标,每个anchor又有117个维度来记录该anchor内目标的boxes信息,conf以及类信息等。

    for xi, x in enumerate(prediction):  # image index, image inference
        # Apply constraints
        # x[((x[..., 2:4] < min_wh) | (x[..., 2:4] > max_wh)).any(1), 4] = 0  # width-height
        x = x[xc[xi]]  # confidence xc是所有anchor内的置信度,shape[1,25200]。表示为:获取当前图像中所有anchor中有预测结果的[这个是通过conf筛选过的]

 下面的这一行代码表示为计算conf,x[:,5:]

        # Compute conf
        x[:, 5:] *= x[:, 4:5]  # conf = obj_conf * cls_conf

xywh2xyxy

下面的代码中box是将上面x中的box信息由center_x,center_y,wh转为x1,y1,x2,y2的形式【为后面计算iou做准备】,这里的mi=85【表示mask start index】,因为此时的xshape为【52,117=5+85+32】所以从85开始提取所有的mask。 

        # Box/Mask
        box = xywh2xyxy(x[:, :4])  # center_x, center_y, width, height) to (x1, y1, x2, y2)
        mask = x[:, mi:]  # zero columns if no masks

取得对应anchor中conf最大的类

在下面的代码中x[:,5:mi]=x[:,5:85]表示为取所有anchors中所有类的conf。【0~4是box,5:85是class】,然后取出所有anchors中预测的类中conf最大的conf以及索引j【x[:,5:85]的shape为[52,80],利用max(1,keepdim=True)在80所在的这个维度上取max】,而这里得到最大index j就是每个anchors预测得到的类的index[这样不就知道预测的种类了嘛]。

可视化看一下,这里只展示一部分。前面的一个列是所有anchor得到的最大conf值后面的一列是对应的类别,比如第行中0.24885表示当前这个anchor预测为类别0【也就是persion类,置信度为0.24885】

YOLOv5图像分割中的NMS处理

最后再用cat函数进行拼接,即将box【xyxy】,conf[所有anchor得到最大的conf], j[最大conf对应的类,mask]

    conf, j = x[:, 5:mi].max(1, keepdim=True)
    x = torch.cat((box, conf, j.float(), mask), 1)[conf.view(-1) > conf_thres]

 得到新的x如下图:YOLOv5图像分割中的NMS处理

下面这行代码是对上面得到x在conf这个维度上进行排序 

x = x[x[:, 4].argsort(descending=True)]  # sort by confidence

NMS处理 

agnostic参数 True表示多个类一起计算nmsFalse表示按照不同的类分别进行计算nms

这里的nms是调用的torchvision下的nms。需要传入boxes,这里的boxes是加了c的偏移量【为什么加这个偏移量这里我没明白,有知道的可以留言说一下】。这里的boxes为【x1,y1,x2,y2】形式。score是已经排序好的,iou_thres是iou阈值。

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

此时得到的i为:tensor([ 0,  2,  6, 16, 30], device='cuda:0')

这里的x是shape为【49,38】,49表示为有目标的49个anchors,38就是前面含有boxes,conf,index,mask的信息。i就是筛选得到的anchors索引。索引得到最终5个anchors以及信息,shape为【5,38】.

output[xi] = x[i]

这个就是我们得到的经过NMS后的输出啦 文章来源地址https://www.toymoban.com/news/detail-463552.html

到了这里,关于YOLOv5图像分割中的NMS处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • YOLOv5基础知识入门(7)— NMS(非极大值抑制)原理解析

    前言: Hello大家好,我是小哥谈。 NMS是指非极大值抑制(non maximum suppression),它是一种常用于物体检测任务的算法。在物体检测中,通常会有多个预测框(bounding box)被提议出来,并且这些框可能存在重叠或者重复的情况。NMS的目的就是通过抑制非极大值的方式,来选择出

    2024年02月12日
    浏览(45)
  • 卷积神经网络中的图像特征——以YOLOv5为例进行可视化

    一、图像特征 1. 图像低层特征 图像低层特征指的是:边缘、颜色和纹理等特征。 低层特征的分辨率较高,包含较多的位置、细节信息,但其包含的语义信息较少,噪声较多。 原始图像和浅层卷积网络输出的特征图属于低层特征,从低层特征图中可以看清轮廓、边缘等信息。

    2024年02月05日
    浏览(41)
  • YOLOv5图像和视频对象生成边界框的目标检测实践(GPU版本PyTorch错误处理)

    识别图像和视频里面的对象,在计算机视觉中是一个很重要的应用,比如无人驾驶,这个就需要实时的检测到周边环境的各种对象,并及时做出处理。目标检测在以往的文章中有重点讲解过几种,其中 Faster R-CNN的源码解读,本人做了一个系列 ,有兴趣的可以查阅: MXNet的F

    2024年02月11日
    浏览(45)
  • Yolov5/Yolov7优化:引入Soft-NMS并结合各个IOU变体GIOU、DIOU、CIOU、EIOU、SIOU,进一步提升密集遮挡场景检测精度  

    💡💡💡本文改进:Soft-NMS并与各个IOU变体GIOU、DIOU、CIOU、EIOU、SIOU结合, 实现二次创新,并提升密集遮挡场景检测精度 💡💡💡Yolov8魔术师, 独家首发创新(原创) ,适用于 Yolov5、Yolov7、Yolov8等各个Yolo系列 ,专栏文章 提供每一步步骤和源码,轻松带你上手魔改网络 💡💡

    2024年02月10日
    浏览(43)
  • Yolov5同时进行目标检测和分割分割

    基于yolov5(v6.0分支)的多任务检测和分割模型。 之前很早就萌生idea在yolov5基础上添加一个分割头用于语义分割,近期正好也有论文YLOLOP是这么做的. 这里基于yolov5最新分支修改,主要改动如下: 1 . 解耦头:实验在小数据集上有一定效果(map 1%+ ),大数据集上提升不明显; 2.

    2024年02月05日
    浏览(44)
  • YOLOv5 实例分割入门

    YOLOv5 目标检测模型以其出色的性能和优化的推理速度而闻名。因此, YOLOv5 实例分割 模型已成为实时实例分割中最快、最准确的模型之一。  在这篇文章中,我们将回答以下关于 YOLOv5 实例分割的问题: YOLOv5检测模型做了哪些改动,得到了YOLOv5实例分割架构? 使用的 ProtoN

    2024年02月05日
    浏览(43)
  • OpenCV中的图像处理 —— 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)

    🌎上一节我们介绍了OpenCV中傅里叶变换和模板匹配,这一部分我们来聊一聊霍夫线/圈变换的原理和应用、使用分水岭算法实现图像分割和使用GrabCut算法实现交互式前景提取 🏠哈喽大家好,这里是ErrorError!,一枚某高校大二本科在读的♂同学,希望未来在机器视觉领域能够有

    2023年04月08日
    浏览(48)
  • YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进【NO.69】针对遥感图像目标检测中的小目标进行改进CATnet(ContextAggregation模块)

    前言 作为当前先进的深度学习目标检测算法YOLOv8,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv8的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞

    2024年02月11日
    浏览(60)
  • YOLOv5系列全新升级——yolov5-v7.0实时实例分割全面集成

    自从YOLOv5诞生依赖,社区就很活动,官方的更新频度也很高,检测系列一路迭代升级,集成融合了各种新颖的技术和tricks,目前最新已经更新到了v6.1版本,在我之前的博客里面也有详细教程讲解,感兴趣的话可以自行移步,文章如下: 《基于自建数据集【海底生物检测】使

    2024年02月01日
    浏览(57)
  • 【目标检测】YOLOv5-7.0:加入实例分割

    前段时间,YOLOv5推出7.0版本,主要更新点是在目标检测的同时引入了实例分割。 目前,YOLOv5团队已经转向了YOLOv8的更新,因此,7.0版本大概率是YOLOv5的最终稳定版。 官方公告中给出了YOLOv5-7.0的更新要点: 推出了基于coco-seg的实例分割预训练模型 支持Paddle Paddle模型导出 自动

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包