- 💡YOLOAir项目:基于 YOLOv5 代码框架,结合不同模块来构建不同的YOLO目标检测模型。
- 🌟本项目包含大量的改进方式,降低改进难度,改进点包含
Backbone
、Neck
、Head
、注意力机制
、IoU损失函数
、NMS
、Loss计算方式
、自注意力机制
、数据增强部分
、激活函数
等部分,详情可以关注👉 YOLOAir 的说明文档。 - 🎈同时
附带各种改进点原理及对应的代码改进方式教程
,用户可根据自身情况快速排列组合,在不同的数据集上实验, 应用组合写论文!🏆
🎈🎈🎈新的仓库链接👉:YOLOAir仓库:https://github.com/iscyy/yoloair
可以 fork 和 star,持续同步更新完善
本篇是《关于一系列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
版权归原作者 芒果汁没有芒果 所有, 如有侵权,请联系我们删除。