MNN模型结构解读-程序员宅基地

技术标签: 深度学习框架  深度学习  

MNN模型结构解读–反序列化为文本格式

MNN是阿里开源的端侧深度学习框架,支持Tensorflow、Caffe、ONNX、tflite主流模型文件格式,通过Convert模块将已经训练好的网络模型转为MNN定义的模型格式,官方已经支持Netron工具可视化MNN模型,由于MNN的模型结构定义使用了flatbuffers库,因此可以通过flatbuffers的接口将.mnn格式的文件解析为文本格式。

flatbuffers是谷歌开源的序列化结构化库,相比protobuf库性能更好更加轻量,只需包含include文件夹即可编译,两者序列化的结果都是二进制格式,不方便阅读,protobuf提供了text_format类将二进制的message转化为文本。而flatbuffers为了解析文本格式就需要包含flatbuffers/src下的code_generators.cpp、idl_gen_text.cpp、idl_parser.cpp、util.cpp等4个源文件,头文件需要另外包含flatbuffers/idl.h和flatbuffers/util.h,下面以MNN模型mobilenet-v1为例。

#include <fstream>
#include <iostream>
#include <string>
#include "flatbuffers/idl.h"
#include "flatbuffers/util.h"

int main() {
    
    std::ifstream infile;
    infile.open("mobilenet-v1-1.0.mnn", std::ios::binary | std::ios::in);
    infile.seekg(0, std::ios::end);
    int length = infile.tellg();
    infile.seekg(0, std::ios::beg);
    char* buffer_pointer = new char[length];
    infile.read(buffer_pointer, length);
    infile.close();

    std::string BasicOptimizer_text;
    std::string CaffeOp_text;
    std::string GpuLibrary_text;
    std::string MNN_text; 
    std::string Tensor_text;
    std::string TensorflowOp_text;  
    std::string TFQuantizeOp_text;
    std::string Type_text;
    std::string UserDefine_text;

    flatbuffers::LoadFile("BasicOptimizer.fbs",false, &BasicOptimizer_text);
    flatbuffers::LoadFile("CaffeOp.fbs",false, &CaffeOp_text);
    flatbuffers::LoadFile("GpuLibrary.fbs",false, &GpuLibrary_text);
    flatbuffers::LoadFile("MNN.fbs",false, &MNN_text);
    flatbuffers::LoadFile("Tensor.fbs",false, &Tensor_text);
    flatbuffers::LoadFile("TensorflowOp.fbs",false, &TensorflowOp_text);
    flatbuffers::LoadFile("TFQuantizeOp.fbs",false, &TFQuantizeOp_text);
    flatbuffers::LoadFile("Type.fbs",false, &Type_text);
    flatbuffers::LoadFile("UserDefine.fbs",false, &UserDefine_text);

    flatbuffers::Parser parser;
    parser.Parse(Type_text.c_str(), nullptr, "Type.fbs") &&
    parser.Parse(Tensor_text.c_str(), nullptr, "Tensor.fbs") &&
    parser.Parse(UserDefine_text.c_str(), nullptr, "UserDefine.fbs") &&
    parser.Parse(CaffeOp_text.c_str(), nullptr, "CaffeOp.fbs") &&
    parser.Parse(TensorflowOp_text.c_str(), nullptr, "TensorflowOp.fbs") &&
    parser.Parse(GpuLibrary_text.c_str(), nullptr, "GpuLibrary.fbs") &&
    parser.Parse(TFQuantizeOp_text.c_str(), nullptr, "TFQuantizeOp.fbs") &&
    parser.Parse(MNN_text.c_str(), nullptr, "MNN.fbs") &&
    parser.Parse(BasicOptimizer_text.c_str(), nullptr, "BasicOptimizer.fbs");
    std::string output_text;
    flatbuffers::GenerateText(parser, buffer_pointer, &output_text);
    std::ofstream os;     
    os.open("mobilenet-v1.txt");
    os<<output_text;
    os.close();
}

编译命令

g++ parsermnntotext.cpp ../src/code_generators.cpp ../src/idl_gen_text.cpp ../src/idl_parser.cpp ../src/util.cpp -I ../include/ -o mnntotext
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JKANG94/article/details/117398042

智能推荐

vs2010 语法错误: 缺少“;”(在标识符“PVOID64”的前面)-程序员宅基地

文章浏览阅读1.6k次。网上有很多答案,看了让人不知道在说什么,一个行之有效的解决方案是在“stdafx.h”中添加#define POINTER_64 __ptr64。已验证有效。缺点是每生成一个新项目,都要添加一次。_vs2010 语法错误: 缺少“;”(在标识符“pvoid64”的前面)

leetcode sql题目_leedcode sql-程序员宅基地

文章浏览阅读392次。1 # Write your MySQL query statement belowselect max(salary) as SecondHighestSalary from Employee where salary not in (select max(salary) from Employee )Write a SQL query to get the second hig_leedcode sql

