0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

应用TFLm引擎进行模型文件导入

恩智浦MCU加油站 来源:恩智浦MCU加油站 作者:恩智浦MCU加油站 2022-07-28 09:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

书接上文(点此查看前文),我们横向比较了在应用TFLm引擎进行模型文件导入时候,所使用的三种常用方式:

SD卡存储结合文件系统,

xxd小工具进行文件的十六进制转换

以及使用汇编指令.incbin直接进行模型导入。

可以说各有所长,但是,当我们需要频繁地进行模型的替换、更新时,麻烦就出现了。xxd和.incbin的形式都需要重新编译目标工程,并下载到板子中。 当我们的程序体量较大时,即便不需要对全部工程进行编译(做到改啥编啥),但是,下载这一步,是无论如何不能跳过的,随着最终镜像大小的不同,所消耗的时间也会不同。而使用文件系统的方式,无形中增加了移植文件系统的工作量。

设计思路

为了克服这一问题,小编在上一篇的结尾提出了一个新的方案,直接把flash看作一大块空白存储区,并开辟一个固定区域存放模型文件。这样一来,我们只需要在程序中将模型的读取位置固定,无论模型是否更新,都能够读取最新的模型数据,进行后续处理。 而且小编也特意强调建议大家直接使用Nor Flash来实现这一操作。 以i.MX RT系列MCU为例说明这样做的优势。i.MX RT系列由于没有片上Flash芯片,都通过外扩Flash芯片存储代码。当我们将启动方式调整为XIP,即从flash启动时,芯片内部的BootROM会帮我们配置初始化好这个片上的Flash芯片,而由于Nor Flash的特性,支持随机的内存访问,也就是说,我们在程序内部,可以直接通过指针的形式进行访问,甚至可以直接调用memcpy函数进行数据的拷贝。 比起集成文件系统的方式,可以说方便至极。不过,也不是说Nand Flash就不适合,只是处理起来会稍稍麻烦一点,由于不支持随机的读操作,就要先拷贝到RAM区域再进行操作。

设计实现

言归正传,为了方便进行数据的管理,我们需要设计一套简单的管理逻辑,说的专业一点就是为我们的数据添加一个帧头,当然,既然大道至简,数据打包格式大致就是如下格式(可能有些简陋啊,大家见谅):

3fdb6114-0e0e-11ed-ba43-dac502259ad0.png

当然为了能够在程序中使用,我们再定义一个对应的C语言形式来表达,这里要用到C语言中0长度数组的概念:

struct {
uint32_t n, w, h , c;
uint8_t data[0];
}

这样一来,我们就具象化了我们所设计的那个简单的数据打包协议。

下一步是如何将数据打包成我们要的样子,这里要借助于Python来编写一个简单的脚本处理,并假设最终会生成一个二进制文件,假设输入一个多维数组results,首先构建其帧头,默认维度不足4的数据,用1补齐,保证最终的帧头包含4个维度信息:

def save_to_bin(bin_name, results):
    shape = list(results[0].shape)
    element_size = [1] * (3 - len(shape)) + shape
    element_len = len(results)
    # shape is [N, H, W, C]
    bin_values = np.asarray([element_len] + element_size, dtype=np.uint32).tobytes()
    bin_values += results.tobytes()
    with open(bin_name, "wb") as f:
        f.write(bin_values)
        f.close()

聊到这儿,可能有同学会问了,针对于tflite模型,我们往往只需要知道其首地址就好了,TFLm会处理那些长度信息,我还有必要构造帧头吗?这下给小编问的有点哑口无言。马上着手设计了第二种数据结构:

3fe7dcbe-0e0e-11ed-ba43-dac502259ad0.png

是的,针对于模型数据这一特殊的存在,可以设计出更加精简的表达格式,而且,我们知道tflite模型本身实际上已经是二进制文件的形式了,也就是说,可以直接拿过来使用,无需再做任何操作,直接烧写到固定地址即可。

那我们上面所设计的数据结构就毫无用武之地了吗?当然不是!小编做这些当然都是有理由的啊。

大家想一想,运行神经网络模型的时候,光有模型就可以了吗?当然不,我们还缺少输入啊!如果你是摄像头输入,请跳过这节。而如果是离线测试呢?需要大量加载静态图到内存中,是不是和之前我们的分析就类似了。

每次更换测试数据,依旧需要重新下载链接,那么按照本文提供的方案,也为数据设置一块固定的区域,然后借助于上述save_to_bin代码,将数据打包成固定格式,是不是就可以在程序中利用那个结构体访问了呢?没错!小编早就设计好了。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    462

    文章

    53539

    浏览量

    459157
  • mcu
    mcu
    +关注

    关注

    147

    文章

    18613

    浏览量

    387149
  • 编译
    +关注

    关注

    0

    文章

    688

    浏览量

    34949

