YOLOv5-Lite:更轻、更快、更易于部署
对yolov5进行一系列消融实验,使其更轻量(更小的Flops、更低的内存和更少的参数)、更快速(添加shuffle channel、yolov5 head用于channel减少。在Raspberry Pi 4B上输入320×320的帧时可以推理至少10+ FPS)以及更易于部署(移除Focus层和四个切片操作,将模型量化精度降低到可接受范围)。
消融实验结果比较
ID | 模型 | 输入尺寸 | Flops | 参数 | 大小(M) | Map@0.5 | Map@.5:0.95 |
---|---|---|---|---|---|---|---|
001 | yolo-fastest | 320×320 | 0.25G | 0.35M | 1.4 | 24.4 | - |
002 | YOLOv5-Litee我们的 | 320×320 | 0.73G | 0.78M | 1.7 | 35.1 | - |
003 | NanoDet-m | 320×320 | 0.72G | 0.95M | 1.8 | - | 20.6 |
004 | yolo-fastest-xl | 320×320 | 0.72G | 0.92M | 3.5 | 34.3 | - |
005 | YOLOXNano | 416×416 | 1.08G | 0.91M | 7.3(fp32) | - | 25.8 |
006 | yolov3-tiny | 416×416 | 6.96G | 6.06M | 23.0 | 33.1 | 16.6 |
007 | yolov4-tiny | 416×416 | 5.62G | 8.86M | 33.7 | 40.2 | 21.7 |
008 | YOLOv5-Lites我们的 | 416×416 | 1.66G | 1.64M | 3.4 | 42.0 | 25.2 |
009 | YOLOv5-Litec我们的 | 512×512 | 5.92G | 4.57M | 9.2 | 50.9 | 32.5 |
010 | NanoDet-EfficientLite2 | 512×512 | 7.12G | 4.71M | 18.3 | - | 32.6 |
011 | YOLOv5s(6.0) | 640×640 | 16.5G | 7.23M | 14.0 | 56.0 | 37.2 |
012 | YOLOv5-Liteg我们的 | 640×640 | 15.6G | 5.39M | 10.9 | 57.6 | 39.1 |
参见wiki: https://github.com/ppogg/YOLOv5-Lite/wiki/Test-the-map-of-models-about-coco
不同平台上的比较
设备 | 计算后端 | 系统 | 输入 | 框架 | v5lite-e | v5lite-s | v5lite-c | v5lite-g | YOLOv5s |
---|---|---|---|---|---|---|---|---|---|
Inter | @i5-10210U | window(x86) | 640×640 | openvino | - | - | 46ms | - | 131ms |
Nvidia | @RTX 2080Ti | Linux(x86) | 640×640 | torch | - | - | - | 15ms | 14ms |
红米K30 | @骁龙730G | Android(armv8) | 320×320 | ncnn | 27ms | 38ms | - | - | 163ms |
小米10 | @骁龙865 | Android(armv8) | 320×320 | ncnn | 10ms | 14ms | - | - | 163ms |
树莓派4B | @ARM Cortex-A72 | Linux(arm64) | 320×320 | ncnn | - | 84ms | - | - | 371ms |
树莓派4B | @ARM Cortex-A72 | Linux(arm64) | 320×320 | mnn | - | 71ms | - | - | 356ms |
AXera-Pi | Cortex A7@CPU 3.6TOPs @NPU | Linux(arm64) | 640×640 | axpi | - | - | - | 22ms | 22ms |
在树莓派4B上实现15FPS的教程:
https://zhuanlan.zhihu.com/p/672633849
- 以上是4线程测试基准
- 树莓派4B启用bf16s优化,树莓派64位操作系统
QQ交流群:993965802
入群答案:剪枝 或 蒸馏 或 量化 或 低秩分解(任意其一均可)
·模型库·
@v5lite-e:
模型 | 大小 | 骨干网络 | 头部 | 框架 | 设计用于 |
---|---|---|---|---|---|
v5Lite-e.pt | 1.7m | shufflenetv2(旷视) | v5Litee-head | Pytorch | Arm-cpu |
v5Lite-e.bin v5Lite-e.param | 1.7m | shufflenetv2 | v5Litee-head | ncnn | Arm-cpu |
v5Lite-e-int8.bin v5Lite-e-int8.param | 0.9m | shufflenetv2 | v5Litee-head | ncnn | Arm-cpu |
v5Lite-e-fp32.mnn | 3.0m | shufflenetv2 | v5Litee-head | mnn | Arm-cpu |
v5Lite-e-fp32.tnnmodel v5Lite-e-fp32.tnnproto | 2.9m | shufflenetv2 | v5Litee-head | tnn | arm-cpu |
v5Lite-e-320.onnx | 3.1m | shufflenetv2 | v5Litee-head | onnxruntime | x86-cpu |
@v5lite-s:
模型 | 大小 | 骨干网络 | 头部 | 框架 | 设计用于 |
---|---|---|---|---|---|
v5Lite-s.pt | 3.4m | shufflenetv2(旷视) | v5Lites-head | Pytorch | Arm-cpu |
v5Lite-s.bin v5Lite-s.param | 3.3m | shufflenetv2 | v5Lites-head | ncnn | Arm-cpu |
v5Lite-s-int8.bin v5Lite-s-int8.param | 1.7m | shufflenetv2 | v5Lites-head | ncnn | Arm-cpu |
v5Lite-s.mnn | 3.3m | shufflenetv2 | v5Lites-head | mnn | Arm-cpu |
v5Lite-s-int4.mnn | 987k | shufflenetv2 | v5Lites-head | mnn | Arm-cpu |
v5Lite-s-fp16.bin v5Lite-s-fp16.xml | 3.4m | shufflenetv2 | v5Lites-head | openvivo | x86-cpu |
v5Lite-s-fp32.bin v5Lite-s-fp32.xml | 6.8m | shufflenetv2 | v5Lites-head | openvivo | x86-cpu |
v5Lite-s-fp16.tflite | 3.3m | shufflenetv2 | v5Lites-head | tflite | arm-cpu |
v5Lite-s-fp32.tflite | 6.7m | shufflenetv2 | v5Lites-head | tflite | arm-cpu |
v5Lite-s-int8.tflite | 1.8m | shufflenetv2 | v5Lites-head | tflite | arm-cpu |
v5Lite-s-416.onnx | 6.4m | shufflenetv2 | v5Lites-head | onnxruntime | x86-cpu |
@v5lite-c:
模型 | 大小 | 骨干网络 | 头部 | 框架 | 设计用于 |
---|---|---|---|---|---|
v5Lite-c.pt | 9m | PPLcnet(百度) | v5s-head | Pytorch | x86-cpu / x86-vpu |
v5Lite-c.bin v5Lite-c.xml | 8.7m | PPLcnet | v5s-head | openvivo | x86-cpu / x86-vpu |
v5Lite-c-512.onnx | 18m | PPLcnet | v5s-head | onnxruntime | x86-cpu |
@v5lite-g:
模型 | 大小 | 骨干网络 | 头部 | 框架 | 设计用于 |
---|---|---|---|---|---|
v5Lite-g.pt | 10.9m | Repvgg(清华) | v5Liteg-head | Pytorch | x86-gpu / arm-gpu / arm-npu |
v5Lite-g-int8.engine | 8.5m | Repvgg-yolov5 | v5Liteg-head | Tensorrt | x86-gpu / arm-gpu / arm-npu |
v5lite-g-int8.tmfile | 8.7m | Repvgg-yolov5 | v5Liteg-head | Tengine | arm-npu |
v5Lite-g-640.onnx | 21m | Repvgg-yolov5 | yolov5-head | onnxruntime | x86-cpu |
v5Lite-g-640.joint | 7.1m | Repvgg-yolov5 | yolov5-head | axpi | arm-npu |
下载链接:
|──────
ncnn-fp16
: | 百度网盘 | 谷歌云盘 |
|──────ncnn-int8
: | 百度网盘 | 谷歌云盘 |
|──────mnn-e_bf16
: | 谷歌云盘 |
|──────mnn-d_bf16
: | 谷歌云盘|
└──────onnx-fp32
: | 百度网盘 | 谷歌云盘 ||──────
ncnn-fp16
: | 百度网盘 | 谷歌云盘 |
|──────ncnn-int8
: | 百度网盘 | 谷歌云盘 |
└──────tengine-fp32
: | 百度网盘 | 谷歌云盘 |└──────
openvino-fp16
: | [百度网盘](https://pan.baidu.com/s/18p8HAyGJdmo2h 训练集和测试集分布(路径中包含xx.jpg)
train: ../coco/images/train2017/
val: ../coco/images/val2017/
├── images # xx.jpg 示例
│ ├── train2017
│ │ ├── 000001.jpg
│ │ ├── 000002.jpg
│ │ └── 000003.jpg
│ └── val2017
│ ├── 100001.jpg
│ ├── 100002.jpg
│ └── 100003.jpg
└── labels # xx.txt 示例
├── train2017
│ ├── 000001.txt
│ ├── 000002.txt
│ └── 000003.txt
└── val2017
├── 100001.txt
├── 100002.txt
└── 100003.txt
自动标注工具
链接:https://github.com/ppogg/AutoLabelImg
你可以使用基于YOLOv5-5.0和YOLOv5-Lite的LabelImg进行自动标注,biubiubiu 🚀 🚀 🚀
模型仓库
这里整理并存储了YOLOv5的原始组件和YOLOv5-Lite的复现组件,在模型仓库中:
热力图分析
$ python main.py --type all
更新中...
如何部署
ncnn 用于arm-cpu
mnn 用于arm-cpu
openvino x86-cpu或x86-vpu
tensorrt(C++) 用于arm-gpu或arm-npu或x86-gpu
tensorrt(Python) 用于arm-gpu或arm-npu或x86-gpu
Android 用于arm-cpu
Android演示
这是一台红米手机,处理器为骁龙730G,使用yolov5-lite进行检测。性能如下:
链接:https://github.com/ppogg/YOLOv5-Lite/tree/master/android_demo/ncnn-android-v5lite
Android_v5Lite-s:https://drive.google.com/file/d/1CtohY68N2B9XYuqFLiTp-Nd2kuFWgAUR/view?usp=sharing
Android_v5Lite-g:https://drive.google.com/file/d/1FnvkWxxP_aZwhi000xjIuhJ_OhqOUJcj/view?usp=sharing
新安卓应用:[链接] https://pan.baidu.com/s/1PRhW4fI1jq8VboPyishcIQ [关键词] pogg
更详细的解释
详细模型链接:
什么是YOLOv5-Lite S/E模型: 知乎链接(中文):https://zhuanlan.zhihu.com/p/400545131
什么是YOLOv5-Lite C模型: 知乎链接(中文):https://zhuanlan.zhihu.com/p/420737659
什么是YOLOv5-Lite G模型: 知乎链接(中文):https://zhuanlan.zhihu.com/p/410874403
如何在ncnn上使用fp16或int8部署: CSDN链接(中文):https://blog.csdn.net/weixin_45829462/article/details/119787840
如何在mnn上使用fp16或int8部署: 知乎链接(中文):https://zhuanlan.zhihu.com/p/672633849
如何在onnxruntime上部署: 知乎链接(中文):https://zhuanlan.zhihu.com/p/476533259(旧版本)
如何在tensorrt上部署: 知乎链接(中文):https://zhuanlan.zhihu.com/p/478630138
如何在tensorrt上优化: 知乎链接(中文):https://zhuanlan.zhihu.com/p/463074494
参考
https://github.com/ultralytics/yolov5
https://github.com/megvii-model/ShuffleNet-Series
https://github.com/Tencent/ncnn
引用YOLOv5-Lite
如果你在研究中使用了YOLOv5-Lite,请引用我们的工作并给一个星标⭐:
@misc{yolov5lite2021,
title = {YOLOv5-Lite: Lighter, faster and easier to deploy},
author = {Xiangrong Chen and Ziman Gong},
doi = {10.5281/zenodo.5241425}
year={2021}
}