MNN框架在WIN10上的部署
一、为什么要做
刚进公司,实习期反正主管要求什么我就做什么。。。。自己反正也比较感兴趣,故开始查看官方文档。下述的一切都是基于官方提供的“语雀文档”内的指令进行的,会对自己部署MNN框架的流程当中踩的坑进行记录,希望可以帮助到有缘人。
二、具体内容
1、在各个应用端部署MNN进行机器学习主要分为三个阶段,分别是
- 训练
- 转换
- 推理
这里我只进行了转换和推理的步骤,因为训练有其他更好的平台支持。
关于这三点官方也有进行一些介绍:使用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
这里设计到几个知识点
- powershell执行脚本命令
- cmake工具使用
- 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