改进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相关理论部分
    • 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

你可能感兴趣的:(深度学习,python,目标检测)