原文标题:一种基于MCU的神经网络模型在线更新方案之数据处理篇

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何在vivadoHLS中使用.TLite模型

    本帖欲分享如何在vivadoHLS中使用.TLite模型。在Vivado HLS中导入模型后,需要设置其输入和输出接口以与您的设计进行适配。 1. 在Vivado HLS项目中
    发表于 10-22 06:29

    如何进行YOLO模型转换?

    (compile_options)import_options = nncase.ImportOptions()# 导入ONNX模型compiler.import_onnx
    发表于 08-14 06:03

    KiCad 已支持导入 Altium 工程(Project)

    就支持 Altium 文件导入,且直接支持二进制 *.schdoc, *.pcbdoc 的导入。后续版本也支持了 Altium ascii 格式的导入。但美中不足的不是,需要分开
    的头像 发表于 07-21 11:15 2586次阅读
    KiCad 已支持<b class='flag-5'>导入</b> Altium 工程(Project)

    cubemx导入模型后找不到keil找不到工程内的模型的相关文件是怎么回事?

    模型在cubemx内解析后没有问题,但解析之后生成工程keil内缺读取不到生成的三个模型文件
    发表于 07-18 07:18

    KaihongOS操作系统FA模型与Stage模型介绍

    的运行环境。FA模型的开发方式为通过导出匿名对象、固定入口文件的方式指定应用组件。开发者无法进行派生,不利于扩展能力。 Stage模型 Stage
    发表于 04-24 07:27

    如何基于Kahn处理网络定义AI引擎图形编程模型

    本白皮书探讨了如何基于 Kahn 处理网络( KPN )定义 AI 引擎图形编程模型。KPN 模型有助于实现数据流并行化,进而提高系统的整体性能。
    的头像 发表于 04-17 11:31 681次阅读
    如何基于Kahn处理网络定义AI<b class='flag-5'>引擎</b>图形编程<b class='flag-5'>模型</b>

    如何将调用方函数的MATLAB代码导入到DS?

    我最近制作了一个包含调用方函数的模型(我已将模型附加到 zip 文件中)。代码构建正常。但是当我在 design studio 中导入代码时,它会引发错误,因为它无法编译或
    发表于 04-02 06:51

    训练好的ai模型导入cubemx不成功怎么处理?

    训练好的ai模型导入cubemx不成功咋办,试了好几个模型压缩了也不行,ram占用过大,有无解决方案?
    发表于 03-11 07:18

    聆思CSK6大模型语音开发板接入DeepSeek资料汇总(包含深度求索/火山引擎/硅基流动华为昇腾满血版)

    调用DeepSeek节点,最终将大模型输出的结果进行语音合成实现端侧播报 下载工程模板导入,配置参数后绑定开发板ID即可。 关键参数说明(以火山引擎版为例): HOST
    发表于 03-06 17:02

    使用OpenVINO™推理引擎进行推理时,如何更改模型布局?

    无法为一系列网络准备输入。 第一个模型的输出在 CHW 布局中,但第二个模型的输入在 NCHW 布局中。
    发表于 03-06 07:21

    如何将python文件导入到ROS系统中

    本文通过使用myCobot机械臂进行QR码视觉追踪的实践案例分析,介绍如何将 python 文件导入到 ROS 系统中。
    的头像 发表于 02-11 11:08 1198次阅读
    如何将python<b class='flag-5'>文件</b><b class='flag-5'>导入</b>到ROS系统中

    FRED应用:BSDF数据导入与拟合

    简介 在FRED中,列表形式的BSDF数据可以使用如下两种方式。 1.按照FRED可以识别的数据格式直接导入作为散射模型。 2.使用BSDF数据拟合工具来产生合适的函数模型。 数据文件
    发表于 02-06 09:39

    BSDF数据导入与拟合

    简介 在FRED中,列表形式的BSDF数据可以使用如下两种方式。 1.按照FRED可以识别的数据格式直接导入作为散射模型。 2.使用BSDF数据拟合工具来产生合适的函数模型。 数据文件
    发表于 12-23 19:35

    AMC1305L25怎么样才可以把这个芯片的模型数据什么的导入到TINA或者是MULTISM里面进行仿真啊?

    在下想做一个AMC1305L25这个芯片的仿真,请问怎么样才可以把这个芯片的模型数据什么的导入到TINA或者是MULTISM里面进行仿真啊!求助各位
    发表于 12-20 07:07

    BSDF数据导入与拟合

    简介 在FRED中,列表形式的BSDF数据可以使用如下两种方式。 1.按照FRED可以识别的数据格式直接导入作为散射模型。 2.使用BSDF数据拟合工具来产生合适的函数模型。 数据文件
    发表于 12-13 10:05