mnn 编译转换工具 win10 2021

96 篇文章 25 订阅

2021.0824更新,mnn1.2.0 编译ok

python版转换工具:

python -m MNN.tools.mnnconvert

这个不是最新版,1.1.4,目前最新版是1.2.0

nmake形式,没成功,博客地址:

https://blog.csdn.net/ouyangfushu/article/details/100518987

这个使用cmake编译的,问题是不能编译Release版本

1.在github上下载protobuf,

https://github.com/protocolbuffers/protobuf

protobuf有两个依赖项:

https://github.com/google/googletest

https://github.com/google/benchmark.git

下载后拷贝到路径:
    path = third_party/benchmark
    path = third_party/googletest

得到protobuf-master文件夹,在此文件夹下新建一个vsproject文件夹(文件夹名你随便取,只是因为此文件夹下已经有了一个build的东东,所以才起的这个名字),然后按照上篇博客里的描述的那样使用cmake-gui.exe对protobuf生成vs的工程。source code选择protobuf目录下的cmake文件夹,

其余的操作都如同上一篇的那样。设置如下:


然后在Visual Studio 中对刚才生成的工程进行编译,记得选release哦。最后得到如下文件目录:

直到这一步,基本上不会出现任何问题,一路绿灯

将上一步得到的“include”和“Release”文件夹路径写入你的环境变量,一定要做!!!编译MNN的转换工具需要!最后我的环境路径如下:


去MNN官网下载mnn的包吧,解压后得到MNN-master文件夹

默认你已经安装好了python3和vs2017开始编译
在MNN-master文件夹下定位到“schema”下,新建一个python文件,文件名:generate.py 内容为:

#-*-coding:utf-8-*-
#coding by: yuangu(lifulinghan@aol.com)

import os
import sys
import shutil
import platform

def p():
    frozen = "not"
    if getattr(sys, 'frozen',False):
        frozen = "ever so"
        return os.path.dirname(sys.executable)

    return os.path.split(os.path.realpath(__file__))[0]

currentWorkPath = p()
os.chdir(currentWorkPath)

if '-lazy' in sys.argv and os.path.isdir("current"):
    print("*** done ***")
    exit(0)

# check is flatbuffer installed or not
FLATC = '../3rd_party/flatbuffers/tmp/flatc' + ('.exe' if "Windows" ==  platform.system() else '')
FLATC = os.path.realpath(FLATC)

if not os.path.isfile(FLATC):
    print("*** building flatc ***")
    tmpDir = os.path.realpath('../3rd_party/flatbuffers/tmp')
    
    if os.path.isdir(tmpDir):
        shutil.rmtree(tmpDir)
    
    os.mkdir(tmpDir)
    os.chdir(tmpDir)

    os.system('cmake  -DCMAKE_BUILD_TYPE=Release ..')
    if "Windows" ==  platform.system():
        os.system('cmake --build . --target flatc --config Release')
        if os.path.isfile( os.path.join(tmpDir, 'Release/flatc.exe') ):
            shutil.move(os.path.join(tmpDir, 'Release/flatc.exe'), FLATC)
    else:
        os.system('cmake --build . --target flatc')


    # dir recover
    os.chdir(currentWorkPath)

# determine directory to use
DIR='default'
if os.path.isdir('private'):
    DIR = 'private'
DIR = os.path.realpath(DIR)

# clean up
print('*** cleaning up ***')
if os.path.isdir('current'):
    shutil.rmtree('current')
os.mkdir('current')

# flatc all fbs
os.chdir('current')
listFile = os.listdir(DIR)
for fileName in listFile:
    tmpFileName = os.path.join(DIR, fileName)
    cmd = "%s -c -b --gen-object-api --reflect-names %s" %(FLATC, tmpFileName)
    os.system(cmd)

os.chdir(currentWorkPath)
print( "*** done ***")





保存后,打开cmd,运行 python generate.py,会自动帮你生成后续编译需要的工程,一般这里也不会有什么错误。这一步想了解具体过程的请参加:https://uzshare.com/view/810473 我是直接拷贝过来用的

进入主题
在命令行下定位到mnn的主目录

输入:
mkdir build && cd build

vs2019命令行
cmake -G "Visual Studio 17 Win64" -DCMAKE_BUILD_TYPE=Release -DMNN_BUILD_CONVERTER=true -DMNN_BUILD_SHARED_LIBS=false ..

vs2017的命令行:

cmake -G "Visual Studio 15 Win64" -DCMAKE_BUILD_TYPE=Release -DMNN_BUILD_CONVERTER=true -DMNN_BUILD_SHARED_LIBS=false ..

