YOLO目标检测算法轻量化改进的过程记录

一、前言

      本文主要记录了在毕设期间关于将目标检测算法部署至嵌入式设备(jetson nano)上的过程及对YOLO算法轻量化及精度提升的一些修改策略(改的并不多,基本都是重复组合,毕竟我是个菜鸡)。
      注意!仅对于被论文折磨必须要有一丢丢创新点的人来说有点看的意义,对于工程落地什么的没有丝毫帮助!真正做项目落地的话,数据集的前处理及网络输出后的后处理要比改网络结构有用的多的多!在网络方面,选择合适的backbone并调整好head,再选择相应的loss即可!
      主要是在YOLOv4-tiny、YOLOv5-s及YOLOX-tiny的基础上做出的总结及改进,都是自己的实测效果及一些改进后的效果的记录,免得大家二次踩坑,并不一定适用于所有情况,并且容易受训练策略、数据集等各种各样因素影响导致结果有所区别,但深度学习嘛,本身就是个玄学问题,大家看看就好,如果在文中发现什么特别离谱的问题欢迎指正。

二、网络结构的选择过程

2.1 主干部分的选择

      我尝试了对比几种网络(mobilenetv2、shufflenetv2、ghostnet以及darknet),我发现将YOLOX中使用的cspdarknet轻量化(以fps为标准,按倍数调整通道数)至与mobilenetv2、shufflenetv2及ghostnet相近,在推理速度相差不到5ms的前提下,cspdarknet的表现最优,具体的如表。

主干mAP
cspdarknet-
shufflenetv2-2.1%
mobilenetv2-3.8%
ghostnet-7.2%

      需要注意的是,YOLOX参考了YOLOv5的focus头,但这里我多次对比加不加focus头的情况,发现focus头增加了很多推理速度并且它的效果也并不是很好,因此我使用了普通的卷积块替代了。
      这部分实验我的初衷是为了以cspdarknet为基准作对比选择主干网络的,但没想到结果这么离谱,YOLOX中使用的cspdarknet轻量化之后表现是最好的。因为考虑到主干部分采用预训练的权值的话收敛会相对更快点,并且自己也没卡作预训练,所以就没对主干部分再动刀子了,直接用的YOLOX-tiny的主干,即depth = 0.33,width = 0.375。

2.2 特征金字塔的魔改

      FPN、PAN、BiFPN等等各种网络都很常用,FPN、PAN更是常用在YOLO中,本文首先用了BiFPN替换了PAN,在保证推理速度相差不到5ms的前提下,发现BiFPN表现确实能有效的提升2-3%mAP,但在换了另一种数据集时(小目标很多),又发现效果反而下降了,想了很久想不到原因,就只能归集到这个结构并不能适用于我的数据集了。。。
      后面就有点为了改而改的意思了,在其中增加了csp、res等结构来替换卷积块,以及增加了其它一些边的特征融合,在一系列的尝试之后,相较于一般的多次卷积块的堆叠确实是有了一定的效果,毕竟这个是那么多大佬提出的结构,确实是好用。
      再然后就是注意力机制了,试了好几种,se、cbam、eca、da这些,效果试了一下,精度提升最大的是cbam,具体对推理速度的对比并没有测试,因为效果最好,所以只试了cbam的,但说实话,有点得不偿失,针对嵌入式设备而言,网络的整体推理速度大概40ms,增加了6个cbam块增加了10ms(因为bifpn的特征融合方式就有点注意力的那个意思了,所以主干加在了上采样及下采样之后),而mAP却只提升了1%左右。

2.3 输出部分

      YOLOX确实好啊,解耦头是真的很好用,虽然增加了很多的计算量,但通过缩减通道数与非解耦结构推理速度相似的情况下,mAP居然提升了3%左右,真好用!!!

三、其它的一些记录

3.1 关于Params和FLOPs

      刚开始啥都不懂,单纯的以为降这两个就等于加快模型的推理速度,但后来发现并不是,Params的降低只是仅仅说明了你降低了模型的参数量,FLOPs也只能说明每秒浮点运算次数,其它并不能说明啥。模型的推理速度还受内存访问次数等很多因素的影响。

3.2 关于深度可分离卷积

      之前百度以及看一些博硕论文的时候,看别人的轻量化改进很多采用了深度可分离卷积,但我试了之后能够缩减的只有Params和FLOPs,在嵌入式设备上的推理速度反而更慢了。因此使用需要谨慎!!!

3.3 关于训练策略

      虽然很多文章说不用预训练和使用预训练差不了太多,但我在使用的过程中,发现还是使用预训练权值训练的话效果会更好点,当然,这可能是我训练轮次相对可能不高的原因(300 epoch)。
      优化器的话,只试了sgd和adam。在300个epoch的情况下,sgd更好用,但在100个epoch的情况下发现adam的训练效果会更好。

四、总结

  • 推理速度和识别精度才是最能说明模型效果的东西。
  • 模型结构修改的话很多时候不如直接调整通道数。
  • 深度可分离卷积并没那么好用,(但这里我并没有用tensorRT加速后再对比,可能tensorRT加速后会提升?我也不清楚)。
  • cspdarknet和解耦头是真好用。
  • 浅层特征图对小目标的检测效果确实会更好,追求小目标检测效果的不妨在特征融合之后多上采样加多种处理后增加一个特征层预测。
  • YOLOv4-tiny是真快啊,追求速度的可以学一下它只用两个特征层预测。
  • pytorch搭建的模型如果想tensorRT加速的话可能会遇到问题,因为我没有具体研究,直接用的torch2trt转的,很多函数转换会出问题,比如torch.sum()。。。
### YOLO 轻量化版本及其优化技术 对于移动设备或边缘计算平台而言,YOLO轻量化版本和优化方法至关重要。这些改进不仅提高了模型效率还保持了较高的精度。 #### Tiny-YOLO 版本 Tiny-YOLOYOLO 架构的一个简化变体,在保证一定检测性能的同时显著减少了参数数量和计算量[^1]。该版本通过减少卷积层的数量以及降低特征图分辨率来实现加速效果。 #### MobileNet 和 ShuffleNet 结合 为了进一步提升速度并适应资源受限环境下的应用需求,研究人员提出了将 MobileNet 或者 ShuffleNet 这样的高效骨干网络应用于 YOLO 中的方法[^2]。这类方案利用深度可分离卷积等技巧大幅降低了运算复杂度而不明显牺牲准确性。 #### 剪枝与量化 剪枝技术和量化处理也是重要的优化手段之一。通过对不重要权重进行修剪可以有效压缩模型大小;而低比特位宽表示法则有助于提高推理阶段的速度及节省存储空间[^4]。 ```python import torch.nn as nn class Pruned_YOLO(nn.Module): def __init__(self, pruned_weights_path=None): super().__init__() self.backbone = ... # Define backbone network here if pruned_weights_path is not None: state_dict = torch.load(pruned_weights_path) self.load_state_dict(state_dict) def quantize_model(model): model.qconfig = torch.quantization.get_default_qat_qconfig('fbgemm') torch.quantization.prepare_qat(model, inplace=True) ``` #### 自适应锚框优化 (AABO) 自适应锚框优化算法能够针对不同数据集自动调整候选区域尺寸分布情况,从而改善小物体识别率等问题,并间接促进了整体架构向更紧凑方向发展。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值