YOLOV5-模型轻量化的一些常见方法

Posted Hack Hui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YOLOV5-模型轻量化的一些常见方法相关的知识,希望对你有一定的参考价值。

欢迎关注、点赞、评论!

YOLOv5是一个基于深度学习的目标检测算法,是YOLO系列算法的最新版本。YOLO是You Only Look Once的缩写,意味着只需要一次前向传递就可以完成目标检测任务,因此具有非常快的检测速度和较高的精度。

相比于YOLOv4,YOLOv5在多个方面进行了改进和优化,包括更快的训练速度、更高的精度、更小的模型体积等。以下是YOLOv5的一些特点:

  1. 更快的训练速度

YOLOv5采用了一种新的训练方法,称为Scaled-YOLOv4,在不降低模型精度的情况下加快了模型的训练速度。此外,YOLOv5还采用了一种新的数据增强方法,称为Mosaic Data Augmentation,可以提高模型的鲁棒性和泛化能力。

  1. 更高的精度

YOLOv5在模型结构和训练过程中都进行了优化,使得模型的精度得到了显著提升。此外,YOLOv5还采用了一种新的测试方法,称为Ensemble Anchors,可以进一步提高模型的精度。

  1. 更小的模型体积

YOLOv5通过一系列的轻量化技术,如网络剪枝、特征金字塔结构、网络宽度和深度、轻量级正则化、轻量级激活函数和知识蒸馏等,成功实现了模型的轻量化。这使得YOLOv5的模型体积得到了显著压缩,可以更好地适应不同的场景和设备。

  1. 更多的应用场景

YOLOv5可以应用于许多不同的场景,如智能交通、智能安防、智能农业、无人驾驶、机器人等。此外,YOLOv5还可以适应不同的设备,如CPU、GPU、TPU等,可以在不同的硬件平台上实现高效的目标检测。

总的来说,YOLOv5是一个非常优秀的目标检测算法,具有更快的训练速度、更高的精度、更小的模型体积和更广泛的应用场景,可以为实际应用带来更多的价值。

为了让模型更加轻量化,Yolov5采用了一系列有效的技术,主要包括以下几个方面:

  1. 卷积核剪枝

卷积核剪枝是一种常用的轻量化技术,它通过删除不重要的卷积核来减少模型参数数量。在Yolov5中,可以使用剪枝算法来删除一些不重要的卷积核。具体来说,可以使用Taylor Expansion方法来评估卷积核的重要性,然后删除一些重要性较低的卷积核,从而减少模型的大小。另外,还可以使用动态剪枝技术来根据具体情况动态地剪枝一些卷积核,以适应不同的场景和设备。

  1. 特征金字塔结构

特征金字塔结构是一种常用的图像处理技术,它可以提取不同大小的特征图像,从而适应不同的场景和目标。在Yolov5中,采用了一种特殊的特征金字塔结构,可以在保持高精度的同时减少模型的大小和计算量。具体来说,Yolov5使用了CSP(cross-stage partial)结构,该结构可以通过将不同层级的特征图进行拼接,从而减少网络的深度和计算量。此外,CSP结构还可以有效地提高模型的精度和速度。

  1. 网络宽度和深度

网络的宽度和深度是影响模型大小和性能的重要因素。在Yolov5中,可以通过调整网络宽度和深度来减少模型的大小和计算量。可以采用不同的网络结构来适应不同的场景和设备。例如,可以采用浅层网络来适应低端设备,而采用深层网络来适应高端设备。此外,还可以使用不同的卷积核大小和步幅来调整网络宽度和深度。

  1. 轻量级正则化

正则化是一种用于控制模型复杂度和避免过拟合的技术。在Yolov5中,可以采用轻量级正则化技术来减少模型的大小和计算量。具体来说,可以使用Group Normalization(GN)等轻量级正则化方法来控制模型复杂度和提高模型的精度和速度。GN可以减少Batch Normalization(BN)所需的内存和计算量,并且可以在训练时使用大的batch size,从而提高模型的训练效率。

  1. 激活函数

激活函数是神经网络中非常重要的一部分,它可以为模型引入非线性因素,并提高模型的表达能力。在Yolov5中,可以通过使用轻量级激活函数来减少模型的大小和计算量。具体来说,可以采用Mish等激活函数来代替常用的ReLU激活函数。Mish激活函数不仅可以提高模型的精度和速度,还可以减少模型的大小和计算量。

  1. 知识蒸馏

