【保姆级零基础教程】哪些创新点可以快速改进提升YOLO?

本文主要介绍YOLO的改进点,通过阅读本文进行对应的改进,同学们对于如何改进创新,应该可以获得更多体会。除了YOLO外,本文的部分改进点也可以用于其它各类目标检测算法的改进创新。同时,本文会按照从易到难的顺序介绍常见的创新点。

一、锚框

锚框的改进主要是利用合适的锚框计算算法获得新的锚框。锚框通过预设的候选框集减少搜索空间,辅助模型聚焦于最有可能包含目标的区域,进而提升检测效率和性能。

YOLOv5/v7项目文件自带Kmeans锚框聚类算法,可以用以获得新的锚框。同时,采用不同数量、不同尺寸大小的锚框也会对检测精度产生一定影响。

常见的锚框计算算法还有Kmeans++、差分进化算法等。

实际上,当进行训练时,并不是选择了锚框计算算法获得的锚框就一定有很大作用。如笔者在YOLO训练时,大多数时候利用锚框算法获得的锚框并没有起到很大作用。

当然,也有算法采用的是无锚框机制,比如YOLOX算法等。

二、激活函数

对于不同的网络结构,选择不同的激活函数常能获得不一样的检测结果。激活函数是构建高效、准确目标检测模型不可或缺的一部分,它们通过引入非线性、增强特征表达、优化训练过程等多种机制,直接或间接地提升了模型在目标检测任务上的性能。

同时,我们也需要关注不同算法Baseline采用的激活函数,比如YOLOv5/v7采用的是SiLU激活函数,YOLOv7-tiny采用的是LeakyReLU激活函数。

选择不同的激活函数会造成不同的影响,比如常见的ReLU激活函数相比tanh 和 sigmoid 激活函数,它的计算成本更低、计算更简单,即速度更快,但其存在不可忽视的缺点,比如当输入值为负时,ReLU的梯度为0,这意味着对应的权重将不会得到更新,也就是出现了"死神经元"现象。

同样地,对于常见的激活函数如SiLU、LeakyReLU、ELU、GELU、Mish、Hardswish、FReLU、PReLU、RReLU等。根据自己的需要,以及模型的实际表现情况,选择合适的激活函数也是至关重要的。

三、损失函数

对于不同的网络结构,选择不同的损失函数常能获得不一样的检测结果。它是衡量模型预测结果与真实标签之间差异的量化指标,它能指导模型在训练过程中不断优化参数,以减小这种差异,从而提升检测的准确性。

常见的损失函数比如经典的SIOU、GIOU、DIOU、EIOU、WIOUv1-3、alpha IOU、Focal S/G/D/E/CIOU以及近年来新颖的Inner-IOU、EfficiCIOU、XIOU、MPDIOU等。

同学们可以在训练过程中,当确定好利用损失函数进行改进的情况下,对自己的数据集测试不同的几个IOU积累经验,比如Focal IOU在部分情况比较适合中大型目标的检测,却不是很适合小目标的检测。

四、检测头

检测头主要负责从提取的特征图中预测出目标的位置(通常是边界框坐标)和类别,它整合了主干网络提取的特征信息,完成从特征到最终检测结果的转换,是决定模型检测效果的关键组件。

不同算法Baseline采用的检测头有所不同,比如YOLOv5采用的是Detect检测头,YOLOv7采用的则是IDetect检测头,RT-DETR采用的是RTDETRDecoder,YOLOX采用的是解耦合头等。

不同的检测头的作用、检测能力和GFLOPS大小、模块速度快慢有所不同。

常见的检测头如Detect、IDetect、RTDETRDecoder、Decoupled head、ASFFDetect、DyHead、LADHDetect等。

但需要注意的是,对于轻量化的同学而言,很多时候更换诸如解耦合头,动态检测头等检测头会显著增加参数量和模型大小,在部分同学的电脑上可能还会导致爆显存。因此选择检测头需要根据需求行事。

五、池化层

池化层能够适应不同尺度的特征,增强模型对尺度变化的鲁棒性,也能减少特征图的空间维度来降低后续层的计算复杂度和所需的存储空间。对于池化层的改进也是一个创新点。

池化层的修改在YOLO系列中较为容易,比如YOLOv5-6.0的Baseline采用的是SPP池化层,除此之外,还可以改为SPPF、SPPCSPC、SPPFCSPC、SPPELAN、ASPP、SimSPPF等。

六、NMS(非极大值抑制算法)

非极大值抑制算法的作用是消除检测结果中的冗余预测框,确保每个目标只对应一个最优的边界框。

常见的NMS算法比如Soft-NMS等。