解释:
-G “Visual Studio 15 Win64” 使用64位编译器
-DCMAKE_BUILD_TYPE=Release 编译成release版本,这个Release不起作用,依赖项子项都是debug,多线程MTD的
-DMNN_BUILD_CONVERTER=true 编译converter工具
-DMNN_BUILD_SHARED_LIBS 官网上给出的,没细究
命令最后有两个点别忘了!!
等待完成。
完成后就输入:

cmake --build .

上面过程报错了,原因是默认模式是debug,如果编译debug,protobuf也需要编译debug版的,

解决方法:

Release模式:

方法1:把每个项目改为release,多线程改为MT,因为protobuf编译的MT,

方法2:把protobuf改为Md,重新编译protobuf应该也可以。

Debug模式:

方法1:如果是Debug模式,把每个项目改为debug,多线程改为MTd,因为protobuf编译的MTd,

方法2:把protobuf改为Md(MDd),重新编译protobuf应该也可以,和Mnn的保持一致。

在工程上右键-》属性-》c/c++-》代码生成-》运行库中,

改成(release为MT,debug为MTD),

后来就编译成功了。

nmake方式:

cd E:\mnn_android\mnn\MNN-1.2.0\tools\converter\build


cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release ..

nmake

这里官网给出的是使用ninja命令编译,这个没用过也没时间去深究了,就直接cmake吧。
如果一切正常的话在build目录下会生成一个Release文件夹,里面就是编译出来的各种工具了。但是在执行cmake --build的时候很可能会报各种奇怪的错误,一般情况下除了那个MNNConvert相关的工程外都能正常编译,主要是因为这个转换的工程依赖于第一步的那个protobuf,列举几个经常碰见的问题:

找不到头文件,检查一下是否把第一步编译出来的Release和include文件夹路径写入了环境路径并且已经生效
报:libprotobuf.lib(any.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项,仔细看一下错误的原因,这里很可能是使用libprotobuf的debug版本来编译MNNConvert的Release版本,反之亦然。反正就是版本不对。我就是碰到了这个问题,可是我明明已经指定了DCMAKE_BUILD_TYPE=Release选项,不得已,在vs2017中打开的工程,选择release编译通过。
报了很多什么参数不匹配,XX函数未定义这一类的错误,建议还是把build文件夹全部删除,重头来过吧。
最终编译出的文件列表


原文链接:https://blog.csdn.net/qq_36810544/article/details/105856975

编译protobuf

参考链接:https://github.com/protocolbuffers/protobuf/blob/master/cmake/README.md

x64

  1. 执行以下代码
cd /path/to/protobuf/vsprojects
cmake -G "Visual Studio 15 2017 Win64" -Dprotobuf_MSVC_STATIC_RUNTIME=ON -Dprotobuf_BUILD_TESTS=OFF ../cmake
  1. 使用VS打开工程并生成解决方案,把Debug产物复制到/path/to/protobuf/vsprojects/x64/Debug下, 把Release产物复制到/path/to/protobuf/vsprojects/x64/Release下。
  2. 将/path/to/protobuf添加至Protobuf_SRC_ROOT_FOLDER环境变量

x86

  1. 执行以下代码
cd /path/to/protobuf/vsprojects
cmake -G "Visual Studio 15 2017" -Dprotobuf_MSVC_STATIC_RUNTIME=ON -Dprotobuf_BUILD_TESTS=OFF ../cmake
  1. 使用VS打开工程并生成解决方案,把Debug产物复制到/path/to/protobuf/vsprojects/Debug下, 把Release产物复制到/path/to/protobuf/vsprojects/Release下。
  2. 将/path/to/protobuf添加至Protobuf_SRC_ROOT_FOLDER环境变量

编译模型转换工具

cd MNN目录

mkdir build
cd build
cmake -G "Ninja" -DMNN_BUILD_SHARED_LIBS=OFF -DMNN_BUILD_CONVERTER=ON -DCMAKE_BUILD_TYPE=Release ..
ninja

编译产物

MNNConvert : 模型转换工具

MNNDump2Json : 将MNN模型文件打印为类json文件的工具

常见问题

  1. 如果报错说link error: can not writing MNNConvert.exe, cd到/path/to/MNN/tools/converter/build, 再运行下ninja就好了

cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Release ..

Could NOT find Protobuf (missing: Protobuf_LIBRARIES) (found version
  "3.12.2")

不知道为啥?有build_win的,那一版,就可以

直接建vsprojects,再projects下编译的不行,原因是文件夹名字写错了

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值