YOLO12改进-Backbone-引入MobileNetV4替换backbone,平衡精度与效率的问题
高效的设备端神经网络能实现快速实时交互体验,避免隐私数据传输,但移动设备计算资源受限,平衡精度和效率是重大挑战。此前已有诸多针对模型优化的研究,如 Mobile Convolutional Networks、Efficient Hybrid Networks、Efficient Attention、Hardware - aware Neural Architecture Search(NAS)等方向,但仍需进一步提升以适应移动生态系统需求。
上面是原模型,下面是改进模型
1. MobileNetV4介绍
Roofline 模型:用于评估模型在不同硬件上的性能,通过计算操作强度与硬件处理器和内存系统理论极限的关系,判断模型是受内存还是计算瓶颈限制,公式为ModelTime=∑imax(MACTimei,MemTimei),其中MACTimei=PeakMACsLayerMACsi,MemTimei=PeakMemBWWeightBytesi+ActivationBytesi 。通过分析不同 Ridge Point(RP)下模型的延迟和精度,为模型设计提供指导。
Universal Inverted Bottleneck(UIB):扩展了 MobileNet Inverted Bottleneck(IB)块,引入两个可选的深度卷积,统一了 Inverted Bottleneck、ConvNext、FFN 等重要模块,并引入 Extra Depthwise(ExtraDW)IB 块。UIB 有四种可能的实例化方式,在网络的不同阶段可灵活进行空间和通道混合、扩大感受野和提高计算利用率。
Mobile MQA:一种针对加速器优化的注意力块,基于操作强度的重要性设计。在混合移动视觉模型中,通过共享多头注意力中的键和值,减少内存带宽需求,提高操作强度,相比 Multi - Head Attention(MHSA)推理速度提升超过 39%。同时,引入不对称空间下采样,进一步提高效率。
优化的神经架构搜索(NAS):采用两阶段搜索策略,先进行粗粒度搜索确定最优滤波器大小,再进行细粒度搜索确定 UIB 两个深度卷积层的配置,提高搜索效率和模型质量。使用离线蒸馏数据集(如 JFT)训练 SuperNet,减少对数据增强和正则化的依赖,降低超参数调整难度,提升模型性能。
从提供的图片来看,ShuffleNet v2模块主要包含以下几个部分: 改进思路:ShuffleNet v2 受 ShuffleNet v1 启发,针对其不足进行改进。ShuffleNet v1 中逐点组卷积和瓶颈结构增加了 MAC,过多组卷积违反准则三,快捷连接中的逐元素 “Add” 操作也不理想。因此,ShuffleNet v2 旨在在不使用密集卷积和过多组卷积的情况下,维持大量且等宽的通道,以提高模型容量和效率。 基本单元结构:引入通道分割(Channel Split)操作,在每个单元开始时,将输入的c个特征通道分割为两个分支,一个分支保持不变,另一个分支包含三个卷积层,且这三个卷积层的输入和输出通道数相同,以满足准则一。两个 1×1 卷积不再是组卷积,部分原因是遵循准则二,部分原因是分割操作已产生两个组。卷积后,两个分支连接在一起,通道数保持不变,再使用 “通道混洗”(Channel Shuffle)操作促进两个分支间的信息交流。与 ShuffleNet v1 相比,ShuffleNet v2 中 “Add” 操作不再存在,逐元素操作如 ReLU 和深度卷积仅存在于一个分支,并且将 “Concat”“Channel Shuffle” 和 “Channel Split” 三个连续的逐元素操作合并为一个。
MNv4 - Conv 模型:由 NAS 优化的 UIB 块构建,针对不同资源约束进行定制。如 MNv4 - Conv - S、MNv4 - Conv - M、MNv4 - Conv - L 等模型,在不同阶段合理选择 UIB 的不同实例化方式,平衡计算量和精度。
MNv4 - Hybrid 模型:在卷积模型的最后阶段添加 Mobile MQA 块与 UIB 块交错排列,增强模型性能,如 MNv4 - Hybrid - M、MNv4 - Hybrid - L 等模型。
2. YOLOv12与MobileNetV4的结合
用 StarNet 替换 YOLOv12 的 backbone,能凭借其独特的星运算高效映射到高维非线性特征空间,在不增加过多计算量的情况下提升特征提取能力,从而可能增强 YOLOv12对复杂目标的识别精度;同时,StarNet 结构简洁、运行速度快,有望降低模型整体延迟,使检测效率得到显著提升。
3. MobileNetV4代码部分
YOLOv8_improve/YOLOV12.md at master · tgf123/YOLOv8_improve · GitHub
4. 将MobileNetV4引入到YOLOv12中
第一: 先新建一个change_model,将下面的核心代码复制到下面这个路径当中,如下图如所示。YOLOv12\ultralytics\change_model。
第二:在task.py中导入包
第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV12.YAMY文件中
第五:运行代码
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorldif __name__=="__main__":# 使用自己的YOLOv12.yamy文件搭建模型并加载预训练权重训练模型model = YOLO(r"E:\Part_time_job_orders\YOLO_NEW\YOLOv12_all\ultralytics\cfg\models\12\yolo12_MobileNetV4.yaml")# .load(r'E:\Part_time_job_orders\YOLO_NEW\YOLOv12\yolo12n.pt') # build from YAML and transfer weightsresults = model.train(data=r'E:\Part_time_job_orders\YOLO\YOLOv12\ultralytics\cfg\datasets\VOC_my.yaml',epochs=300,imgsz=640,batch=64,# cache = False,# single_cls = False, # 是否是单类别检测# workers = 0,# resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',amp = True)