0


改进YOLOv5系列:7.改进DIoU-NMS,SIoU-NMS,EIoU-NMS,CIoU-NMS,GIoU-NMS

助力论文改进🏆 、 不同数据集涨点🏆、创新点改进🏆

  • 💡YOLOAir项目:基于 YOLOv5 代码框架,结合不同模块来构建不同的YOLO目标检测模型。
  • 🌟本项目包含大量的改进方式,降低改进难度,改进点包含BackboneNeckHead注意力机制IoU损失函数NMSLoss计算方式自注意力机制数据增强部分激活函数等部分,详情可以关注👉 YOLOAir 的说明文档。
  • 🎈同时附带各种改进点原理及对应的代码改进方式教程,用户可根据自身情况快速排列组合,在不同的数据集上实验, 应用组合写论文!🏆

🎈🎈🎈新的仓库链接👉:YOLOAir仓库:https://github.com/iscyy/yoloair
可以 forkstar,持续同步更新完善


本篇是《关于一系列NMS🚀》的修改 演示

包括:NMS、Merge-NMS、Soft-NMS、CIoU-NMS、DIoU-NMS、GIoU-NMS、EIoU-NMS、SIoU-NMS

使用YOLOv5网络🚀作为示范,可以无缝加入到 YOLOv7、YOLOX、YOLOR、YOLOv4、Scaled_YOLOv4、YOLOv3等一系列YOLO算法模块


文章目录


NMS相关理论部分

理论部分,别的博客已经解释的很详细了,可以搜搜
NMS技术总结(NMS原理、多类别NMS、NMS的缺陷、NMS的改进思路、各种NMS方法)
以及其他的


1.改为:Merge-NMS

YOLOv5代码中直接打开即可,

general.py

文件下的

merge = False

替换为

merge = True

即可


2.改为:Soft-NMS

改为Soft-NMS,
Soft-CIoUNMS,
Soft-SIoUNMS,
Soft-DIoUNMS,
Soft-EIoUNMS,
Soft-GIoUNMS
参考:https://blog.csdn.net/qq_38668236/article/details/126245080


其他:NMS

在YOLOV5当中,作者调用了Pytorch官方的nms方法
首先增加

NMS

函数,
这里的计算IOU的函数——bbox_iou则是直接引用了YOLOV5中的代码,其简洁的集成了对与SIoU,EIoU,GIOU,DIOU,CIOU的计算。

general.py

文件中加入NMS方法

def NMS(boxes, scores, iou_thres, class_nms='CIoU'):
    # class_nms=class_nms
    GIoU=CIoU=DIoU=EIoU=SIoU=False
    if class_nms == 'CIoU':
        CIoU=True
    elif class_nms == 'DIoU':
        DIoU=True
    elif class_nms == 'GIoU':
        GIoU=True
    elif class_nms == 'EIoU':
        EIoU=True
    else :
        SIoU=True
    B = torch.argsort(scores, dim=-1, descending=True)
    keep = []
    while B.numel() > 0:
        index = B[0]
        keep.append(index)
        if B.numel() == 1: break
        iou = bbox_iou(boxes[index, :], boxes[B[1:], :], GIoU=GIoU, DIoU=DIoU, CIoU=CIoU, EIoU=EIoU, SIoU=SIoU)
        inds = torch.nonzero(iou <= iou_thres).reshape(-1)
        B = B[inds + 1]
    return torch.tensor(keep)

这里参考了博主:lzzzzzzm的代码

其次

non_max_suppression

方法中的

i = torchvision.ops.nms(boxes, scores, iou_thres)

注释
增加了

i = NMS(boxes, scores, iou_thres, class_nms='xxx')

3.改为:DIoU-NMS

i = NMS(boxes, scores, iou_thres, class_nms='DIoU') # NMS

调用
将class_nms 设置为= DIoU时,则开启DIoU-NMS


4.改为:GIoU-NMS

i = NMS(boxes, scores, iou_thres, class_nms='GIoU') # NMS

调用
将class_nms 设置为= GIoU时,则开启GIoU-NMS


5.改为:CIoU-NMS

i = NMS(boxes, scores, iou_thres, class_nms='CIoU') # NMS

调用
将class_nms 设置为= CIoU时,则开启CIoU-NMS


6.改为:EIoU-NMS

i = NMS(boxes, scores, iou_thres, class_nms='EIoU') # NMS

调用
将class_nms 设置为= EIoU时,则开启EIoU-NMS


7.改为:SIoU-NMS

i = NMS(boxes, scores, iou_thres, class_nms='SIoU') # NMS

调用
将class_nms 设置为= SIoU时,则开启SIoU-NMS


8.效果对比(小样本测试)

CPU推理
默认 NMS 0.655 0.429 - 时间 4.6ms NMS
SIoU-NMS 0.656 0.429 - 时间 152.9ms NMS
CIoU-NMS 0.656 0.429 - 时间 75.8ms NMS
DIoU-NMS 0.656 0.429 - 时间 59.0ms NMS
GIoU-NMS 0.655 0.429 - 时间 54.8ms NMS
EIoU-NMS 0.652 0.427 - 时间 85.8ms NMS


本文转载自: https://blog.csdn.net/qq_38668236/article/details/126243834
版权归原作者 芒果汁没有芒果 所有, 如有侵权,请联系我们删除。

“改进YOLOv5系列:7.改进DIoU-NMS,SIoU-NMS,EIoU-NMS,CIoU-NMS,GIoU-NMS”的评论:

还没有评论