windows MNN 的使用流程(Python版)
MNN的文档有中文
https://www.yuque.com/mnn/cn/about
除了部分细节, 按照文档基本没啥问题,本文部分内容基本也是拆解文档
目前windows支持的Python版本:3.5、3.6、3.7
,用的时候再去这里确认下吧
https://www.yuque.com/mnn/cn/usage_in_python
1. Python 直接安装
安装很简单,直接pip就好
pip install -U pip -i https://mirror.baidu.com/pypi/simple
pip install -U MNN -i https://mirror.baidu.com/pypi/simple
安装完毕之后,在命令行输入
> mnn
mnn toolsets has following command line tools$mnnlist out mnn commands$mnnconvertconvert other model to mnn model$mnnquantquantize mnn model
这就安装成功了
mnnconvert
是用来做模型转化,
mnnquant
量化工具
按理说,安装完毕之后,命令行会有:
> mnnconvertUsage:MNNConvert [OPTION...]-h, --help Convert Other Model Format To MNN Model-v, --version show current version-f, --framework arg model type, ex: [TF,CAFFE,ONNX,TFLITE,MNN]--modelFile arg tensorflow Pb or caffeModel, ex:*.pb,*caffemodel--batch arg if model input's batch is not set, set as thebatch size you set--keepInputFormat keep input dimension format or not, default:false--optimizeLevel arg graph optimize option, 0: don't runoptimize(only support for MNN source), 1: use graphoptimize only for every input case is right, 2:normally right but some case may be wrong,default 1--optimizePrefer arg graph optimize option, 0 for normal, 1 forsmalleset, 2 for fastest--prototxt arg only used for caffe, ex: *.prototxt--MNNModel arg MNN model, ex: *.mnn--fp16 save Conv's weight/bias in half_float datatype--benchmarkModel Do NOT save big size data, such as Conv'sweight,BN's gamma,beta,mean and variance etc.Only used to test the cost of the model--bizCode arg MNN Model Flag, ex: MNN--debug Enable debugging mode.--forTraining whether or not to save training ops BN andDropout, default: false--weightQuantBits arg save conv/matmul/LSTM float weights to int8type, only optimize for model size, 2-8 bits,default: 0, which means no weight quant--weightQuantAsymmetric the default weight-quant uses SYMMETRIC quantmethod, which is compatible with old MNNversions. you can try set --weightQuantAsymmetricto use asymmetric quant method to improveaccuracy of the weight-quant model in some cases,but asymmetric quant model cannot run on oldMNN versions. You will need to upgrade MNN tonew version to solve this problem. default:false--compressionParamsFile argThe path of the compression parameters thatstores activation, weight scales and zeropoints for quantization or information forsparsity.--OP print framework supported op--saveStaticModel save static model with fix shape, default:false--targetVersion arg compability for old mnn engine, default: 1.2f--customOpLibs arg custom op libs ex: libmy_add.so;libmy_sub.so--authCode arg code for model authentication.--inputConfigFile arg set input config file for static model, ex:~/config.txt--alignDenormalizedValue argif 1, converter would align denormalizedfloat(|x| < 1.18e-38) as zero, because of inubuntu/protobuf or android/flatbuf, systembehaviors are different. default: 1, range: {0, 1}[10:15:46] @ 192: framework Invalid, use -f CAFFE/MNN/ONNX/TFLITE/TORCH !
如果命令行不能用,可以参考这个:
https://www.yuque.com/mnn/cn/usage_in_python
python(3) -m MNN.tools.mnn
python(3) -m MNN.tools.mnnconvert
python(3) -m MNN.tools.mnnquant
2. 转化
这里转化一下,将onnx转换为mnn模型
MNNConvert -f ONNX --modelFile output.onnx --MNNModel output.mnn --bizCode biz
加上 --fp
可以转换为半精度的模型,模型的大小比例近乎缩小一半:
MNNConvert -f ONNX --modelFile output.onnx --MNNModel output16.mnn --bizCode biz --fp16
半精度转换文档在这里:
https://www.yuque.com/mnn/cn/qxtz32
3. MNN 权值量化
这个之前没怎么用过,直接copy一下官方文档:
将模型中卷积的float权值量化为int8存储,推理时反量化还原为float权值进行计算。因此,其推理速度和float模型一致,但是模型大小可以减小到原来的1/4,可以通过模型转换工具一键完成,比较方便。推荐float模型性能够用,仅需要减少模型大小的场景使用。
使用MNNConvert.exe
(c++)或者mnnconvert
(python包中自带)进行转换,转换命令行中加上下述选项即可:
--weightQuantBits 8 [--weightQuantAsymmetric](可选)
--weightQuantAsymmetric
选项是指使用非对称量化方法,精度要比默认的对称量化精度好一些。
以上是直接用Python 命令行工具转换的,接下来是,编译转换工具的过程:
注意:实验证明,Python命令行工具mnnconvert
与 编译的转换工具MNNConvert.exe
效果相同,当然,可能在后续大版本有些不同
4. 编译 MNNConvert.exe
编译前需要 ninja
, cmake
和 VS2017/2019
cmake安装:
https://blog.csdn.net/HaoZiHuang/article/details/126015717
ninja 安装:
https://blog.csdn.net/HaoZiHuang/article/details/126083356
(ninja
是构建工具,比nmake更快)
安装VS之后,在编译过程中,命令行用x64 Native Tools Command Prompt
就好
编译具体过程参考文档:
https://www.yuque.com/mnn/cn/cvrt_windows
把 MNN git 下来,然后
cd MNN
mkdir build
cd build
cmake -G "Ninja" -DMNN_BUILD_SHARED_LIBS=OFF -DMNN_BUILD_CONVERTER=ON -DCMAKE_BUILD_TYPE=Release -DMNN_WIN_RUNTIME_MT=ON ..
ninja
之后会在目录下生成:MNNConvert.exe
该工具就是转换工具
5. 编译推理引擎
官方文档在:
https://www.yuque.com/mnn/cn/build_windows
由于编译后的引擎在当前版本无法被Python调用,所以如果不用C++,该部分直接跳过不用看
下载GPU Caps Viewer
,你可以通过这个工具来查看本机设备的详细信息(opencl、opengl、vulkan等)
在Github上有个issue:
编译的引擎如何用Python API调用:https://github.com/alibaba/MNN/issues/2010
官方回复是需要编译 pymnn, 目前文档还没出来,等官方更新吧
同时编译的时候需要 powershell
同时依旧需要VS的命令行x64 Native Tools Command Prompt
cd /path/to/MNN
powershell # 运行该命令从 cmd 环境进入 powershell 环境,后者功能更强大./schema/generate.ps1
如果出现:
PS xxxxxxxxxxxxxxxxxxxxxxxx> ./xx/xx.ps1
./xx/xx.ps1 : 无法加载文件
X:\XXXXXX\xxxxx.ps1,因为在此系统上禁止运行脚本。
有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170
中的 about_Execution_Policies。
所在位置 行:1 字符: 1
+ ./xx/xx.ps1
+ ~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo : SecurityError: (:) [],PSSecurityException+ FullyQualifiedErrorId : UnauthorizedAccess
可以参考这篇:
https://blog.csdn.net/HaoZiHuang/article/details/126088344
如果只需要 CPU 后端
# CPU, 64位编译
.\package_scripts\win\build_lib.ps1 -path MNN-CPU/lib/x64
# CPU, 32位编译
.\package_scripts\win\build_lib.ps1 -path MNN-CPU/lib/x86
如果需要 opencl 和 vulkan 后端
# CPU+OpenCL+Vulkan, 64位编译
.\package_scripts\win\build_lib.ps1 -path MNN-CPU-OPENCL/lib/x64 -backends "opencl,vulkan"
# CPU+OpenCL+Vulkan, 32位编译
.\package_scripts\win\build_lib.ps1 -path MNN-CPU-OPENCL/lib/x86 -backends "opencl,vulkan"
如果仅需要 opencl 后端
# CPU+OpenCL, 64位编译
.\package_scripts\win\build_lib.ps1 -path MNN-CPU-OPENCL/lib/x64 -backends opencl
# CPU+OpenCL, 32位编译
.\package_scripts\win\build_lib.ps1 -path MNN-CPU-OPENCL/lib/x86 -backends opencl
如果仅需要 vulkan 后端
# CPU+Vulkan, 64位编译
.\package_scripts\win\build_lib.ps1 -path MNN-CPU-OPENCL/lib/x64 -backends vulkan
# CPU+Vulkan, 32位编译
.\package_scripts\win\build_lib.ps1 -path MNN-CPU-OPENCL/lib/x86 -backends vulkan
具体都可以参考这些:
https://www.yuque.com/mnn/cn/build_windows
6. 验证安装是否成功
测试图片shiyuan.jpg
:
结果图片:
测试的mnn模型在这里下载:
https://download.csdn.net/download/HaoZiHuang/86337543
import numpy as np
import MNN
import cv2
import matplotlib.pyplot as pltdef normalize(im, mean=(0.5, 0.5, 0.5), std=(0.5, 0.5, 0.5)):im = im.astype(np.float32, copy=False) / 255.0im -= meanim /= stdreturn imif __name__ == "__main__":""" inference PPliteSeg using a specific picture """img = "shiyuan.jpg"interpreter = MNN.Interpreter("originalpool/output.mnn") # custompool originalpoolsession = interpreter.createSession()input_tensor = interpreter.getSessionInput(session)image = cv2.imread(img)image = cv2.resize(image, (224, 224))image = normalize(image)image = image.transpose((2, 0, 1))image = image.astype(np.float32) tmp_input = MNN.Tensor((1, 3, 224, 224), MNN.Halide_Type_Float,image, MNN.Tensor_DimensionType_Caffe)input_tensor.copyFrom(tmp_input)interpreter.runSession(session)output_tensor = interpreter.getSessionOutput(session)tmp_output = MNN.Tensor((1, 2, 224, 224), MNN.Halide_Type_Float, np.ones([1, 2, 224, 224]).astype(np.float32), MNN.Tensor_DimensionType_Caffe)output_tensor.copyToHostTensor(tmp_output) res = tmp_output.getNumpyData()[0]res = res.argmax(axis=0)plt.imshow(res)plt.show()
7.1 代码出现的问题
如果你自己的结果出现全1或者结果不对,可能就是我遇到的问题:
我的mnn模型是onnx模型导出来的,之前出现全1的结果,多次尝试发现,我的onnx模型输入是动态的,不是静态,所以出现这个问题
如果也是这个 onnx -> mnn 的情况,用下边儿这个脚本看看,是否是动态输入:
https://blog.csdn.net/HaoZiHuang/article/details/126168132
如果是动态输入,尝试将onnx模型修改为静态输入试试,如果四 Paddle模型转onnx模型,在Paddle2onnx工具后加添加 --input_shape_dict "{'x':[1,3,224,224]}"
Paddle2onnx工具命令使用指南在这里:
https://github.com/PaddlePaddle/Paddle2ONNX#命令行转换
7.2 结果图片杂乱无章
本来的结果图:
结果是酱紫:
可以参考该文章:
https://blog.csdn.net/HaoZiHuang/article/details/126136436
windows MNN 的使用流程(Python版)相关推荐
- 2020-11-08 Windows应用程序设计作业(Python版实现)(一)简单语法
Windows应用程序设计作业(Python版实现) 作业1-语法 1.任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1.请编 ...
- 2020-11-08 Windows应用程序设计作业(Python版实现)(五)综合作业 - 汉字版俄罗斯方块+2048
Windows应用程序设计作业(Python版实现) 作业5-综合作业 要求:在作业3的基础上,每个方块随机设置偏旁部首或简单汉字.方块下落停止后,改变俄罗斯方块的消除规则.规则定义为:如果相邻的块能 ...
- 通过noVNC远程连接Windows桌面详解(python版)
一.简介 1.VNC介绍 VNC (Virtual Network Console)是虚拟网络控制台的缩写.它 是一款优秀的远程控制工具软件.VNC 是在基于 UNIX 和 Linux 操作系统的免费 ...
- 中文领域最详细的Python版CUDA入门教程
本系列为英伟达GPU入门介绍的第二篇,主要介绍CUDA编程的基本流程和核心概念,并使用Python Numba编写GPU并行程序.为了更好地理解GPU的硬件架构,建议读者先阅读我的第一篇文章. GPU ...
- Windows下安装Z3的Python3版
文章目录 Windows下安装Z3的Python3版 pip 安装(不推荐,很慢) 使用微软官方构建好的DLL(推荐,快速) Windows下安装Z3的Python3版 GitHub官方仓库地址:Z3 ...
- windows 不安装jdk 运行 jar_新手必看。关于Python3——windows安装与运行(详细版)...
Python3 可应用于多平台 Windows.Linux 和 Mac OS X. windows就是我们现在常用的电脑系统 linux系统,程序员的天堂. mac OS X ,也就是苹果系统啦 Py ...
- Windows下Appium环境搭建(java版)
因为毕业后学过java,工作后服务端开发用的也基本都是java,所以对java比较熟悉,本篇文章暂时先介绍java版本的appium环境搭建,以后会陆续介绍python版的appium,包括环境搭建. ...
- pyDes 实现 Python 版的 DES 对称加密/解密--转
https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...
- *** Python版一键安装脚本
本脚本适用环境: 系统支持:CentOS 6,7,Debian,Ubuntu 内存要求:≥128M 日期:2018 年 02 月 07 日 关于本脚本: 一键安装 Python 版 *** 的最新版. ...
最新文章
- 通过邮箱验证注册——.net代码
- json-lib-2.1-jdk15.jar
- UICollectionView详解
- Sequence of component save EC and orderadm_h save
- 万字长文!剖析美团外卖持续交付的前世今生
- 利用SQL语言修正与撤销数据库
- Labview实现脉波调制( PDM )
- 2010-2020年全国poi兴趣点
- TFS使用指南——从服务器上获取最新的项目文件
- Java 对象的串行化(Serialization)
- Linux下的编辑器整理
- ps画画模糊笔刷_大量PS笔刷AI笔刷打包下载(超过1000款笔刷)
- python拼接sql语句字符串 无效字符,Python拼接SQL字符串的方法
- 最好的python视频教程_比较好的python视频教程
- Photoshop CC2019安装教程
- php实现迅雷链接的加密解密
- Scratch捡垃圾游戏 电子学会图形化编程scratch等级考试三级真题答案2019-12
- 概率神经网络(PNN)
- 华为Atlas张迪煊:在最好的时代,做最强AI算力底座
- 设计模式-简单总结(不涉及代码,有需要戳)
热门文章
- sx126x 与 sx127x 的区别
- ESP32-CAM、ESP8266、WIFI、蓝牙、单片机、热点创建嵌入式DNS服务器
- IIS部署Thinkphp网站
- 字节、KB、MB、GB 之间的换算关系 Bps和bps的区别
- 自己实现远程传输文件类
- 计算机用户注销后不见了,注销当前用户后 Win10找不到Administrator用户登录选项怎么解决?...
- python成语接龙源代码,基于Tkinter,带成语解释
- 深圳市文化创意产业百强(2011-2012)公示
- Python基础之占位符
- Windows Subsystem for Linux (WSL2) - WSL 的基本命令