但需要注意的是若在训练时开启Soft-NMS,会导致训练速度极慢,因此可在测试时采用Soft-NMS获取结果。

七、骨干网络

骨干网络在目标检测中扮演着至关重要的角色,它是深度学习模型的基础架构,负责从输入图像中提取多层次的特征图。不同的骨干网络设计对目标检测的性能有着直接影响。

大家可以根据自己的需求选择不同的backbone,常见的backbone比如ResNet、ShuffleNet、VanillaNet、PP-LCNet、VGGNet等。

同学们在进行轻量化设计时常常可以采用轻量级的骨干网络,比如MobileNet、FasterNet等。

八、上采样层

上采样层在目标检测中主要用于提升对目标的识别能力,实现特征层次间的有效融合,从而增强模型在不同尺度下的检测精度与定位准确性。

YOLOv5/v7的Baseline采用的是nearest(最近邻插值),常见的上采样层可以替换为bilinear(双线性插值)、bicubic(双三次插值)、转置卷积等。

而在不同的情景下,比如小目标的检测可以采用CARAFE等。

九、注意力机制

注意力机制能够引导模型聚焦于最关键和最具辨别性的特征,从而提升检测的准确性和效率。

常见的注意力机制比如CBAM、ECA、CA、SE等注意力机制,将注意力机制加在网络的不同部分能起到不同的作用,同学们可以视情况添加注意力机制。

比如,将注意力机制加在网络首部能够全局性地对特征信息进行针对性地处理,而加在不同尺寸的特征图输出层则可以表示更关注某一尺寸特征图的特征等。以YOLOv7-tiny为例,下述代码1为加于网络输入部分,代码2为加于网络特征图输出部分。

backbone:
  # [from, number, module, args] c2, k=1, s=1, p=None, g=1, act=True
  # [[-1, 1, Conv, [32, 3, 2, None, 1, nn.LeakyReLU(0.1)]],  # 0-P1/2
  [[-1, 1, Attention, [32, 3, 2, None, 1, nn.LeakyReLU(0.1)]],  # 0-P1/2

  #  [-1, 1, Conv, [64, 3, 2, None, 1, nn.LeakyReLU(0.1)]],  # 1-P2/4
   [-1, 1, Attention, [64, 3, 2, None, 1, nn.LeakyReLU(0.1)]],  # 1-P2/4

   [-1, 1, Conv, [32, 1, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-2, 1, Conv, [32, 1, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-1, 1, Conv, [32, 3, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-1, 1, Conv, [32, 3, 1, None, 1, nn.LeakyReLU(0.1)]],
   [[-1, -2, -3, -4], 1, Concat, [1]],
   [-1, 1, Conv, [64, 1, 1, None, 1, nn.LeakyReLU(0.1)]],  # 7
   [-1, 1, MP, []],  # 8-P3/8
   [-1, 1, Conv, [64, 1, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-2, 1, Conv, [64, 1, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-1, 1, Conv, [64, 3, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-1, 1, Conv, [64, 3, 1, None, 1, nn.LeakyReLU(0.1)]],
   [[-1, -2, -3, -4], 1, Concat, [1]],
   [-1, 1, Attention, [128, 1, 1, None, 1, nn.LeakyReLU(0.1)]],  # 14

   [-1, 1, MP, []],  # 15-P4/16
   [-1, 1, Conv, [128, 1, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-2, 1, Conv, [128, 1, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-1, 1, Conv, [128, 3, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-1, 1, Conv, [128, 3, 1, None, 1, nn.LeakyReLU(0.1)]],
   [[-1, -2, -3, -4], 1, Concat, [1]],
   [-1, 1, Attention, [256, 1, 1, None, 1, nn.LeakyReLU(0.1)]],  # 21

   [-1, 1, MP, []],  # 22-P5/32
   [-1, 1, Conv, [256, 1, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-2, 1, Conv, [256, 1, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-1, 1, Conv, [256, 3, 1, None, 1, nn.LeakyReLU(0.1)]],
   [-1, 1, Conv, [256, 3, 1, None, 1, nn.LeakyReLU(0.1)]],
   [[-1, -2, -3, -4], 1, Concat, [1]],
   [-1, 1, Attention, [512, 1, 1, None, 1, nn.LeakyReLU(0.1)]],  # 28

除此之外,还可以在论文中阐述自己采用了何种数据增强技术,进行了剪枝蒸馏等工作。

同学们可以理解以上步骤,进而为自己的模型修改做出依据。

下一篇文章:YOLO训练杂谈,常见问题的解决方法。

下一篇专栏:YOLO改进指南

将会对本文上述改进部分进行手把手的改进教学。

更多文章产出中,主打简洁和准确,欢迎关注我,共同探讨!

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值