一、为什么要做

刚进公司,实习期反正主管要求什么我就做什么。。。。自己反正也比较感兴趣,故开始查看官方文档。下述的一切都是基于官方提供的“语雀文档”内的指令进行的,会对自己部署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. [粉丝问答16]应届生被放鸽子,怒怼HR!找工作和找对象哪个更残酷?

    很多应届生在求职过程中遇到过被放鸽子的情况,但是由于段位不高,资源不够,社会阅历尚浅,很多人都是忍气吐声,但是也不乏有些学生性格刚硬,怒怼的. 比如下面这位学生,竟然直接怼了HR. 0.应届硕士小伙怒 ...

  2. .NET+WPF 桌面快速启动工具 GeekDesk

    前言 大家在平时工作中,是不是经常为了找某个文件或者应用而在电脑桌面上来回翻找?桌面图标乱七八糟,每次找东西都像在大海捞针一样. 今天给大家介绍一个开源项目 GeekDesk,它能够让桌面焕然一新,工 ...

  3. Vue Element-ui Table实现动态新增和删除

    达到效果:1.点击添加动态添加一行表格数据 2.点击移除删除一行 templete部分代码 <el-tab-pane label="股东情况"> <el-row& ...

  4. 搜索组件优化 - Command ⌘K

    前言: DevNow 项目中我们使用了 DocSearch 来实现搜索功能,但是由于有以下的限制: 您的网站必须是技术文档或技术博客. 您必须是网站的所有者,或者至少具有更新其内容的权限 您的网站必须 ...

  5. python 浅拷贝与深拷贝

    赋值引用 >>> a= {1:[1,2]}>>> b = a>>> b[2]=3>>> b {1: [1, 2], 2: 3} ...

  6. Cloudflare D1 - 免费数据存储

    前言 自从上次将博客项目的图片从 七牛云 迁到了 Cloudflare R2 之后就发现,Cloudflare 这个赛博菩萨的产品是真的不错,非常的适合白嫖,DevNow 项目作为一个开源博客,整体来 ...

  7. Figma 学习笔记 – Comment

    步骤 按 c 键 -> 点击区域 -> 写 comment -> post 它不仅仅在 design 的 page 可以写 comment 哦, 在预览 prototype 页面也是 ...

  8. Python 潮流周刊#69:是时候停止使用 Python 3.8了(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  9. @vue/cli eslint插件使用指南

    使用步骤 使用 npm 安装 @vue/cli-service 版本对应的 @vue/cli-plugin-eslint 例如:"@vue/cli-service": " ...

  10. U179915 关于分级火箭的一点理想化的计算

    题目地址 本题是一道疯狂推式子的玄学复杂度sb题. 解题思路 1.数学部分 ​ 首先假定已经将火箭分成了 \(n+1\) 级,记使用了 \(n\) 个分级器.记各级的开始时间点为: \[0=t_0&l ...