一、为什么要做

刚进公司,实习期反正主管要求什么我就做什么。。。。自己反正也比较感兴趣,故开始查看官方文档。下述的一切都是基于官方提供的“语雀文档”内的指令进行的,会对自己部署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. 如何判断数据库和对象存储是否被 JuiceFS 使用?

    随着使用 JuiceFS 的时间越来越长,一些用户已经用多种数据库和对象存储创建了很多的 JuiceFS 文件系统.有些是纯云端的,有些是纯本地的,有些则是本地与云端结合的.它们当中有一些是存储了文件 ...

  2. Python正则表达式提取车牌号

    在Python中使用正则表达式(Regular Expressions)来提取车牌号是一个常见的任务,尤其是在处理车辆信息或进行图像识别后的文本处理时.中国的车牌号格式多种多样,但通常包含省份简称.英 ...

  3. 最详细STL(三)list

    list就是链表啦,他的一个结点由两个指针域,一个数据域组成.list可以在任何位置以O(n)的复杂度插入元素,头部和尾部的插入的复杂度为O(1).然而list也有一个致命的缺点,因为链表的空间申请是 ...

  4. centos上yum无法使用的问题以及无法用yum安装screen,iftop,nethogs等的解决办法

    大家可能都发现了centos8已经不在更新了.当我们使用yum安装某些工具的时候,会提示安装源失败 解决方案:删除repo文件 然后重新下载即可修复yum安装报错问题1.进入/etc/yum.repo ...

  5. Docker 知识梳理及其安装使用

    Docker 介绍 Docker 是一个强大的工具,用于高效开发.打包和部署应用程序.Docker 是一种容器管理服务.Docker 于 2013 年发布.它是开源的,可用于 Windows.macO ...

  6. ChatGPT介绍与使用场景

    ChatGPT是OpenAI开发的一款基于GPT-3和GPT-4的人工智能聊天机器人."GPT"代表的是"Generative Pre-trained Transform ...

  7. 技术实践 | 在线 KTV 实现过程(内附demo体验)

    ​ 你在线上K过歌吗? 在线K歌自2014年兴起以来,已经发展出了无比庞大的用户群体,每两人中就有就有一人体验过在线 K歌,其前景不可小觑. 如此庞大的市场规模,以及音视频技术使用门槛逐步降低的加持, ...

  8. DOM – Dimension & Coordinate (offset, client, computed, rect)

    前言 很多年前有记入过一篇 box-sizing 和 dom width. 想想也挺可悲的, 那年我是负责后端的, 却要帮着前端去学习这些知识来解决问题... 也好, 现在 full stack, 也 ...

  9. ASP.NET Core – Work with Environment (Development, Staging, Production)

    前言 这篇讲一讲发布和环境 (development, staging, production) 介绍 我的网站是 host 在 Azure 的 Virtual Machine, 跑 IIS, 没有使 ...

  10. DTO转VO工具

    data工具,实现了对象拷贝 DTO -> VO 只需要实现一个类即可 data-utils data工具,实现了对象拷贝DTO -> VO 解决的问题 Mapstruct需要安插件!!! ...