不分胜负网

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

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

yoloair

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

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

对于这块有疑问的,可以在评论区提出,或者私信CSDN。🌟


本篇是《关于一系列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相关理论部分
    • 1.改为:Merge-NMS
    • 2.改为:Soft-NMS
    • 其他:NMS
    • 3.改为:DIoU-NMS
    • 4.改为:GIoU-NMS
    • 5.改为:CIoU-NMS
    • 6.改为:EIoU-NMS
    • 7.改为:SIoU-NMS
    • 8.效果对比(小样本测试)

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

未经允许不得转载:不分胜负网 » 改进YOLOv5系列:7.改进DIoU-NMS,SIoU-NMS,EIoU-NMS,CIoU-NMS,GIoU-NMS