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, cmakeVS2017/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版)相关推荐

  1. 2020-11-08 Windows应用程序设计作业(Python版实现)(一)简单语法

    Windows应用程序设计作业(Python版实现) 作业1-语法 1.任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1.请编 ...

  2. 2020-11-08 Windows应用程序设计作业(Python版实现)(五)综合作业 - 汉字版俄罗斯方块+2048

    Windows应用程序设计作业(Python版实现) 作业5-综合作业 要求:在作业3的基础上,每个方块随机设置偏旁部首或简单汉字.方块下落停止后,改变俄罗斯方块的消除规则.规则定义为:如果相邻的块能 ...

  3. 通过noVNC远程连接Windows桌面详解(python版)

    一.简介 1.VNC介绍 VNC (Virtual Network Console)是虚拟网络控制台的缩写.它 是一款优秀的远程控制工具软件.VNC 是在基于 UNIX 和 Linux 操作系统的免费 ...

  4. 中文领域最详细的Python版CUDA入门教程

    本系列为英伟达GPU入门介绍的第二篇,主要介绍CUDA编程的基本流程和核心概念,并使用Python Numba编写GPU并行程序.为了更好地理解GPU的硬件架构,建议读者先阅读我的第一篇文章. GPU ...

  5. Windows下安装Z3的Python3版

    文章目录 Windows下安装Z3的Python3版 pip 安装(不推荐,很慢) 使用微软官方构建好的DLL(推荐,快速) Windows下安装Z3的Python3版 GitHub官方仓库地址:Z3 ...

  6. windows 不安装jdk 运行 jar_新手必看。关于Python3——windows安装与运行(详细版)...

    Python3 可应用于多平台 Windows.Linux 和 Mac OS X. windows就是我们现在常用的电脑系统 linux系统,程序员的天堂. mac OS X ,也就是苹果系统啦 Py ...

  7. Windows下Appium环境搭建(java版)

    因为毕业后学过java,工作后服务端开发用的也基本都是java,所以对java比较熟悉,本篇文章暂时先介绍java版本的appium环境搭建,以后会陆续介绍python版的appium,包括环境搭建. ...

  8. pyDes 实现 Python 版的 DES 对称加密/解密--转

    https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...

  9. *** Python版一键安装脚本

    本脚本适用环境: 系统支持:CentOS 6,7,Debian,Ubuntu 内存要求:≥128M 日期:2018 年 02 月 07 日 关于本脚本: 一键安装 Python 版 *** 的最新版. ...

最新文章

  1. 通过邮箱验证注册——.net代码
  2. json-lib-2.1-jdk15.jar
  3. UICollectionView详解
  4. Sequence of component save EC and orderadm_h save
  5. 万字长文!剖析美团外卖持续交付的前世今生
  6. 利用SQL语言修正与撤销数据库
  7. Labview实现脉波调制( PDM )
  8. 2010-2020年全国poi兴趣点
  9. TFS使用指南——从服务器上获取最新的项目文件
  10. Java 对象的串行化(Serialization)
  11. Linux下的编辑器整理
  12. ps画画模糊笔刷_大量PS笔刷AI笔刷打包下载(超过1000款笔刷)
  13. python拼接sql语句字符串 无效字符,Python拼接SQL字符串的方法
  14. 最好的python视频教程_比较好的python视频教程
  15. Photoshop CC2019安装教程
  16. php实现迅雷链接的加密解密
  17. Scratch捡垃圾游戏 电子学会图形化编程scratch等级考试三级真题答案2019-12
  18. 概率神经网络(PNN)
  19. 华为Atlas张迪煊:在最好的时代,做最强AI算力底座
  20. 设计模式-简单总结(不涉及代码,有需要戳)

热门文章

  1. sx126x 与 sx127x 的区别
  2. ESP32-CAM、ESP8266、WIFI、蓝牙、单片机、热点创建嵌入式DNS服务器
  3. IIS部署Thinkphp网站
  4. 字节、KB、MB、GB 之间的换算关系 Bps和bps的区别
  5. 自己实现远程传输文件类
  6. 计算机用户注销后不见了,注销当前用户后 Win10找不到Administrator用户登录选项怎么解决?...
  7. python成语接龙源代码,基于Tkinter,带成语解释
  8. 深圳市文化创意产业百强(2011-2012)公示
  9. Python基础之占位符
  10. Windows Subsystem for Linux (WSL2) - WSL 的基本命令