一、为什么要做

刚进公司,实习期反正主管要求什么我就做什么。。。。自己反正也比较感兴趣,故开始查看官方文档。下述的一切都是基于官方提供的“语雀文档”内的指令进行的,会对自己部署MNN框架的流程当中踩的坑进行记录,希望可以帮助到有缘人。

二、具体内容

1、在各个应用端部署MNN进行机器学习主要分为三个阶段,分别是

2、转换器、工程主体配置和编译

接下来我们需要进行转换器(Convert)和工程主体的cmake配置。

由于对工具链和编译工具的不熟悉,这里我就开始踩坑了,首先我们看官方给出的示例工程编译代码:

cd path/to/MNN
powershell ./schema/generate.ps1
mkdir build
cd build
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DMNN_BUILD_DEMO=ON ..
nmake

这里设计到几个知识点

  1. powershell执行脚本命令
  2. cmake工具使用
  3. nmake工具使用

    由于查看了非常多的资料链接,现在我将能解决我问题的相关博客链接放上来,希望可以帮到大家:

这里在执行完下述指令,也只是对主体工程进行了makefiles的配置,还剩下conventer转换器没有配置,故这里推荐将转换器也一起进行makefiles的配置,具体指令如下:

cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DMNN_BUILD_CONVERTER=ON -DMNN_BUILD_SHARED_LIBS=OFF -DMNN_WIN_RUNTIME_MT=ON

这里面包含了很多的配置,解释如下:

-DCMAKE_BUILD_TYPE=Release(表示生成 Release 版本的构建配置。这意味着代码将进行优化.)
-DMNN_BUILD_CONVERTER=ON(这个选项用于控制是否构建 MNN 的模型转换工具 (Converter)。设置为 ON 表示在构建过程中会包含 Converter 工具)
-DMNN_BUILD_SHARED_LIBS=OFF
-DMNN_WIN_RUNTIME_MT=ON

这个选项控制是否构建 MNN 的共享库 (动态链接库)。设置为 OFF 表示构建静态库而不是动态库

这个选项用于控制在编译时是否使用多线程的静态运行时库 (MT)。设置为 ON 表示使用 /MT 编译选项,它将运行时库静态链接到目标可执行文件或静态库中,避免依赖外部的动态链接库


最后执行nmake指令,如果你在编译的过程当中遇到了“编码格式”的问题,可以参考我上面给到的链接,主要就是修改CMakeLists.txt当中的内容,添加

# 编译选项 - 设置为使用 UTF-8 编码
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")

去掉:

# specify source file encoding explicitly, fix cross-platform garbled output issue
# we need do this after protobuf which set different execution-charset
IF(MSVC)
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} /source-charset:utf-8")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /source-charset:utf-8")
ENDIF()

如果你在编译Converter的时候遇到了问题,也可能是protobuf没有安装或者版本不对,这里推荐使用vcpkg安装,使用该命令可以一键实现protoBuf以及其依赖的安装,具体安装方式参考protoBuf的官方说明:

protoBuf的github仓库

安装ProtoBuf的其他博客链接,可以参考

注意网络问题,最好开一个VPN软件。

在安装完vcpkg之后记得将vcpkg.exe所在的文件路径添加进环境变量的PATH当中。

注意事项

官方在编译主体工程的时候使用的是nmake,在编译转化工具的时候使用的是ninja。不过似乎是可以混着使用的,由于我对这些基本概念不太熟悉,故也只是记录自己的方法步骤而已。

3、Converter转换器工具的使用

首先下载原始的TensorFlow模型pose model

使用模型转换工具将pb模型转为mnn模型,具体流程为:

在编译出来的build文件下面执行如下指令,检查Convert工具版本以及工具是否安装成功。

./MNNConvert --version

更多参数说明如下:

