{"id":13643084,"url":"https://github.com/Gumpest/YOLOv5-Multibackbone-Compression","last_synced_at":"2025-04-20T21:32:45.999Z","repository":{"id":38396960,"uuid":"421427811","full_name":"Gumpest/YOLOv5-Multibackbone-Compression","owner":"Gumpest","description":"YOLOv5 Series Multi-backbone(TPH-YOLOv5, Ghostnet, ShuffleNetv2, Mobilenetv3Small, EfficientNetLite, PP-LCNet, SwinTransformer YOLO), Module(CBAM, DCN), Pruning (EagleEye, Network Slimming), Quantization (MQBench) and Deployment (TensorRT, ncnn) Compression Tool Box.","archived":false,"fork":false,"pushed_at":"2022-04-29T19:35:20.000Z","size":2903,"stargazers_count":995,"open_issues_count":54,"forks_count":202,"subscribers_count":12,"default_branch":"main","last_synced_at":"2024-11-09T14:41:12.125Z","etag":null,"topics":["cbam","eagleeye","efficientnetlite-yolov5","ghostnet-yolov5","mobilenetv3small-yolov5","mqbench","ncnn","network-slimming","pplcnet","shufflenetv2-yolov5","swin-transformer","tensorrt","tph-yolov5"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Gumpest.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-10-26T13:05:12.000Z","updated_at":"2024-11-04T20:16:53.000Z","dependencies_parsed_at":"2022-07-11T19:23:58.280Z","dependency_job_id":null,"html_url":"https://github.com/Gumpest/YOLOv5-Multibackbone-Compression","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gumpest%2FYOLOv5-Multibackbone-Compression","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gumpest%2FYOLOv5-Multibackbone-Compression/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gumpest%2FYOLOv5-Multibackbone-Compression/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gumpest%2FYOLOv5-Multibackbone-Compression/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Gumpest","download_url":"https://codeload.github.com/Gumpest/YOLOv5-Multibackbone-Compression/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249965547,"owners_count":21352925,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cbam","eagleeye","efficientnetlite-yolov5","ghostnet-yolov5","mobilenetv3small-yolov5","mqbench","ncnn","network-slimming","pplcnet","shufflenetv2-yolov5","swin-transformer","tensorrt","tph-yolov5"],"created_at":"2024-08-02T01:01:41.243Z","updated_at":"2025-04-20T21:32:45.429Z","avatar_url":"https://github.com/Gumpest.png","language":"Python","funding_links":[],"categories":["Lighter and Deployment Frameworks"],"sub_categories":[],"readme":"# YOLOv5-Compression\r\n\r\n![](https://img.shields.io/badge/Update-News-blue.svg?style=plastic)\r\n\r\n2021.10.30 复现TPH-YOLOv5\r\n\r\n2021.10.31 完成替换backbone为Ghostnet\r\n\r\n2021.11.02 完成替换backbone为Shufflenetv2\r\n\r\n2021.11.05 完成替换backbone为Mobilenetv3Small\r\n\r\n2021.11.10 完成EagleEye对YOLOv5系列剪枝支持\r\n\r\n2021.11.14 完成MQBench对YOLOv5系列量化支持\r\n\r\n2021.11.16 完成替换backbone为EfficientNetLite-0\r\n\r\n2021.11.26 完成替换backbone为PP-LCNet-1x\r\n\r\n2021.12.12 完成SwinTrans-YOLOv5（C3STR）\r\n\r\n2021.12.15 完成Slimming对YOLOv5系列剪枝支持\r\n\r\n## Requirements\r\n\r\n```shell\r\npip install -r requirements.txt\r\n```\r\n\r\n## Multi-Backbone Substitution for YOLOs\r\n\r\n### 1、Base Model\r\n\r\nTrain on Visdrone DataSet (*Input size is 608*)\r\n\r\n| No.  | Model   | mAP  | mAP@50 | Parameters(M) | GFLOPs |\r\n| ---- | ------- | ---- | ------ | ------------- | ------ |\r\n| 1    | YOLOv5n | 13.0 | 26.20  | 1.78          | 4.2    |\r\n| 2    | YOLOv5s | 18.4 | 34.00  | 7.05          | 15.9   |\r\n| 3    | YOLOv5m | 21.6 | 37.80  | 20.91         | 48.2   |\r\n| 4    | YOLOv5l | 23.2 | 39.70  | 46.19         | 108.1  |\r\n| 5    | YOLOv5x | 24.3 | 40.80  | 86.28         | 204.4  |\r\n\r\n### 2、Higher Precision Model\r\n\r\n#### A、TPH-YOLOv5 ![](https://img.shields.io/badge/Model-BeiHangUni-yellowgreen.svg?style=plastic)\r\n\r\nTrain on Visdrone DataSet (*6-7 size is 640，8 size is 1536*)\r\n\r\n| No.  | Model          | mAP  | mAP@50 | Parameters(M) | GFLOPs |\r\n| ---- | -------------- | ---- | ------ | ------------- | ------ |\r\n| 6    | YOLOv5xP2      | 30.0 | 49.29  | 90.96         | 314.2  |\r\n| 7    | YOLOv5xP2 CBAM | 30.1 | 49.40  | 91.31         | 315.1  |\r\n| 8    | YOLOv5x-TPH    | 40.7 | 63.00  | 112.97        | 270.8  |\r\n\r\n###### Usage：\r\n\r\n```shell\r\nnohup python train.py --data VisDrone.yaml --weights yolov5n.pt --cfg models/yolov5n.yaml --epochs 300 --batch-size 8 --img 608 --device 0,1 --sync-bn \u003e\u003e yolov5n.txt \u0026\r\n```\r\n\r\n###### Composition：\r\n\r\n**P2 Head、CBAM、TPH、BiFPN、SPP**\r\n\r\n\u003cimg src=\"https://github.com/Gumpest/YOLOv5-Multibackbone-Compression/blob/main/img/TPH-YOLOv5.png\" alt=\"TPH-YOLOv5\" width=\"600px\" height=\"300px\" /\u003e\r\n\r\n1、TransBlock的数量会根据YOLO规模的不同而改变，标准结构作用于YOLOv5m\r\n\r\n2、当YOLOv5x为主体与标准结构的区别是：（1）首先去掉14和19的CBAM模块（2）降低与P2关联的通道数（128）（3）在输出头之前会添加SPP模块，注意SPP的kernel随着P的像素减小而减小（4）在CBAM之后进行输出（5）只保留backbone以及最后一层输出的TransBlock（6）采用BiFPN作为neck\r\n\r\n3、更改不同Loss分支的权重：如下图，当训练集的分类与置信度损失还在下降时，验证集的分类与置信度损失开始反弹，说明出现了过拟合，需要降低这两个任务的权重\r\n\r\n消融实验如下：\r\n\r\n| box  | cls  | obj  | acc       |\r\n| ---- | ---- | ---- | --------- |\r\n| 0.05 | 0.5  | 1.0  | 37.90     |\r\n| 0.05 | 0.3  | 0.7  | **38.00** |\r\n| 0.05 | 0.2  | 0.4  | 37.5      |\r\n\r\n\u003cimg src=\"https://github.com/Gumpest/YOLOv5-Multibackbone-Compression/blob/main/img/image-20211109150606998.png\" alt=\"loss\" width=\"600px\" /\u003e\r\n\r\n#### B、SwinTrans-YOLOv5![](https://img.shields.io/badge/Model-Microsoft-yellow.svg?style=plastic)\r\n\r\n```shell\r\npip install timm\r\n```\r\n\r\n###### Usage：\r\n\r\n```shell\r\npython train.py --data VisDrone.yaml --weights yolov5x.pt --cfg models/accModels/yolov5xP2CBAM-Swin-BiFPN-SPP.yaml --hyp data/hyps/hyp.visdrone.yaml --epochs 60 --batch-size 4 --img 1536 --nohalf\r\n```\r\n\r\n（1）Window size由***7***替换为检测任务常用分辨率的公约数***8***\r\n\r\n（2）create_mask封装为函数，由在init函数执行变为在forward函数执行\r\n\r\n（3）若分辨率小于window size或不是其公倍数时，在其右侧和底部Padding\r\n\r\n*debug：在计算完之后需要反padding回去，否则与cv2支路的img_size无法对齐*\r\n\r\n（4）forward函数前后对输入输出reshape\r\n\r\n（5）验证C3STR时，需要手动关闭默认模型在half精度下验证（*--nohalf*）\r\n\r\n### 3、Slighter Model\r\n\r\nTrain on Visdrone DataSet (*1 size is 608，2-6 size is 640*)\r\n\r\n| No   | Model                     | mAP       | mAP@50 | Parameters(M) | GFLOPs   | TrainCost(h) | Memory Cost(G) | PT File                                                      | FPS@CPU |\r\n| ---- | ------------------------- | --------- | ------ | ------------- | -------- | ------------ | -------------- | ------------------------------------------------------------ | ------- |\r\n| 1    | YOLOv5l                   | 23.2      | 39.7   | 46.19         | 108.1    |              |                |                                                              |         |\r\n| 2    | YOLOv5l-GhostNet          | 18.4      | 33.8   | 24.27         | 42.4     | 27.44        | 4.97           | [PekingUni Cloud](https://disk.pku.edu.cn:443/link/35BD905E65DE091E2A58316B20BBE775) |         |\r\n| 3    | YOLOv5l-ShuffleNetV2      | 16.48     | 31.1   | 21.27         | 40.5     | 10.98        | 2.41           | [PekingUni Cloud](https://disk.pku.edu.cn:443/link/A5ED89B7B190FCF1C8187A0A8AF20C4F) |         |\r\n| 4    | YOLOv5l-MobileNetv3Small  | 16.55     | 31.2   | **20.38**     | **38.4** | **10.19**    | 5.30           | [PekingUni Cloud](https://disk.pku.edu.cn:443/link/EE375ED30AAD3F2B3FA5055DD6F4964C) |         |\r\n| 5    | YOLOv5l-EfficientNetLite0 | **19.12** | **35** | 23.01         | 43.9     | 13.94        | 2.04           | [PekingUni Cloud](https://disk.pku.edu.cn:443/link/45E65A080C4574036EE274B7BD83B7EA) |         |\r\n| 6    | YOLOv5l-PP-LCNet          | 17.63     | 32.8   | 21.64         | 41.7     | 18.52        | **1.66**       | [PekingUni Cloud](https://disk.pku.edu.cn:443/link/7EBE07BA6D7985C7053BF0A8F2591464) |         |\r\n\r\n#### A、GhostNet-YOLOv5 ![](https://img.shields.io/badge/Model-HuaWei-orange.svg?style=plastic)\r\n\r\n\u003cimg src=\"https://github.com/Gumpest/YOLOv5-Multibackbone-Compression/blob/main/img/GhostNet.jpg\" alt=\"GhostNet\" width=\"500px\" height=\"250px\" /\u003e\r\n\r\n（1）为保持一致性，下采样的DW的kernel_size均等于3\r\n\r\n（2）neck部分与head部分沿用YOLOv5l原结构\r\n\r\n（3）中间通道人为设定（expand）\r\n\r\n#### B、ShuffleNetV2-YOLOv5 ![](https://img.shields.io/badge/Model-Megvii-orange.svg?style=plastic)\r\n\r\n\u003cimg src=\"https://github.com/Gumpest/YOLOv5-Multibackbone-Compression/blob/main/img/Shffulenet.png\" alt=\"Shffulenet\" width=\"400px\" /\u003e\r\n\r\n（1）Focus Layer不利于芯片部署，频繁的slice操作会让缓存占用严重\r\n\r\n（2）避免多次使用C3 Leyer以及高通道的C3 Layer（违背G1与G3准则）\r\n\r\n（3）中间通道不变\r\n\r\n#### C、MobileNetv3Small-YOLOv5 ![](https://img.shields.io/badge/Model-Google-orange.svg?style=plastic)\r\n\r\n\u003cimg src=\"https://github.com/Gumpest/YOLOv5-Multibackbone-Compression/blob/main/img/Mobilenetv3s.jpg\" alt=\"Mobilenetv3s\" width=\"500px\" /\u003e\r\n\r\n（1）原文结构，部分使用Hard-Swish激活函数以及SE模块\r\n\r\n（2）Neck与head部分嫁接YOLOv5l原结构\r\n\r\n（3）中间通道人为设定（expand）\r\n\r\n#### D、EfficientNetLite0-YOLOv5 ![](https://img.shields.io/badge/Model-Google-orange.svg?style=plastic)\r\n\r\n\r\n\u003cimg src=\"https://github.com/Gumpest/YOLOv5-Multibackbone-Compression/blob/main/img/efficientlite.jpg\" alt=\"efficientlite\" width=\"500px\" /\u003e\r\n\r\n（1）使用Lite0结构，且不使用SE模块\r\n\r\n（2）针对dropout_connect_rate，手动赋值(随着idx_stage变大而变大)\r\n\r\n（3）中间通道一律*6（expand）\r\n\r\n#### E、PP-LCNet-YOLOv5  ![](https://img.shields.io/badge/Model-Baidu-orange.svg?style=plastic)\r\n\r\n\r\n\u003cimg src=\"https://github.com/Gumpest/YOLOv5-Multibackbone-Compression/blob/main/img/PP-LCNet.png\" alt=\"PP-LCNet\" width=\"500px\" /\u003e\r\n\r\n\r\n（1）使用PP-LCNet-1x结构，在网络末端使用SE以及5*5卷积核\r\n\r\n（2）SeBlock压缩维度为原1/16\r\n\r\n（3）中间通道不变\r\n\r\n## Pruning for YOLOs\r\n\r\n| Model                | mAP  | mAP@50 | Parameters(M) | GFLOPs | FPS@CPU |\r\n| -------------------- | ---- | ------ | ------------- | ------ | ------- |\r\n| YOLOv5s              | 18.4 | 34     | 7.05          | 15.9   |         |\r\n| YOLOv5n              | 13   | 26.2   | 1.78          | 4.2    |         |\r\n| YOLOv5s-EagleEye@0.6 | 14.3 | 27.9   | 4.59          | 9.6    |         |\r\n\r\n### 1、Prune Strategy\r\n\r\n（1）基于YOLOv5块状结构设计，对Conv、C3、SPP(F)模块进行剪枝，具体来说有以下：\r\n\r\n- Conv模块的输出通道数\r\n- C3模块中cv2块和cv3块的输出通道数\r\n- C3模块中若干个bottleneck中的cv1块的输出通道数\r\n\r\n（2）八倍通道剪枝（outchannel = 8*n）\r\n\r\n（3）ShortCut、concat皆合并剪枝\r\n\r\n### 2、Prune Tools\r\n\r\n#### （1）EagleEye\r\n\r\n[EagleEye: Fast Sub-net Evaluation for Efficient Neural Network Pruning](https://arxiv.org/abs/2007.02491)\r\n\r\n基于搜索的通道剪枝方法，核心思想是随机搜索到大量符合目标约束的子网，然后快速更新校准BN层的均值与方差参数，并在验证集上测试校准后全部子网的精度。精度最高的子网拥有最好的架构，经微调恢复后能达到较高的精度。\r\n\r\n![eagleeye](https://github.com/Cydia2018/YOLOv5-Multibackbone-Compression/blob/main/img/eagleeye.png)\r\n\r\n##### Usage\r\n\r\n1. 正常训练模型\r\n\r\n```shell\r\npython train.py --data data/VisDrone.yaml --imgsz 640 --weights yolov5s.pt --cfg models/prunModels/yolov5s-pruning.yaml --device 0\r\n```\r\n\r\n（注意训练其他模型，参考/prunModels/yolov5s-pruning.yaml进行修改，目前已支持v6架构）\r\n\r\n2. 搜索最优子网\r\n\r\n```shell\r\npython pruneEagleEye.py --weights path_to_trained_yolov5_model --cfg models/prunModels/yolov5s-pruning.yaml --data data/VisDrone.yaml --path path_to_pruned_yolov5_yaml --max_iter maximum number of arch search --remain_ratio the whole FLOPs remain ratio --delta 0.02\r\n```\r\n\r\n3. 微调恢复精度\r\n\r\n```shell\r\npython train.py --data data/VisDrone.yaml --imgsz 640 --weights path_to_Eaglepruned_yolov5_model --cfg path_to_pruned_yolov5_yaml --device 0\r\n```\r\n\r\n#### （2）Network Slimming\r\n\r\n[Learning Efficient Convolutional Networks through Network Slimming](https://openaccess.thecvf.com/content_ICCV_2017/papers/Liu_Learning_Efficient_Convolutional_ICCV_2017_paper.pdf)\r\n\r\n##### Usage\r\n\r\n1. 模型BatchNorm Layer \\gamma 稀疏化训练\r\n\r\n```shell\r\npython train.py --data data/VisDrone.yaml --imgsz 640 --weights yolov5s.pt --cfg models/prunModels/yolov5s-pruning.yaml --device 0 --sparse\r\n```\r\n\r\n（注意训练其他模型，参考/prunModels/yolov5s-pruning.yaml进行修改，目前已支持v6架构）\r\n\r\n2. BatchNorm Layer剪枝\r\n\r\n```shell\r\npython pruneSlim.py --weights path_to_sparsed_yolov5_model --cfg models/prunModels/yolov5s-pruning.yaml --data data/VisDrone.yaml --path path_to_pruned_yolov5_yaml --global_percent 0.6 --device 3\r\n```\r\n\r\n3. 微调恢复精度\r\n\r\n```shell\r\npython train.py --data data/VisDrone.yaml --imgsz 640 --weights path_to_Slimpruned_yolov5_model --cfg path_to_pruned_yolov5_yaml --device 0\r\n```\r\n\r\n## Quantize Aware Training for YOLOs\r\n\r\n MQBench是实际硬件部署下评估量化算法的框架，进行各种适合于硬件部署的量化训练（QAT）\r\n\r\n### Requirements\r\n\r\n- PyTorch == 1.8.1\r\n\r\n### Install MQBench Lib ![](https://img.shields.io/badge/Tec-Sensetime-brightgreen.svg?style=plastic)\r\n\r\n由于MQBench目前还在不断更新，选择0.0.2稳定版本作为本仓库的量化库。\r\n\r\n```shell\r\ngit clone https://github.com/ZLkanyo009/MQBench.git\r\ncd MQBench\r\npython setup.py build\r\npython setup.py install\r\n```\r\n\r\n### Usage\r\n\r\n训练脚本实例：\r\n\r\n```shell\r\npython train.py --data VisDrone.yaml --weights yolov5n.pt --cfg models/yolov5n.yaml --epochs 300 --batch-size 8 --img 608 --nosave --device 0,1 --sync-bn --quantize --BackendType NNIE\r\n```\r\n\r\n## Deploy\r\n目前已支持TensorRT及NCNN部署，详见[YOLOv5-Multibackbone-Compression/deploy](https://github.com/Gumpest/YOLOv5-Multibackbone-Compression/blob/main/deploy)\r\n\r\n## To do\r\n\r\n- [x] Multibackbone: MobileNetV3-small\r\n- [x] Multibackbone: ShuffleNetV2\r\n- [x] Multibackbone: GhostNet\r\n- [x] Multibackbone: EfficientNet-Lite0\r\n- [x] Multibackbone: PP-LCNet\r\n- [x] Multibackbone: TPH-YOLOv5\r\n- [x] Module: SwinTrans（C3STR）\r\n- [ ] Module: Deformable Convolution\r\n- [x] Pruner: Network Slimming\r\n- [x] Pruner: EagleEye\r\n- [ ] Pruner: OneShot (L1, L2, FPGM), ADMM, NetAdapt, Gradual, End2End\r\n- [x] Quantization: MQBench\r\n- [ ] Knowledge Distillation\r\n\r\n## Acknowledge\r\n\r\n感谢TPH-YOLOv5作者Xingkui Zhu \r\n\r\n官方实现[cv516Buaa/tph-yolov5 (github.com)](https://github.com/cv516Buaa/tph-yolov5)\r\n\r\n感谢[ZJU-lishuang/yolov5_prune: yolov5剪枝，支持v2,v3,v4,v6版本的yolov5 (github.com)](https://github.com/ZJU-lishuang/yolov5_prune)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGumpest%2FYOLOv5-Multibackbone-Compression","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FGumpest%2FYOLOv5-Multibackbone-Compression","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGumpest%2FYOLOv5-Multibackbone-Compression/lists"}