YOLO-Multi-Backbones-Attention
YOLOv3多骨干网络替换工具:GhostNet/ShuffleNetV2/VoVNet + 剪枝/
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
YOLOv3多骨干网络替换工具:GhostNet/ShuffleNetV2/VoVNet + 剪枝/
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下:你训练好了一个准确率很高的目标检测模型,但要把这个模型部署到边缘设备(摄像头、工控机、嵌入式设备)上时,发现模型太大、跑得太慢,根本无法实时运行。怎么办?重新设计一个更小的模型太费时间,直接压缩效果往往不理想。这正是 YOLO-Multi-Backbones-Attention 想要解决的问题——用多种轻量化骨干网络替换 YOLOv3 的"心脏",在保持精度的同时大幅降低计算量。
YOLOv3 是目标检测领域的经典模型,精度可靠、生态成熟。但它的问题同样明显:参数量大、推理速度慢,在移动端和边缘设备上几乎无法满足实时性需求。
传统做法是直接用更小的 YOLOv3-tiny 版本,但这往往意味着精度断崖式下跌。研究者的新思路是:换掉 YOLOv3 的骨干网络(Backbone),用更轻量的模块来替代原始的 DarkNet53,同时保持甚至提升检测精度。这个项目正是这一思路的完整实践。
项目实现了三种轻量化骨干网络与 YOLOv3 的融合,每种都有独特的优化策略和数据支撑:
ShuffleNetV2 通过通道重排(Channel Shuffle)和逐点分组卷积,大幅降低参数量。在 Oxford Hand 数据集上,ShuffleNetV2 1x 版本的参数量仅 3.57M(13.89MB),比 YOLOv3-tiny(8.67M)减少了约 59%,而 mAP 仅下降约 9 个百分点(60.3%→51.2%)。对于资源受限场景,这是可接受的精度损失换取的显著效率提升。
GhostNet 是华为诺亚方舟实验室提出的创新架构,核心思想是:用廉价的线性操作(cheap operation)从少量原始特征图中生成"Ghost"特征图,而不是像传统卷积那样每个通道都从头计算。在 VisDrone 遥感数据集上,GhostNet+YOLOv3 交出的成绩单是:参数量 23.49M,FPS 62.5,mAP 35.1%。作为对比,YOLOv5s 的参数量为 7.27M,但 mAP 仅有 32.7%——GhostNet 版本在参数量更大的同时,精度也更高,说明架构本身的特征提取能力更强。
更令人惊讶的是,经过剪枝+蒸馏后,模型参数量压缩到 5.81M,FPS 提升到 76.9,mAP 仅下降 0.8 个百分点(35.1%→34.3%)。INT8 量化后推理速度维持在 75.1 FPS,mAP 仅再降 0.3 个百分点。这一系列数据背后,是模型压缩领域三大经典技术的协同作战:稀疏训练→通道剪枝→知识蒸馏→量化部署。
VoVNet 采用了轻量级骨干网络的一次性聚合策略(One-Shot Aggregation),通过减少特征聚合的中间冗余,在 VisDrone 数据集上达到了 42.7 mAP,是三种骨干网络中精度最高的,但也以 42.8M 参数量和 28.9 FPS 的代价换来的。这是精度与速度之间经典权衡的体现——如果你对精度要求极高且有 GPU 算力支撑,VoVNet 是更好的选择;如果你需要在边缘设备上实时运行,GhostNet 的 76.9 FPS 更有竞争力。
除了换骨干网络,项目还在 YOLOv3-tiny 上验证了三种注意力模块的效果。注意力机制的作用相当于给模型增加一个"焦点"——让它在识别物体时更关注重要的区域,忽略无关的背景。
在 Oxford Hand 数据集上的对比结果非常清晰:SE(Squeeze-and-Excitation)注意力通过建模通道间依赖关系,+0.26M 参数量换来 +2.0 mAP;CBAM(Convolutional Block Attention Module)同时建模通道和空间两个维度的注意力,+0.14M 换来 +2.4 mAP;ECA(Efficient Channel Attention)用一维卷积替代全连接层来计算通道注意力,参数量零增加,mAP +2.3。
值得注意的是,ECA 版本"几乎零成本涨点"的特性,使得它成为工程落地的首选注意力机制。在对精度要求不是特别严苛但对模型体积有硬约束的场景下,这个发现非常有价值——只需要在 cfg 文件中加入 ECA 注意力模块,不需要任何额外参数,就能稳定提升 2-3 个百分点的 mAP。
项目不仅仅是一个预训练模型集合,更是一套完整的模型压缩研究工具链,涵盖剪枝、量化和知识蒸馏三大核心能力:
剪枝(Pruning):基于 Network Slimming 方法,对 BN 层的 γ 缩放因子进行 L1 正则化稀疏训练,然后按阈值剪除不重要的通道。60% 剪枝率下,模型参数量从 23.49M 降至 5.81M(减少 75%),mAP 仅损失 0.8 个百分点。这背后的关键是稀疏训练+通道剪枝的配合:稀疏训练让 BN 层学到一个"重要性分数",剪枝阶段则按分数排序,精准去除冗余通道。normal_prune.py 中的阈值计算逻辑值得细读:通过 sorted_bn[thre_index] 找到剪枝率对应的 BN γ 参数阈值,同时确保每个 BN 层至少保留一个通道(通过 highest_thre 限制避免过度剪枝)。
量化(Quantization):集成了 Dorefa 量化方法,支持任意位宽(2-bit、4-bit、8-bit)。INT8 量化后模型体积进一步缩小,推理速度几乎不变(76.9→75.1 FPS),mAP 仅下降 0.3 个百分点。量化过程通过修改 cfg 文件中的 [convolutional] 为 [quan_convolutional] 来控制哪些层参与量化,无需改代码——这种 cfg 驱动的量化开关设计非常工程化。
知识蒸馏(Distillation):剪枝后的模型往往精度有所损失,项目通过知识蒸馏用原始大模型(教师模型)指导剪枝后的小模型(学生模型)训练。在 VisDrone 数据集上,蒸馏将剪枝模型的 mAP 从 33.5% 恢复到 34.3%,弥补了大部分精度损失。蒸馏的核心在于软标签——用教师模型的预测概率分布作为监督信号,比硬标签(one-hot)能传递更多"暗知识",让学生模型学到更丰富的决策边界信息。
项目代码架构可分为四个核心模块,结构清晰、研究导向明确:
models.py(约 27K):模型定义的核心,实现了 Darknet 格式 .cfg 文件的解析引擎 create_modules()。骨干网络通过 cfg 配置定义,切换骨干只需更换 cfg 文件。文件中集成了 Dorefa 量化卷积层 Conv_q 和 Conv2d_Q,支持低比特前向推理。w_bit 和 a_bit 全局变量控制量化位宽(默认 8-bit)。
train.py(约 26K):训练脚本,基于 PyTorch。包含混合精度训练(NVIDIA Apex)、多尺度训练(multi_scale)、余弦退火学习率调度、热启训练等高级技巧。超参数通过 hyp 字典集中管理,参考了 YOLOv3 原始设置。分布式训练支持通过 torch.distributed 实现,评测在每个 epoch 后自动运行。
normal_prune.py(约 8K):剪枝脚本,实现完整的 Network Slimming 流程:稀疏训练→计算阈值→执行剪枝→生成新 cfg。核心逻辑是按 BN 层 γ 参数的 L1 范数排序,低于阈值的通道直接裁掉,同时重写 cfg 文件以适配剪枝后的通道数。
utils/datasets.py:数据加载模块,实现 LoadImages(批量图片推理)、LoadStreams(视频/RTSP流实时推理)和数据集加载逻辑,支持 VisDrone、Oxford Hand、BDD100K、DIOR 等多种数据集格式。

