锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

NCNN+Int8+yolov5部署和量化

时间:2023-11-30 04:07:02 传感器889

点击上方“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也可以,但是可能会踩很多坑。

二、onnx模型提取

gitclonehttps://github.com/ppogg/shufflev2-yolov5.git pythonmodels/export.py--weightsweights/yolov5ss.pt--img640--batch1 python-monnxsimweights/yolov5ss.onnxweights/yolov5ss-sim.onnx  

这个过程一般都很顺利~

三、转化为ncnn模型

./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可以检测。

fp模型检测效果如下:

还有,不要问为什么三轮车检测不到。coco数据集有三轮车吗?

五、Int8量化

更详细的教程可以参考我的知乎博客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模型检测:

量化后的精度略有损失,但仍在可接受范围内。对于具有明显大规模特征的目标,模型量化后不能完全降低精度,shufflev2-yolov5对此类目标score它可以保持不变(事实上,它仍然会下降),但对于远距离的小尺度目标,score会下降10%-30%,没办法,请理性看待模型。

除前三次预热外,树莓派温度为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

本文仅做学术分享,如有侵权,请联系删文。

下载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天内无条件退款

 圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章