嵌入式软件工程师笔试面试指南-ARM体系与架构_嵌入式工程师笔试面试指南-程序员宅基地

文章浏览阅读1.1w次,点赞74次,收藏324次。嵌入式软件笔试,嵌入式软件面试,程序员简历书写,Linux驱动工程师笔试,Linux驱动工程师面试,BSP工程师笔试,BSP工程师面试,应届生秋招,应届生春招,C/C++笔试题目,C/C++面试题目,C/C++程序员,BSP工程师_嵌入式工程师笔试面试指南

威佐夫博弈 hdu1527 取石子游戏_博弈 分割石子-程序员宅基地

文章浏览阅读800次。传送门:点击打开链接题意:轮流取石子。1.在一堆中取任意个数.2.在两堆中取相同个数。最后取完的人胜利,问先手是否必赢思路:威佐夫博弈博弈,满足黄金分割,且每个数字只会出现一次。具体求法见代码#include#include#include#include#include#include#include#include#include#include#include_博弈 分割石子

python控制蓝牙音响_[ESP32+MicroPython]智能音响控制-程序员宅基地

文章浏览阅读2k次。blinker支持多种智能音响控制,如天猫精灵、百度小度、小米小爱、京东叮咚等。这里以天猫精灵控制为例,blinker DIY支持将设备模拟成三种类型的智能家居:插座、灯、传感器。Blinker支持多种语音助手控制,如天猫精灵、百度小度,本节以天猫精灵控制为例。示例程序及blinker模块天猫精灵基本接入方法通常语音助手都是对特定的设备类型进行支持,确定设备类型后,才能响应对应的语音指令。使用bl..._blinker支持micpython么

随便推点

Redis实现延迟队列方法介绍-程序员宅基地

文章浏览阅读3.3k次。其中,延迟队列是 Redis 的一个重要应用场景,它被广泛应用于异步任务的调度、消息队列的实现以及秒杀、抢购等高并发场景的处理。在实现延迟队列时,我们可以使用 Redis 的有序集合来保存待执行的任务,其中元素的分值表示任务的执行时间,元素的值表示任务的内容。使用 ZADD 命令将任务添加到有序集合中,将任务的执行时间作为元素的分值,将任务的内容作为元素的值。使用 ZADD 命令将任务添加到有序集合中,将任务的执行时间作为元素的分值,将任务的内容作为元素的值。一、Redis 有序集合实现延迟队列。

Python入门实战:Python的文件操作-程序员宅基地

文章浏览阅读701次,点赞23次,收藏7次。1.背景介绍Python是一种强大的编程语言,它具有简洁的语法和易于学习。Python的文件操作是一种常用的编程技术,可以让程序员更方便地读取和写入文件。在本文中,我们将深入探讨Python的文件操作,涵盖了核心概念、算法原理、具体操作步骤、数学模型公式、代码实例以及未来发展趋势。1.1 Python的文件操作背景Python的文件操作是一种基本的编程技能,它允许程序员在程序中读取和写...

机器学习模型对比_机器学习的模型比较-程序员宅基地

文章浏览阅读1k次。1.SVM和LR(逻辑回归)1.1 相同点都是线性分类器。本质上都是求一个最佳分类超平面。都是监督学习算法。 都是判别模型。通过决策函数,判别输入特征之间的差别来进行分类。常见的判别模型有:KNN、SVM、LR。 常见的生成模型有:朴素贝叶斯,隐马尔可夫模型。1.2 不同点损失函数不同,LR的损失函数为交叉熵;svm的损失函数自带正则化,而LR需要在损失函数的基础上加上正则化。 两个模型对数据和参数的敏感程度不同。SVM算法中仅支持向量起作用,大部分样本的增减对模型无影响;而L_机器学习的模型比较

纯C语言完整代码操作单链表(初始化、插入、删除、查找...)-程序员宅基地

文章浏览阅读901次,点赞3次,收藏10次。C语言操作单链表

实战打靶集锦-027-SoSimple1_sosimple 写入试验场-程序员宅基地

文章浏览阅读1.6k次,点赞32次,收藏47次。本文简单记录了博主的一次打靶经历,涉及wordpress扫描与爆破、social-warfare远程代码执行漏洞、sudo命令提权等_sosimple 写入试验场

用opencv的dnn模块做yolov5目标检测_opencv yolov5-程序员宅基地

文章浏览阅读7w次,点赞271次,收藏1.1k次。最近在微信公众号里看到多篇讲解yolov5在openvino部署做目标检测文章,但是没看到过用opencv的dnn模块做yolov5目标检测的。于是,我就想着编写一套用opencv的dnn模块做yolov5目标检测的程序。在编写这套程序时,遇到的bug和解决办法,在这篇文章里讲述一下。在yolov5之前的yolov3和yolov4的官方代码都是基于darknet框架的实现的,因此opencv的dnn模块做目标检测时,读取的是.cfg和.weight文件,那时候编写程序很顺畅,没有遇到bug。但是yolo_opencv yolov5