点击查看代码
Usage:
MNNConvert [OPTION...] -h, --help Convert Other Model Format To MNN Model -v, --version 显示当前转换器版本 -f, --framework arg 需要进行转换的模型类型, ex: [TF,CAFFE,ONNX,TFLITE,MNN,TORCH, JSON] --modelFile arg 需要进行转换的模型文件名, ex: *.pb,*caffemodel --prototxt arg caffe模型结构描述文件, ex: *.prototxt --MNNModel arg 转换之后保存的MNN模型文件名, ex: *.mnn --fp16 将conv/matmul/LSTM的float32参数保存为float16,
模型将减小一半,精度基本无损 --benchmarkModel 不保存模型中conv/matmul/BN等层的参数,仅用于benchmark测试 --bizCode arg MNN模型Flag, ex: MNN --debug 使用debug模型显示更多转换信息 --forTraining 保存训练相关算子,如BN/Dropout,default: false --weightQuantBits arg arg=2~8,此功能仅对conv/matmul/LSTM的float32权值进行量化,
仅优化模型大小,加载模型后会解码为float32,量化位宽可选2~8,
运行速度和float32模型一致。8bit时精度基本无损,模型大小减小4倍
default: 0,即不进行权值量化 --compressionParamsFile arg
使用MNN模型压缩工具箱生成的模型压缩信息文件 --saveStaticModel 固定输入形状,保存静态模型, default: false --inputConfigFile arg 保存静态模型所需要的配置文件, ex: ~/config.txt。文件格式为:
input_names = input0,input1
input_dims = 1x3x224x224,1x3x64x64
--JsonFile arg 当-f MNN并指定JsonFile时,可以将MNN模型转换为Json文件
--info 当-f MNN时,打印模型基本信息(输入名、输入形状、输出名、模型版本等)
--testdir arg 测试转换 MNN 之后,MNN推理结果是否与原始模型一致。
arg 为测试数据的文件夹,生成方式参考 "正确性校验" 一节
--thredhold arg 当启用 --testdir 后,设置正确性校验的误差允可范围
若不设置,默认是 0.01

之后根据对应的模型,执行相应的转换指令即可,详见官方文档:官方语雀文档——模型转换

我这里由于使用的是TensorFlow模型,故使用TensorFlow -> MNN的指令:

./MNNConvert -f TF --modelFile XXX.pb --MNNModel XXX.mnn --bizCode biz

我pb模型是放置在桌面的,路径为:

D:\System-default\DeskTop\model-mobilenet_v1_075.pb

生成的mnn模型我也让其放在桌面上。最终,转换模型的指令为:

.\MNNConvert.exe -f TF --modelFile D:\System-default\DeskTop\model-mobilenet_v1_075.pb --MNNModel D:\System-default\DeskTop\model.mnn --bizCode biz

如果需要对模型的转换有要求,可以添加其他的参数,比如:

如果希望使用其他选项,例如启用浮点16精度 (--fp16)、量化 (--weightQuantBits) 或其他功能,可以在命令中添加对应的参数。例如:

  • 启用 FP16:--fp16
  • 权重量化为 8 位:--weightQuantBits 8

    根据需求,调整这些选项来满足具体的模型转换要求。

4、demo工程运行

准备好主体工程的编译、mnn模型的准备之后就可以简单跑一个姿态检测的demo了,CPP文件位于MNN/demo/exec/multiPose.cpp

这里编译multiPose.cpp需要stb库,但是官方下载的MNN文件里并没有,所以你需要现在github下载对应的库,放在include下面,并且编译指令当中添加相应的路径,stb的仓库链接为:stb仓库链接

最后指令为:

cl /I"D:\System-default\DeskTop\MNN\include" /I"D:\System-default\DeskTop\MNN\include\stb" /I"D:\System-default\DeskTop\MNN\3rd_party\flatbuffers\include" /I"D:\System-default\DeskTop\MNN\3rd_party\protobuf\include" /I"D:\System-default\DeskTop\MNN\source" /D "NOMINMAX" /EHsc /O2 /Fe:multiPose.exe D:\System-default\DeskTop\MNN\demo\exec\multiPose.cpp D:\System-default\DeskTop\MNN\build\MNN.lib

记住要到multiPose.cpp的路径下面运行!!!

运行成功之后可以在MNN/demo/exec下面看到下面两个文件

multiPose.exe
multiPose.obj

之后只要在相同路径下面运行.exe文件就好了,记得将mnn模型和图片的路径修改为自己的:

./multiPose.exe D:\System-default\DeskTop\model.mnn D:\System-default\DeskTop\tf.png D:\System-default\DeskTop\pose.png

