一、为什么要做

刚进公司,实习期反正主管要求什么我就做什么。。。。自己反正也比较感兴趣,故开始查看官方文档。下述的一切都是基于官方提供的“语雀文档”内的指令进行的,会对自己部署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-centos中修改默认root帐户的登录用户名

    vi /etc/passwd 按i键进入编辑状态 修改第1行第1个root为新的用户名 按esc键退出编辑状态,并输入:x保存并退出 vi /etc/shadow 按i键进入编辑状态 修改第1行第1个 ...

  2. Honor X20 忽然不能与Android Studio 连接

    背景:前一天还正常使用,可以连接Android Studio,第二天就连不上了 已知:数据线没问题,驱动没问题,设备开了开发者模式,连接上电脑时会提示已连接USB调试, 测试过程:(点击撤销USB调试 ...

  3. Angular 18+ 高级教程 – Component 组件 の Angular Component vs Custom Elements

    前言 在上一篇 Angular Component vs Web Component 中,我们整体对比了 Angular Component 和 Web Component 的区别. 这一篇我们将针对 ...

  4. Nuxt Kit 中的布局管理

    title: Nuxt Kit 中的布局管理 date: 2024/9/18 updated: 2024/9/18 author: cmdragon excerpt: 摘要:本文详述了在Nuxt.js ...

  5. 一组.NET MAUI绘制的开源控件 - AlohaKit

    前言 今天大姚给大家分享一组.NET MAUI绘制的开源.免费(MIT License)UI控件库:AlohaKit. MAUI介绍 .NET MAUI是一个开源.免费(MIT License)的跨平 ...

  6. Python计算傅里叶变换

    技术背景 傅里叶变换在几乎所有计算相关领域都有可能被使用到,例如通信领域的滤波.材料领域的晶格倒易空间计算还有分子动力学中的倒易力场能量项等等.最简单的例子来说,计算周期性盒子的电势能\(k\sum_ ...

  7. Java项目笔记(三)

    一.前端传参类似以下格式,对象中包含一个对象,后台此时接收option为stirng类型 curriculumid question answer option {optionOne ,optionT ...

  8. 【赵渝强老师】Kafka的体系架构

    一.什么是Kafka? 数据工程中最具挑战性的部分之一是如何从不同点收集和传输大量数据到分布式系统进行处理和分析.需要通过消息队列正确地分离大量数据,因为如果一部分数据无法传送,则可以在系统恢复时传输 ...

  9. Vue Cli 创建项目在 GitHub 部署 history 路由模式

    1.修改打包路径 在 vue.config.js 中添加  publicPath  配置,其中 teambition-vue 是你项目的 github 名字.否则会找不到资源. module.expo ...

  10. 14. 迭代器、生成器、模块与包、json模块

    1.迭代器 1.1 迭代器介绍 迭代器是用来迭代取值的工具 每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代 # while循环实现迭代取值 a = [1, 2, 3, 4, 5, ...