知识蒸馏是一种有效的模型压缩技术,它可以通过将一个大的模型的知识迁移到一个小的模型中,来减少模型的大小和计算量。在Yolov5中,可以采用知识蒸馏技术来减少模型的大小和计算量。具体来说,可以将一个大的Yolov5模型的知识迁移到一个小的Yolov5模型中,从而获得一个轻量化的Yolov5模型。

总的来说,Yolov5通过一系列有效的轻量化技术,如卷积核剪枝、特征金字塔结构、网络宽度和深度、轻量级正则化、轻量级激活函数和知识蒸馏等,成功实现了模型的轻量化。这使得Yolov5能够适应不同的场景和设备,提高模型的性能和效率。

欢迎关注、点赞、评论!

YOLOX改进之模型轻量化(Lite)

文章内容:给YOLOv5-Lite系列轻量级模型换上YOLOX头部
环境:pytorch1.7+cuda11.0
注意:YOLOv5版本为5.0,可以匹配YOLOX的主干网络与neck部分

一、参考资料

参考资料1

YOLOv5-Lite
代码链接https://github.com/ppogg/YOLOv5-Lite
文章链接https://blog.csdn.net/weixin_45829462/article/details/119767896?spm=1001.2014.3001.5502

参考资料2
YOLOv5-YOLOX(yolov5代码风格复现版):
代码链接https://gitee.com/SearchSource/yolov5_yolox
文章链接https://www.yuque.com/yerunyuan/ar9831/tsm0id#Kfi4w

参考资料3
YOLOX原理解析(大白老师版):https://zhuanlan.zhihu.com/p/397993315

二、代码修改位置

