文章图片
注:本文转载于https://zhuanlan.zhihu.com/p/372278785,作者pengtougu,计算机研二硕士。
一、前言 2021年5月7日,腾讯优图实验室正式推出了ncnn新版本,这一版本的贡献毫无疑问,又是对arm系列的端侧推理一大推动,先剖出nihui大佬博客上关于新版ncnn的优化点:
继续保持优秀的接口稳定性和兼容性
- API接口完全不变
- 量化校准table完全不变
- int8模型量化流程完全不变(重点是这个!!!之前对tensorflow框架一直不感冒,很大一部分源于tensorflow每更新一次版本,就杀死一片上一版本的接口,可能上了2.0以后这种情况好了很多,不过依旧训练是torch用的更多)
- 支持 kl aciq easyquant 三种量化策略
- 支持多输入的模型量化
- 支持RGB/RGBA/BGR/BGRA/GRAY输入的模型量化
- 大幅改善多线程效率
- 离线进行(反量化-激活-量化)->(requantize)融合,实现端到端量化推理
https://zhuanlan.zhihu.com/p/370689914
二、新版ncnn的int8量化初探 趁着这股热风,赶紧试下新版ncnn量化版int8(更重要的原因是月底要中期答辩了,毕设还没搞完,赶紧跑跑大佬的库,顺带嫖一波)
2.1 安装编译ncnn
话不多说,在跑库前先安装编译好需要的环境,安装和编译过程可以看我的另一条博客:
https://zhuanlan.zhihu.com/p/368653551
2.2 yolov4-tiny量化int8
- 在量化前,先不要着急,我们先看看ncnn的wiki,看下量化前需要做什么工作:
wiki中:为了支持int8模型在移动设备上的部署,我们提供了通用的训练后量化工具,可以将float32模型转换为int8模型。
也就是说,在进行量化前,我们需要yolov4-tiny.bin和yolov4-tiny.param这两个权重文件,因为想快速测试int8版本的性能,这里就不把yolov4-tiny.weights转yolov4-tiny.bin和yolov4-tiny.param的步骤写出来了,大家上model.zoo去嫖下这两个opt文件:
https://github.com/nihui/ncnn-assets/tree/master/models
- 接着,按照步骤使用编译好的ncnn对两个模型进行优化:
./ncnnoptimize yolov4-tiny.param yolov4-tiny.bin yolov4-tiny-opt.param yolov4-tiny.bin 0
如果是直接上model.zoo下的两个opt文件,可以跳过这一步。
- 下载校准表图像
https://download.csdn.net/download/weixin_45829462/18704213
这里给大家设置的是免费下载,如果后续被官方修改了下载积分,那就么得办法啦(好人的微笑.jpg)
文章图片
- 制作校准表文件
find images/ -type f > imagelist.txt
window下,打开Git Bash(没有的同学自行百度安装,这个工具是真的好用),切换到切换到和images同个文件夹的根目录下,也是直接上面的命令行:
文章图片
生成所需的list.txt列表,格式如下:
文章图片
接着继续输入命令:
./ncnn2table yolov4-tiny-opt.param yolov4-tiny-opt.bin imagelist.txt yolov4-tiny.table mean=[104,117,123] norm=[0.017,0.017,0.017] shape=[224,224,3] pixel=BGR thread=8 method=kl
其中,上述所包含变量含义如下:
mean平均值和norm范数是您传递给的值 Mat::substract_mean_normalize() shape形状是模型的斑点形状
pixel是模型的像素格式,图像像素将在转换为这种类型之前 Extractor::input()
thread线程是可用于并行推理的CPU线程数(这个要根据自己电脑或者板子的性能自己定义) 方法是训练后量化算法,目前支持kl和aciq
- 量化模型
./ncnn2int8 yolov4-tiny-opt.param yolov4-tiny-opt.bin yolov4-tiny-int8.param yolov4-tiny-int8.bin yolov4-tiny.table
直接一步走,所有量化的工具在ncnn\build-vs2019\tools\quantize文件夹下
文章图片
找不到的大哥请看下自己编译过程是不是有误,正常编译下是会有这些量化文件的
运行成功后会生成两个int8的文件,分别是:
文章图片
对比一下原来的两个opt模型,小了整整一倍!
三、新版ncnn的int8量化再探 量化出了int8模型仅仅是成功了一半,有模型但是内部参数全都错乱的情况也不是没见过。。。
文章图片
- 调用int8模型进行推理
https://zhuanlan.zhihu.com/p/368653551
大家直接去ncnn\examples文件夹下copy一下yolov4.cpp的代码(一个字!嫖!)
但是我在这里却遇到了点问题,因为一直搞不懂大佬主函数写的传参是什么,在昨晚复习完教资后搞到了好晚。。。
int main(int argc, char** argv)
{
cv::Mat frame;
std::vector
果然大佬就是大佬,写的代码高深莫测,我只是一个小白,好难
文章图片
靠,第二天直接不看了,重新写了一个main函数,调用大佬写的那几个function:
int main(int argc, char** argv)
{
cv::Mat frame;
std::vector
还有几点注意,大家在进行推理的时候
把fp16禁掉,不用了具体如下:
换成int8推理
把线程改成你之前制作int8模型的那个线程
模型也替换掉
文章图片
走到这里,就可以愉快的推理了
文章图片
四、总结 说一下我的电脑配置,神舟笔记本K650D-i5,处理器InterCorei5-4210M,都是相对过时的老机器了,毕竟买了6年,性能也在下降。
跑库过程全程用cpu,为什么不用gpu?(问的好,2g显存老古董跑起来怕电脑炸了)
对比之前的fp16模型,明显在input_size相同的情况下快了40%-70%,且精度几乎没有什么损耗
总结来说,新版ncnn的int8量化推理确实是硬货,后续会尝试更多模型的int8推理,做对比实验给各位网友看
所有的文件和修改后的代码放在这个仓库里,欢迎大家白嫖:
https://github.com/pengtougu/ncnn-yolov4-int8
感兴趣的朋友可以git clone下载跑跑,即下即用(前提要安装好ncnn)~
【目标检测|NCNN+Int8+YOLOv4量化模型和实时推理】
文章图片
推荐阅读
- 深度学习|计算机视觉(七)(卷积神经网络(CNN))
- 剑指Offer|牛客网——python之剑指0ffer之67道在线编程——jz21-jz25
- 开发环境安装教程|Python安装教程()
- github|盘点 Github 上的高仿 app 项目,B站 微博 微信等等
- 自动化测试|jmeter使用心得(一)
- 程序人生|接口自动化测试之pytest用例管理框架
- 开源|从蚂蚁可信隐私计算开源框架“隐语”看隐私计算发展挑战
- 项目实训|山东大学项目实训二——python+opencv实现人脸识别
- 人工智能|【人脸识别实战一】系统架构设计