MNN框架在WIN10上的部署的更多相关文章

  1. Spring Dataflow批处理框架在OCP上的部署

    详细参考 https://donovanmuller.blog/spring-cloud-dataflow-server-openshift/docs/1.2.1.RELEASE/reference/ ...

  2. Win10上部署Apollo配置中心

    基于Docker在Win10上部署Apollo配置中心 https://www.jianshu.com/p/a1215056ce75 http://nobodyiam.com/2016/07/09/i ...

  3. Tars | Win10下Docker部署TarsJava(SpringBoot)全过程及踩坑记录

    @ 目录 前言 1. 相关环境版本: 坑点一:VMware与Win10 Docker冲突 坑点二:20.版本TarsJava(SpringBoot)依赖文件缺失 2. Docker安装: 坑点三:Do ...

  4. layUI框架中文件上传前后端交互及遇到的相关问题

    下面我将讲述一下我在使用layUI框架中文件上传所遇到的问题: 前端jsp页面: <div class="layui-form-item"> <label cla ...

  5. Win10手记-IIS部署网站问题解决

    最近在自己的Win10电脑上尝试部署ASP.NET网站时出现了问题,经过多方查找定位到IIS为问题来源. 开始之前 先描述下技术环境: 1.Windows 10 PC 2.Windows 自带的IIS ...

  6. Flask 教程 第十九章:Docker容器上的部署

    本文翻译自The Flask Mega-Tutorial Part XIX: Deployment on Docker Containers 这是Flask Mega-Tutorial系列的第十九部分 ...

  7. python-django框架-电商项目-项目部署_20191127

    python-django框架-电商项目-项目部署: uwsgi作为web服务器: 在pycharm中启动项目:使用python manage.py runserver 这个runserver是dja ...

  8. 最新版CentOS6.5上安装部署ASP.NET MVC4和WebApi

    最新版CentOS6.5上安装部署ASP.NET MVC4和WebApi 使用Jexus5.8.1独立版 http://www.linuxdot.net/ ps:该“独立版”支持64位的CentOS ...

  9. rsync实现负载均衡集群文件同步,搭建线上测试部署环境

    闲来无事,搭建一个负载均衡集群,至于负载均衡集群搭建过程,找时间写下.这次主要写集群之间的文件同步,以及线上测试环境的搭建. 笔者看过很多公司都没有线上测试环境,真是崩溃了,不造怎么确保线上线下环境一 ...

  10. Thinkcmf 在新浪云上的部署问题

    最近要开发一个社团主页,于是想到了CMF内容管理系统的,但是直接在自己的服务器测试成本太高,于是选择了在新浪云上进行部署测试. 但是在安装Thinkcmf的过程中产生了一些技术性的问题.但最后终于在自 ...

随机推荐

  1. linux中级——libcurl库访问百度

    libcurl简介: libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcurl同样支持H ...

  2. Lambert cos 定律再积分无穷级数求和

    设有能量为 \(I\) 的一束光射向表面 \(s\),发生理想的漫反射.设反射率为 \(a\),则 \(s\) 向在 \(\phi\) 方向反射的能量 \(R\) 可由 Lambert cos 定律给 ...

  3. VSCode 插件离线安装方法

    一.引言 最近想要使用 VSCode 来进行项目的开发工作,无奈工作机上无法上网.这就涉及到了相关插件的离线安装的问题. 在参考了 https://blog.csdn.net/wangwei703/a ...

  4. 查看 Homebrew 管理的服务的日志

    TL;DR 首先找到 log 文件的位置: 对于 macOS (arm64),log 文件在 /opt/homebrew/var/log 目录下 对于 macOS (x86_64),log 文件在 / ...

  5. 神经网络之卷积篇:详解简单卷积网络示例(A simple convolution network example)

    详解简单卷积网络示例 假设有一张图片,想做图片分类或图片识别,把这张图片输入定义为\(x\),然后辨别图片中有没有猫,用0或1表示,这是一个分类问题,来构建适用于这项任务的卷积神经网络.针对这个示例, ...

  6. mybatis-plus批量增加、批量修改样例+建表语句+postman接口

    使用mybatis-plus开发中会遇到数据量多的情况下,插入和修改效率低,主要原因是"新增"和"修改"方法是对一条数据进行处理的,如果有一万条数据就会和数据库 ...

  7. 游戏AI LOD交易员(附项目)

    游戏AI的LOD控制 这次我们来一同看看AI LOD的一个另类控制技术,如果你对AI LOD一无所知也没关系,本文会为你们做个科普.但请注意,本文着重讨论其思想, 没有讲代码细节(因为很多涉及数学,有 ...

  8. BOM – Window.matchMedia

    参考 Youtube – Detecting Screen Size and OS Dark Mode with matchMedia() - JavaScript Tutorial 介绍 CSS 有 ...

  9. 前置机器学习(二):30分钟掌握常用Jupyter Notebook用法

    相较于Pycharm执行py文件来说,Jupyter Notebook可保存执行过程,添加图表.注释等富文本说明的功能,使其对机器学习的开发者格外友好. 本文包含机器学习环境安装,Jupyter No ...

  10. Blazor开发框架Known-V2.0.11

    Known今天发布了V2.0.11版本,本次版本添加了系统WebApi在线测试,系统菜单样式配置,表格支持用户设置栏位显隐和顺序,系统上下文支持静态组件与后端交互,以及对PgSQL进行了详细的测试,修 ...