NCNN+Int8+yolov5部署和量化
点击上方“3D视觉工坊”,选择“星标”
干货第一时间送达
【引言】 刚开始准备写yolov5+ncnn+int8量化的教程,却在yolov5的量化上遇到了麻烦,一方面是量化后速度更慢了,另一方面是精度下降严重,出现满屏都是检测框的现象,后来经过很多尝试,最终都以失败告终。
再后来,还是决定换其他方式对yolov5进行量化,一是即使最小的yolov5s模型量化后能提速,依旧满足不了我对速度的需求,二是对于Focus层,不管使用哪个向前推理框架,要额外添加对Focus层的拼接操作对我来说过于繁琐。
于是,我对yolov5做了一系列轻量化的改动,让他网络结构更加简洁,也能够实打实的提速(例如arm架构系列的树莓派,至少能提速三倍;x86架构的inter处理器也能提速一倍左右):
模型结构详见:ShuffleNetV2-Yolov5 更轻更快易于部署的yolov5
这篇博客,还是接着上一篇yolov4量化的工作,对yolov5进行ncnn的部署和量化。本文版权属于GiantPandaCV,未经允许请勿转载
一、环境准备
主要需要的工具有两样:
ncnn推理框架 地址链接:https://github.com/Tencent/ncnn
shufflev2-yolov5的源码和权重 地址链接:https://github.com/ppogg/shufflev2-yolov5
模型性能如下:
关于ncnn的编译和安装,网上的教程很多,但是推荐在linux环境下运行,window也可以,但可能踩的坑比较多。
二、onnx模型提取
git clone https://github.com/ppogg/shufflev2-yolov5.git
python models/export.py --weights weights/yolov5ss.pt --img 640 --batch 1
python -m onnxsim weights/yolov5ss.onnx weights/yolov5ss-sim.onnx
这过程一般都很顺利~
三、转化为ncnn模型
./onnx2ncnn yolov5ss-sim.onnx yolov5ss.param yolov5ss.bin
./ncnnoptimize yolov5ss.param yolov5ss.bin yolov5ss-opt.param yolov5ss-opt.bin 65536
这个过程依旧不会卡点,很顺利就提取完了,此时就有包含fp32,fp16,一共是4个模型:
为了实现动态尺寸图片处理,需要对yolov5ss-opt.param的reshape操作进行修改:
把以上三处reshape的尺度统统改成-1:
其他地方无需改动。
四、后处理修改
ncnn官方的yolov5.cpp需要修改两处地方
anchor信息是在 models/yolov5ss-1.0.yaml,需要根据自己的数据集聚类后的anchor进行对应的修改:
输出层ID在Permute层里边,也需要进行相应的修改:
修改后如下:
此时,修改的地方只有以上几点,Focus层代码也可看个人情况移除,重新make就可以进行检测。
fp16的模型检测效果如下:
还有,不要再问为什么三轮车检测不出来了。。你家coco数据集有三轮车是吗。。
五、Int8量化
更加详细的教程可以参考本人知乎博客关于yolov4-tiny的教程,很多细节的东西本篇不会累述(下方附链接)。
这里需要补充几点:
校验表数据集请使用coco_val那5000张数据集;
mean和val的数值需要和原先自己训练模型时候设定的数值保持一致,在yolov5ss.cpp里也需要保持一致;
校验过程比较漫长,请耐心等候
运行代码:
find images/ -type f > imagelist.txt
./ncnn2table yolov5ss-opt.param yolov5ss-opt.bin imagelist.txt yolov5ss.table mean=[104,117,123] norm=[0.017,0.017,0.017] shape=[640,640,3] pixel=BGR thread=8 method=kl
./ncnn2int8 yolov5ss-opt.param yolov5ss-opt.bin yolov5ss-opt-int8.param yolov5ss-opt-int8.bin yolov5ss.table
量化后的模型如下:
量化后的模型大小大概在1.7m左右,应该可以满足你对小模型大小的强迫症;
此时,可以使用量化后的shufflev2-yolov5模型进行检测:
量化后的精度略有损失,但还是在可接受范围内。模型在量化后不可能精度完全不下降,对于大尺度特征明显的目标,shufflev2-yolov5对此类目标的score可以保持不变(其实还是会下降一丢丢),但对于远距离的小尺度目标,score会下降10%-30%不等,没办法的事,所以请理性看待该模型。
除去前三次预热,树莓派温度温度在45°以上,对模型进行测试,量化后的benchmark如下:
# 第四次
pi@raspberrypi:~/Downloads/ncnn/build/benchmark $ ./benchncnn 8 4 0
loop_count = 8
num_threads = 4
powersave = 0
gpu_device = -1
cooling_down = 1shufflev2-yolov5 min = 90.86 max = 93.53 avg = 91.56
shufflev2-yolov5-int8 min = 83.15 max = 84.17 avg = 83.65
shufflev2-yolov5-416 min = 154.51 max = 155.59 avg = 155.09yolov4-tiny min = 298.94 max = 302.47 avg = 300.69nanodet_m min = 86.19 max = 142.79 avg = 99.61squeezenet min = 59.89 max = 60.75 avg = 60.41squeezenet_int8 min = 50.26 max = 51.31 avg = 50.75mobilenet min = 73.52 max = 74.75 avg = 74.05mobilenet_int8 min = 40.48 max = 40.73 avg = 40.63mobilenet_v2 min = 72.87 max = 73.95 avg = 73.31mobilenet_v3 min = 57.90 max = 58.74 avg = 58.34shufflenet min = 40.67 max = 41.53 avg = 41.15shufflenet_v2 min = 30.52 max = 31.29 avg = 30.88mnasnet min = 62.37 max = 62.76 avg = 62.56proxylessnasnet min = 62.83 max = 64.70 avg = 63.90efficientnet_b0 min = 94.83 max = 95.86 avg = 95.35efficientnetv2_b0 min = 103.83 max = 105.30 avg = 104.74regnety_400m min = 76.88 max = 78.28 avg = 77.46blazeface min = 13.99 max = 21.03 avg = 15.37googlenet min = 144.73 max = 145.86 avg = 145.19googlenet_int8 min = 123.08 max = 124.83 avg = 123.96resnet18 min = 181.74 max = 183.07 avg = 182.37resnet18_int8 min = 103.28 max = 105.02 avg = 104.17alexnet min = 162.79 max = 164.04 avg = 163.29vgg16 min = 867.76 max = 911.79 avg = 889.88vgg16_int8 min = 466.74 max = 469.51 avg = 468.15resnet50 min = 333.28 max = 338.97 avg = 335.71resnet50_int8 min = 239.71 max = 243.73 avg = 242.54squeezenet_ssd min = 179.55 max = 181.33 avg = 180.74squeezenet_ssd_int8 min = 131.71 max = 133.34 avg = 132.54mobilenet_ssd min = 151.74 max = 152.67 avg = 152.32mobilenet_ssd_int8 min = 85.51 max = 86.19 avg = 85.77mobilenet_yolo min = 327.67 max = 332.85 avg = 330.36mobilenetv2_yolov3 min = 221.17 max = 224.84 avg = 222.60
大约可以提速5-10%左右,手上没有rv和rk系列的板子,所以其他板子的测试就需要社区的朋友进行测试了~
至于之前的yolov5s为什么量化后速度变慢,甚至精度下降严重,唯一的解释就出在了Focus层,这玩意稍微对不齐就很容易崩,也比较费脑,索性移除了。
六、总结
本文提出shufflev2-yolov5的部署和量化教程;
剖析了之前yolov5s之所以量化容易崩坏的原因;
ncnn的fp16模型对比原生torch模型精度可保持不变;
[上图,左为torch原模型,右为fp16模型]
ncnn的int8模型精度会略微下降,速度在树莓派上仅能提升5-10%,其他板子暂未测试;
[上图,左为torch原模型,右为int8模型]
项目地址:https://github.com/ppogg/shufflev2-yolov5
2021年08月20日更新:
本人已经完成了Android版本的适配
这是本人的红米手机,处理器为高通骁龙730G,检测的效果如下:
这是量化后的int8模型检测效果:
户外场景检测:
七、参考
【1】nihui:详细记录u版YOLOv5目标检测ncnn实现
【2】pogg:NCNN+Int8+YOLOv4量化模型和实时推理
【3】pogg:ncnn+opencv+yolov5调用摄像头进行检测
【4】https://github.com/ultralytics/yolov5
本文仅做学术分享,如有侵权,请联系删文。
下载1
在「3D视觉工坊」公众号后台回复:3D视觉,即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。
下载2
在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总,即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。
下载3
在「3D视觉工坊」公众号后台回复:相机标定,即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配,即可下载独家立体匹配学习课件与视频网址。
重磅!3DCVer-学术论文写作投稿 交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。
同时也可申请加入我们的细分方向交流群,目前主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。
一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。
▲长按加微信群或投稿
▲长按关注公众号
3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、orb-slam3等视频课程)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、可答疑解惑、助你高效解决问题
觉得有用,麻烦给个赞和在看~
NCNN+Int8+yolov5部署和量化相关推荐
- YOLOv5-Lite:NCNN+Int8部署和量化,树莓派也可实时
本文版权属于GiantPandaCV,未经允许请勿转载 前言: 还记得我在两个月前写的文章吗,关于yolov4-tiny+ncnn+int8量化的详细教程: https://zhuanlan.zhih ...
- NCNN+Int8+YOLOv4量化模型和实时推理
注:本文转载于https://zhuanlan.zhihu.com/p/372278785,作者pengtougu,计算机研二硕士. 一.前言 2021年5月7日,腾讯优图实验室正式推出了ncnn新版 ...
- 使用ncnn在树莓派部署自己的yolov5lites模型
使用ncnn在树莓派部署自己的yolov5lites模型 文章目录 使用ncnn在树莓派部署自己的yolov5lites模型 前言 一.windows10上训练自己的yolov5lites模型 1 下 ...
- jetson nano yolov5部署及USB摄像头实时检测 初次尝试
(1条消息) Jetson nano部署Yolov5 --从烧录到运行 1:1复刻全过程_IamYZD的博客-CSDN博客_jetson nano部署yolov5 1.yolov5部署 学校发的板子不 ...
- Yolov5部署TensorRT加速
Yolov5部署TensorRT加速 一.软件安装 1.安装Visual Studio 2017 2.安装CUDA11.0 3.安装cudnn8.0.5 4.安装Opencv3.4.0 5.安装Ten ...
- 38、静默活体检测测试及ncnn、mnn部署
基本思想:因为最近需要搞个Android端的活体检测,github了一下,git到小视科技公司的一个开源项目,听了大佬的介绍,因此测试了一下,效果还可以,于是进行了模型转换和ncnn.mnn部署 本实 ...
- 【YOLOv5】LabVIEW+TensorRT的yolov5部署实战(含源码)
文章目录 前言 一.关于YOLOv5 二.YOLOv5模型的获取 1.下载源码 2.安装模块 3.下载预训练模型 4.转换为onnx模型 三.LabVIEW+TensorRT的yolov5部署实战(y ...
- 凑个热闹之美团 YOLOv6 ORT/MNN/TNN/NCNN C++推理部署
↑ 点击蓝字 关注人工智能与算法学习 作者丨DefTruth@知乎(已经过作者同意转载) 来源丨https://zhuanlan.zhihu.com/p/533643238 编辑丨极市平台 导读 本文 ...
- 美团 YOLOv6 ORT/MNN/TNN/NCNN C++推理部署
0. 前言 昨天美团开源了YOLOv6,又是一个YOLO系列的新作.此时距离YOLOX开源差不多刚好一年的时间.之前捏过很多YOLO系列的推理例子,比如YOLOv3.YOLOv4.YOLOv5.YOL ...
最新文章
- linux卸载kodi,如何在Ubuntu上安装Kodi 18 Beta
- 企业应用程序部署在iOS 7.1上不起作用
- Firefox 修改User Agent
- 【EntityFramework 6.1.3】个人理解与问题记录
- 如何正确入门Windows系统下驱动开发领域?
- 牛客第二场 G.League of Legends-单调队列优化dp
- linux标准I/O——标准I/O介绍
- MyBatis+Oracle实现主键自增长
- 自写函数的防抖和节流
- 程序员分析了 50 万条拼多多商品数据,告诉你到底是消费升级还是降级!
- 浏览器的同源策略与跨域问题的解决方案
- UNIX系统编程小结(三)----进程相关
- stm32 某个io引脚不能拉高_【stm32f407】IO引脚复用和映射
- 金蝶k3服务器维护,金蝶k3如何远程客服服务器
- 实践教程 | 万字长文,值得收藏/参考的OpenCV C++基础代码
- 使用 stm32实现锂电充电_12V锂电池保护板电路图锂电池保护板工作原理及短路、过充电等控制原理分析...
- 豪华气派!这些院校的图书馆也太美了!
- matlab计算方阵对应特征值的特征向量
- BNUZ自动打卡系统
- 设计一个名为 MyRectangle 的矩形类来表示矩形
热门文章
- 年终盘点跨平台技术(Hybrid、RN、Weex、Flutter)-全栈系列
- Linux从入门到放弃 k8s 安装部署
- 蓝光光盘的区域位置代码
- java工程积累——saas之multi-tenancy解析
- 微型公司小团队对软件项目开发管理和规范化的思考
- linux下查找占空间大的文件,Linux中查找当前目录下占用空间最大的前10个文件
- Codeforces Round #322 (Div. 2) B. Luxurious Houses 水题
- EXCEL类十字拖拽操作上千条数据的技巧
- VUE element ui 动态合并单元格问题
- 小议移动订货之南北厂商