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方法)
以及其他的
YOLOv5代码中直接打开即可,general.py
文件下的
merge = False
替换为merge = True
即可
改为Soft-NMS,
Soft-CIoUNMS,
Soft-SIoUNMS,
Soft-DIoUNMS,
Soft-EIoUNMS,
Soft-GIoUNMS
参考:https://blog.csdn.net/qq_38668236/article/details/126245080
在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')
在i = NMS(boxes, scores, iou_thres, class_nms='DIoU') # NMS
调用
将class_nms 设置为= DIoU时,则开启DIoU-NMS
在i = NMS(boxes, scores, iou_thres, class_nms='GIoU') # NMS
调用
将class_nms 设置为= GIoU时,则开启GIoU-NMS
在i = NMS(boxes, scores, iou_thres, class_nms='CIoU') # NMS
调用
将class_nms 设置为= CIoU时,则开启CIoU-NMS
在i = NMS(boxes, scores, iou_thres, class_nms='EIoU') # NMS
调用
将class_nms 设置为= EIoU时,则开启EIoU-NMS
在i = NMS(boxes, scores, iou_thres, class_nms='SIoU') # NMS
调用
将class_nms 设置为= SIoU时,则开启SIoU-NMS
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