代码年代较早:项目最后一次活跃更新在 2020 年,彼时 YOLOv5 还未发布。如今 Ultralytics 的 YOLOv5/v8/v11 生态已非常成熟,且内置了剪枝、微调等工具链。如果目标是部署而非研究,建议优先考虑 Ultralytics 官方生态。
数据集获取困难:项目数据集(VisDrone、BDD100K、DIOR)托管在百度网盘,需手动下载且部分链接可能已失效。这对于想复现实验的用户是一个实际障碍。
无 Web UI 和容器化:所有操作通过命令行完成,缺少可视化界面和 Docker 支持。缺少 requirements.txt 也增加了环境配置的复杂度。
对于 AI 爱好者:三种注意力机制的对比实验(SE/CBAM/ECA)和 GhostNet 的设计思想都非常值得深入研究,配合原论文阅读效果更佳。项目中"ECA 零成本涨点 +2.3 mAP"的发现,在实际工程中有很高的参考价值。
对于 AI 开发者:项目中剪枝→量化→蒸馏的完整流程值得参考,尤其是 normal_prune.py 的阈值计算和 cfg 重写逻辑,可以直接移植到自己的项目中。但建议评估是否值得从更现代的 YOLO 版本开始重新实现。
总的来说,这是一个研究导向扎实、工程导向需适配的工具库。它的价值不在于直接用于生产,而在于它把模型压缩的三大核心技术——剪枝、量化、蒸馏——用清晰的代码实现了出来,并且提供了可比的实验结果。对于想深入理解模型压缩背后原理的研究者和开发者,这是难得的实战教材。