小工具知识网

当前位置: 首页 > 行业知识 > 【YOLOv7/YOLOv5系列算法改进NO.49】模型剪枝、蒸馏、压缩

行业知识

【YOLOv7/YOLOv5系列算法改进NO.49】模型剪枝、蒸馏、压缩

2026-11-07 09:02:52 来源:互联网转载

文章目录

  • 前言
  • 一、解决问题
  • 二、基本原理
  • 三、剪枝操作
  • 四、���识蒸馏操作

    前言

    作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv7的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。由于出到YOLOv7,YOLOv5算法2020年至今已经涌现出大量改进论文,这个不论对于搞科研的同学或者已经工作的朋友来说,研究的价值和新颖度都不太够了,为与时俱进,以后改进算法以YOLOv7为基础,此前YOLOv5改进方法在YOLOv7同样适用,所以继续YOLOv5系列改进的序号。另外改进方法在YOLOv5等其他算法同样可以适用进行改进。希望能够对大家有帮助。

    具体改进办法请关注后私信留言!关注免费领取深度学习算法学习资料!


    剪枝百度网盘链接:https://mp.csdn.net/mp_blog/manage/article?spm=1001.2101.3001.5448

    提取码:关注后私信获取

    一、解决问题

    本文尝试对YOLOv5模型进行模型剪枝、蒸馏、压缩,以达到网络模型轻量化的目的。以满足实际的应用部署。此前介绍了以下几种轻量化方法,欢迎大家点击查看,有问题可以关注后私信我答疑。☁️11. 主干网络C3替换为轻量化网络MobileNetV3☁️12. 主干网络C3替换为轻量化网络ShuffleNetV2☁️13. 主干网络C3替换为轻量化网络EfficientNetv2☁️14. 主干网络C3替换为轻量化网络Ghostnet☁️15. 网络轻量化方法深度可分离卷积☁️16. 主干网络C3替换为轻量化网络PP-LCNet☁️40. 轻量化mobileone主干网络引入☁️48. 构建新的轻量网络—Slim-neck by GSConv(2022CVPR)

    二、基本原理

    原文链接

    源码

    深度卷积神经网络(CNN)在许多实际应用中的部署在很大程度上受到其高计算成本的阻碍。在本文中,我们为神经网络提出了一种新的学习方案,以同时1)减小模型大小;2) 减少运行时内存足迹;以及3)在不损害精度的情况下减少计算操作的数量。这是通过以简单但有效的方式强制网络中的信道级稀疏性来实现的。与许多现有方法不同,所提出的方法直接适用于现代CNN架构,为训练过程引入了最小的开销,并且不需要用于生成模型的专用软件/硬件加速器。我们称我们的方法为网络瘦身,它将宽网络和大网络作为输入模型,但在训练过程中,不重要的信道被自动识别并随后修剪,从而产生具有可比精度的瘦而紧凑的模型。我们在各种图像分类数据集上,用几个最先进的CNN模型(包括VGGNet、ResNet和DenseNet)实证证明了我们方法的有效性。对于VGGNet,网络瘦身的多通道版本使模型大小减少了20倍,计算操作减少了5倍。

    三、剪枝操作

    1.首先使用train.py进行正常训练:

    python train.py --weights yolov5s.pt --adam --epochs 100

    2.然后稀疏训练:

    python train_sparsity.py --st --sr 0.0001 --weights yolov5s.pt --adam --epochs 100

    sr的选择需要根据数据集调整,可以通过观察tensorboard的map,gamma变化直方图等选择。 在run/train/exp*/目录下:

    tensorboard --logdir .

    然后点击出现的链接观察训练中的各项指标

    3.训练完成后进行剪枝:

    python prune.py --weights runs/train/exp1/weights/last.pt --percent 0.5 --cfg models/yolov5s.yaml

    4.裁剪比例percent根据效果调整,可以从小到大试。注意cfg的模型文件需要和weights对应上,否则会出现运行prune 过程中出现键值不对应的问题,裁剪完成会保存对应的模型pruned_model.pt。

    微调:

    python finetune_pruned.py --weights pruned_model.pt --adam --epochs 100

    ps

    调参

    1.浅层尽量少剪,从训练完成后gamma每一层的分布也可以看出来.

    2.系数λ的选择需要平衡map和剪枝力度.首先通过train.py训练一个正常情况下的baseline.然后在稀疏训练过程中观察MAP和gamma直3.方图变化,MAP掉点严重和gamma稀疏过快等情况下,可以适当降低λ.反之如果你想压缩一个尽量小的模型,可以适当调整λ.

    稀疏训练=>剪枝=>微调 可以反复迭代这个过程多次剪枝.

    4.使用yolov5默认的一些参数通常效果能获得不错的效果,比如使用SGD训练300 epoch,lr 0.01->0.001等,这里实验为了快速选用adamw训练了100 epoch。

    5.剪枝多少参数,有的是时候和数据集关系很大,我分别在简单任务(5k images,40+ class)和复杂数据集(20w+ images, 120+ class)实验过,简单任务可以将模型剪到很小(小模型也相对不够鲁棒);复杂的任务最终参数较难稀疏,能剪的参数很少(

上一篇:scum怎么进中国服务器?

下一篇:海康审讯主机怎么安装