运行代码:YOLOv5-YOLOX版本(把YOLOv5-Lite改进代码移过来更方便)
YOLOv5-Lite:(先让改进的Lite代码在YOLOv5-YOLOX版本上运行起来)
1、移动YOLOv5-Lite中模型结构改进代码(位于common.py中)
2、修改yolo.py代码,添加新的yaml模型文件读取模块(如:RepVGG等,位于300多行),可以参考YOLOv5代码修改。
YOLOv5-Lite各系列性能
(图来自https://github.com/ppogg/YOLOv5-Lite)

YOLOX_s-Lite
(在改进的Lite模型上更换YOLOX-s头部,包括c、e、g、s)
很简单,直接添加和简略修改,仔细观察yolox.yaml文件格式,对应修改,yoloxs的头部通道为128;其次保证yolox.py代码中通道为128(33行左右)。yaml文件修改如下图:

YOLOX_nano-Lite
(在改进的Lite模型上更换YOLOX-s头部,包括e、s)
修改位置同上,yaml文件的head通道均改成64;以及yolox.py代码(33行左右)head通道修改为64,如下图:

三、运行代码命令

# 命令:
# 一、v5系列改进
# v5Lite-c:(8.66M)
python train.py  --img-size 640  --data PCB.yaml --cfg models/v5Lite-c.yaml --hyp data/hyps/hyp.scratch.yaml --weights v5lite-c.pt --batch-size 8 --epochs 1 --device 0

# v5Lite-e:(1.62M)
python train.py  --img-size 640  --data PCB.yaml --cfg models/v5Lite-e.yaml --hyp data/hyps/hyp.scratch.yaml --weights v5lite-e.pt --batch-size 8 --epochs 1 --device 0

# v5Lite-g:(10.7M)
python train.py  --img-size 640  --data PCB.yaml --cfg models/v5Lite-g.yaml --hyp data/hyps/hyp.scratch.yaml --weights v5lite-g.pt --batch-size 8 --epochs 1 --device 0

# v5Lite-s:(3.25M)
python train.py  --img-size 640  --data PCB.yaml --cfg models/v5Lite-s.yaml --hyp data/hyps/hyp.scratch.yaml --weights v5lite-s.pt --batch-size 8 --epochs 1 --device 0


# 二、yolox及改进系列:

# yoloxs-office(纯silu,数据增强、精度与官网接近)(17.2M)
python train.py --noautoanchor --img-size 640  --data PCB.yaml --cfg models/yoloxs_official.yaml --hyp data/hyps/hyp.scratch.yolox.official.yaml --weights yolox-s.pt --batch-size 8 --epochs 1 --device 0

# yoloxs_rslu(激活函数:relu+silu,且数据增强有所更改,权重不变,推理速度加快,由于激活函数改变,精度稍微降低)(17.2M)
python train.py --noautoanchor --img-size 640  --data PCB.yaml --cfg models/yoloxs_rslu.yaml --hyp data/hyps/hyp.scratch.yolox.yaml --weights yolox-s.pt --batch-size 8 --epochs 1 --device 0

# yoloxs(激活函数:纯silu,且数据增强有所更改,权重不变,修改后训练速度加快,精度与官网接近)(17.2M)
python train.py --noautoanchor --img-size 640  --data PCB.yaml --cfg models/yoloxs.yaml --hyp data/hyps/hyp.scratch.yolox.yaml --weights yolox-s_rslu.pt --batch-size 8 --epochs 1 --device 0


# 【改进1】:前面v5的改进换上了yoloxs(头部通道为128)的head,anchor_free锚框机制

# yoloxs_Lite-c:(12.1M)
python train.py --noautoanchor --img-size 640  --data PCB.yaml --cfg models/yoloxs_Lite_c.yaml --hyp data/hyps/hyp.scratch.yolox.yaml --weights v5lite-c.pt --batch-size 8 --epochs 1 --device 0

# yoloxs_Lite-e:(5.04M)
python train.py --noautoanchor --img-size 640  --data PCB.yaml --cfg models/yoloxs_Lite_e.yaml --hyp data/hyps/hyp.scratch.yolox.yaml --weights v5lite-e.pt --batch-size 8 --epochs 1 --device 0

# yoloxs_Lite-g:(14.2M)
python train.py --noautoanchor --img-size 640  --data PCB.yaml --cfg models/yoloxs_Lite_g.yaml --hyp data/hyps/hyp.scratch.yolox.yaml --weights v5lite-g.pt --batch-size 8 --epochs 1 --device 0

# yoloxs_Lite-s:(6.70M)
python train.py --noautoanchor --img-size 640  --data PCB.yaml --cfg models/yoloxs_Lite_s.yaml --hyp data/hyps/hyp.scratch.yolox.yaml --weights v5lite-s.pt --batch-size 8 --epochs 1 --device 0


# 【改进2】:e和s系列换上了yolox-nano(头部通道为64)的head
# yoloxnano_Lite-e:(2.46M)
python train.py --noautoanchor --img-size 640  --data PCB.yaml --cfg models/yoloxnano_Lite_e.yaml --hyp data/hyps/hyp.scratch.yolox.yaml --weights v5lite-e.pt --batch-size 8 --epochs 1 --device 0

# yoloxnano_Lite-s:(4.10M)
python train.py --noautoanchor --img-size 640  --data PCB.yaml --cfg models/yoloxnano_Lite_s.yaml --hyp data/hyps/hyp.scratch.yolox.yaml --weights v5lite-s.pt --batch-size 8 --epochs 1 --device 0

注意】:预训练权重不是lite给的,也能进行训练,上面PCB.yaml就是自己的训练数据集内容。数据集制作与训练可以参考:https://blog.csdn.net/weixin_45679938/article/details/118803745
使用心得】:
1、在我的数据集上,yoloxs-lite-g精度与yolox齐平,高于yolov5有2个点,并且模型大小与yolov5差不多大,模型大小减少了3.2M,其他的没有进行测试,换头后应该都会有提升,毕竟YOLOX相对于v5的改进就在头部;
2、在这个上面添加另外一些trick,如注意力机制、CIOU等,精度有提升(200epoch以上),而相应改进用于官方代码没有提升(原因不明);
3、这边修改模型结构相比官方代码更为简便。

已修改的代码百度网盘链接:(包含v5-Lite系列权重)
链接:https://pan.baidu.com/s/1UfuJWdpkvSvTtjlsDgzLlA
提取码:b718

写的比较急,不喜勿喷,有错误恳求批评指正!

以上是关于YOLOV5-模型轻量化的一些常见方法的主要内容,如果未能解决你的问题,请参考以下文章

《模型轻量化-剪枝蒸馏量化系列》YOLOv5无损剪枝(附源码)

《模型轻量化-剪枝蒸馏量化系列》YOLOv5无损剪枝(附源码)

《模型轻量化-剪枝蒸馏量化系列》YOLOv5无损剪枝(附源码)

YOLOX改进之模型轻量化(Lite)

魔改YOLOv5-6.x(上)结合轻量化网络Shufflenetv2Mobilenetv3和Ghostnet

知识蒸馏轻量化模型架构剪枝…几种深度学习模型压缩方法