点击上方“3D视觉车间,选择星标
第一时间送达干货
【引言】 开始准备写作yolov5 ncnn int8量化教程,但在yolov5的量化遇到了麻烦。一方面,量化后速度较慢,另一方面,精度严重下降全屏都是检测框。经过多次尝试,最终以失败告终。
后来,我决定改变其他方式yolov5量化,即使是最小的yolov5s模型量化后可以加速,但还是不能满足我对速度的需求。第二,对于Focus层,无论使用哪个向前推理框架,都应添加额外的对Focus层的拼接操作对我来说太麻烦了。
于是,我对yolov5.做了一系列轻量化的改变,使他的网络结构更加简洁,可以真正加速(比如arm结构系列树莓派至少可以加速三倍;x86架构的inter处理器也可以加速一倍左右):
详见模型结构:ShuffleNetV2-Yolov5 更轻更快易于部署的yolov5
这个博客还是接下来的yolov量化工作,对yolov5进行ncnn部署和量化。本文版权属于GiantPandaCV,未经许可请勿转载
主要工具有两种:
ncnn推理框架 地址链接:https://github.com/Tencent/ncnn
shufflev2-yolov5.源代码和权重 地址链接:https://github.com/ppogg/shufflev2-yolov5
模型性能如下:
关于ncnn在线编译和安装教程很多,但推荐linux环境运行,window也可以,但是可能会踩很多坑。
gitclonehttps://github.com/ppogg/shufflev2-yolov5.git pythonmodels/export.py--weightsweights/yolov5ss.pt--img640--batch1 python-monnxsimweights/yolov5ss.onnxweights/yolov5ss-sim.onnx
这个过程一般都很顺利~
./onnx2ncnnyolov5ss-sim.onnxyolov5ss.paramyolov5ss.bin ./ncnnoptimizeyolov5ss.paramyolov5ss.binyolov5ss-opt.paramyolov5ss-opt.bin65536
这个过程还是不会卡,提取顺利,这个时候就有了fp32,fp一共有四个模型:
为了实现动态尺寸图像处理,需要对yolov5ss-opt.param的reshape操作进行修改:
把以上三处reshape统一改为-1:
不需要改变其他地方。
ncnn官方的yolov5.cpp两个地方需要修改
anchor信息是在 models/yolov5ss-1.0.yaml,根据自己的数据收集类别anchor进行对应的修改:
输出层ID在Permute层内还需要相应的修改:
修改后如下:
此时,修改的地方只有以上几点,Focus层代码也可看个人情况移除,重新make可以检测。
还有,不要问为什么三轮车检测不到。coco数据集有三轮车吗?
更详细的教程可以参考我的知乎博客yolov4-tiny这篇文章不会讨论很多细节(下面附链接)。
这里需要补充几点:
请使用验证表数据集coco_val5000张数据集;
mean和val在原来的训练模型中,需要与设定的值保持一致yolov5ss.cpp还需要保持一致;
验证过程相对较长,请耐心等待
运行代码:
findimages/-typef>imagelist.txt ./ncnn2tableyolov5ss-opt.paramyolov5ss-opt.binimagelist.txtyolov5ss.tablemean=[104,117,123]norm=[0.017,0.017,0.017]shape=[640,640,3]pixel=BGRthread=8method=kl ./ncnn2int8yolov5ss-opt.paramyolov5ss-opt.binyolov5ss-opt-int8.paramyolov5ss-opt-int8.binyolov5ss.table
量化模型如下:
量化后的模型尺寸约为1.7m左右,应该能满足你对小模型大小的强迫症;
此时,量化后可以使用shufflev2-yolov5模型检测:
除前三次预热外,树莓派温度为45°以上,测试模型并量化模型benchmark如下:
#第四次 pi@raspberrypi:~/Downloads/ncnn/build/benchmark$./benchncnn840 loop_count=8 num_threads=4 powersave=0 gpu_device=-1 cooling_down=1 shufflev2-yolov5min=90.86max=93.53avg=91.56 shufflev2-yolov5-int8min=83.15max=84.17avg=83.65 shufflev2-yolov5-416min=154.51max=155.59avg=155.09 yolov4-tinymin=298.94max=302.47avg=300.69 &bsp;nanodet_m min = 86.19 max = 142.79 avg = 99.61
squeezenet min = 59.89 max = 60.75 avg = 60.41
squeezenet_int8 min = 50.26 max = 51.31 avg = 50.75
mobilenet min = 73.52 max = 74.75 avg = 74.05
mobilenet_int8 min = 40.48 max = 40.73 avg = 40.63
mobilenet_v2 min = 72.87 max = 73.95 avg = 73.31
mobilenet_v3 min = 57.90 max = 58.74 avg = 58.34
shufflenet min = 40.67 max = 41.53 avg = 41.15
shufflenet_v2 min = 30.52 max = 31.29 avg = 30.88
mnasnet min = 62.37 max = 62.76 avg = 62.56
proxylessnasnet min = 62.83 max = 64.70 avg = 63.90
efficientnet_b0 min = 94.83 max = 95.86 avg = 95.35
efficientnetv2_b0 min = 103.83 max = 105.30 avg = 104.74
regnety_400m min = 76.88 max = 78.28 avg = 77.46
blazeface min = 13.99 max = 21.03 avg = 15.37
googlenet min = 144.73 max = 145.86 avg = 145.19
googlenet_int8 min = 123.08 max = 124.83 avg = 123.96
resnet18 min = 181.74 max = 183.07 avg = 182.37
resnet18_int8 min = 103.28 max = 105.02 avg = 104.17
alexnet min = 162.79 max = 164.04 avg = 163.29
vgg16 min = 867.76 max = 911.79 avg = 889.88
vgg16_int8 min = 466.74 max = 469.51 avg = 468.15
resnet50 min = 333.28 max = 338.97 avg = 335.71
resnet50_int8 min = 239.71 max = 243.73 avg = 242.54
squeezenet_ssd min = 179.55 max = 181.33 avg = 180.74
squeezenet_ssd_int8 min = 131.71 max = 133.34 avg = 132.54
mobilenet_ssd min = 151.74 max = 152.67 avg = 152.32
mobilenet_ssd_int8 min = 85.51 max = 86.19 avg = 85.77
mobilenet_yolo min = 327.67 max = 332.85 avg = 330.36
mobilenetv2_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
本文仅做学术分享,如有侵权,请联系删文。
在「3D视觉工坊」公众号后台回复:即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。
在「3D视觉工坊」公众号后台回复:即可下载包括等。
在「3D视觉工坊」公众号后台回复:即可下载独家学习课件与视频网址;后台回复:即可下载独家学习课件与视频网址。
扫码添加小助手微信,可
也可申请加入我们的细分方向交流群,目前主要有、、、、、等微信群。
一定要备注:
▲长按加微信群或投稿
▲长按关注公众号
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、可答疑解惑、助你高效解决问题