Mnn Converter Debug ---- 基于Xcode 构建以 onnx-->mnn 为例的 模型转换调试工程

1 需求

MNN 提供了模型转换工具 MNNConverter,期望可以基于简单的参数配置即可实现不同模型向Mnn模型的快速转换。
-->但转过模型的同学应该都能认识到:模型转换至今 还常常不是 一件可以完全自动化 的工作。
-->继而,我们常常面临的挑战是:基于 模型转换工具 进行 特定模型 的 模型转换 定制化修改。
-->既然要频繁大量地修改代码,一个调试环境是必须的。今天我们来解决的就是 模型转换的调试环境构建问题。

2 构建工程

我们将构建一个可以进行 onnx --> mnn 调试的Xcode工程,步骤如下:
1)编译 MnnConverter -->
2)创建基于 CommandLine 的 Xcode 工程 -->
3)链接libprotobuf.a -->
4)添加头文件查找路径 -->
5)调试文件拖拽 -->
6)main文件修改 -->
7)测试

2.1 编译 MnnConverter

首先我们需要成功 编译MnnConverter,此部分的坑请自行淌入~
MnnConverter 编译官方教程

2.2 创建基于 CommandLine 的 Xcode 工程

如下图创建一个 基于Command Line Tool 的 Xcode工程,起名如:MnnConverterDebug

选择Command Line Tool
起名如:MnnConverterDebug

2.3 链接libprotobuf.a

一般 2.1 Mnn Converter 编译成功的话 则 protobuf 应该已经安装成功了,可以确认下你的protobuf 安装路径,比如我的在:/usr/local/Cellar/protobuf/3.7.1/include/,完成后效果如下图:

链接libprotobuf.a

Tips
你可能发现有在添加 libprotobuf.a 时,有些系统路径无法直接找到(比如 /usr/local),此时可以在桌面创建一个 指向目标路径的软连接,然后通过这个目录软连接就可以进入目标路径了。

2.4 添加头文件查找路径

我们不需要把所有头文件都显式链接到工程中,只要让工程能找得到就好了。这么做:
1) 一方面因为很多头文件我们完全不关注,
2)另一方面也能减少Mnn更新造成的调试工程配置修改代价。

参考查找路径如下:

$(PROJECT_DIR)/../MNN/tools/converter/build
$(PROJECT_DIR)/../MNN/tools/converter/build/source/onnx
$(PROJECT_DIR)/../MNN/tools/converter/source
$(PROJECT_DIR)/../MNN/tools/converter/source/common
$(PROJECT_DIR)/../MNN/tools/converter/source/include
$(PROJECT_DIR)/../MNN/tools/converter/source/IR
$(PROJECT_DIR)/../MNN/tools/converter/source/MNN
$(PROJECT_DIR)/../MNN/tools/converter/source/onnx
$(PROJECT_DIR)/../MNN/tools/converter/source/optimizer

配置效果如下图:


添加头文件查找路径

2.5 调试文件拖拽

一些文件是编译依赖的,一些是我们可调试过程需要参考或修改的,将他们拖入工程。

需要拖拽的文件如下:

MNN/tools/converter/build/source/onnx/onnx.pb.cc 
MNN/tools/converter/source/cli.cpp 
MNN/tools/converter/source/config.cpp 
MNN/tools/converter/source/onnx 
MNN/tools/converter/source/MNN 
MNN/tools/converter/source/optimizer 
MNN/tools/converter/source/common 

拖拽过程中建议不要勾选 Copy items if needed

不要勾选Copy items if needed

完成后效果如图:

拖拽的文件/文件夹

2.6 main文件修改

1) main 文件是基于 MNN/tools/converter/source/MNNConverter.cpp 文件内容裁剪修改的。(基于 onnx-->mnn 的转换调试需求)
2)记得将 main 文件的 后缀改为.mm
3)分别修正 __ONNX_MODEL_PATH、 __MNN_MODEL_PATHonnx模型全路径目标mnn模型全路径

示例如下:

//
//  main.m
//  MNNConverterDebug
//
//  Created by Chris Yang on 2019/7/19.
//  Copyright © 2019 Chris. All rights reserved.
//

#include "cli.hpp"

#include "MNN_generated.h"
#include "addBizCode.hpp"
#include "caffeConverter.hpp"
#include "optimizer.hpp"
#include "writeFb.hpp"

#define __ONNX_MODEL_PATH       "....../model.onnx"
#define __MNN_MODEL_PATH        "....../model.mnn"

int onnx2MNNNet(const std::string inputModel, const std::string bizCode, std::unique_ptr<MNN::NetT>& netT);

int main(int argc, char *argv[]) {
    
    /* 1 参数模拟 */
    int tmp_argc = 9;
    char * tmp_argv[20];
    for (int i = 0; i < 20; i++) {
        tmp_argv[i] = (char *)malloc(256);
    }
    strcpy(tmp_argv[0], "./MNNConvert");
    strcpy(tmp_argv[1], "-f");
    strcpy(tmp_argv[2], "ONNX");
    strcpy(tmp_argv[3], "--modelFile");
    strcpy(tmp_argv[4], __ONNX_MODEL_PATH);
    strcpy(tmp_argv[5], "--MNNModel");
    strcpy(tmp_argv[6], __MNN_MODEL_PATH);
    strcpy(tmp_argv[7], "--bizCode");
    strcpy(tmp_argv[8], "MNN");
    
    /* 2 参数解析 */
    modelConfig modelPath;
    Cli::initializeMNNConvertArgs(modelPath, tmp_argc, (char **)tmp_argv);
    Cli::printProjectBanner();
    
    /* 3 模型转换 onnx --> mnn */
    std::cout << "Start to Convert Other Model Format To MNN Model..." << std::endl;
    std::unique_ptr<MNN::NetT> netT = std::unique_ptr<MNN::NetT>(new MNN::NetT());
    onnx2MNNNet(modelPath.modelFile, modelPath.bizCode, netT);
    
    /* 4 模型优化 */
    std::cout << "Start to Optimize the MNN Net..." << std::endl;
    std::unique_ptr<MNN::NetT> newNet = optimizeNet(netT);
    writeFb(newNet, modelPath.MNNModel, modelPath.benchmarkModel);
    std::cout << "Converted Done!" << std::endl;
    
    return 0;
}

2.7 测试

按照上面的步骤,你的工程应该可以 正常编译通过,那么,开始 快乐地打断点调试吧!

关于怎么进行较为 复杂的模型转换定制化修改,有机会我这边再整理在后续的文章中分享

3 工程Demo

工程Demo Git链接

使用步骤参考
1) 将 Mnn的Git工程 根目录设置为MNN
2)将 MnnConverterDebug 放置到和 MNN 同级目录下
3)修改 main.mm 中的 onnx、mnn 文件全路径
4)运行工程

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,097评论 1 32
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,806评论 0 27
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,182评论 0 3
  • 胃疼了一晚上,早上起晚了,不想称体重,不舒服,被胃绞痛和胃酸束缚的一天。即使吃了好几个小面包也压不下去恶心反胃...
    这才是生活本身阅读 160评论 0 1
  • 小林记者应该是个有趣的小姑娘吧,迷迷糊糊一副睡不醒的样子,总是一副上课要迟到的样子。和初上大学的小姑娘聊天时,我曾...
    秋风沐雨阅读 141评论 0 0