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

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

3天内不再提示

AI模型如何将它导入工程里

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

扫码添加小助手

加入工程师交流群

相信不少在MCU平台使用TensorflowLite Micro(Tensorflow Lite Micro专为嵌入式平台推出的专用版TFlite),以下简称TFLm,推理引擎体验过AI的小伙伴们,一定都遇到过这样的情况:当我们历经千辛万苦训练出来一个模型之后,要如何将它导入工程里呢?

各抒己见

这时候有同学会说了:我有文件系统啊,模型放到sd卡中,文件操作读进来分分钟啊!还有的同学会说了:我有xxd,当然,xxd也是TFLM的御用工具,负责将一个文件以十六进制的形式显示出来,使用过这个推理引擎的同学一定对下面这段注释很是熟悉:

// xxd -i mobilenet_v1_0.25_128_quant.tflite > mobilenet_v1_0.25_128_quant_model.h

这之后,我们的模型就会被转化成类似于下面这个样子,不要怀疑,这就是我们的模型真正的样子,并非眉清目秀,在程序中就可以通过mobilenet_model这个指针来访问模型数据:

const char mobilenet_model[] __ALIGNED(16) = {
  0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
  0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00,
  0x0e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x78, 0x5b, 0x07, 0x00,
  0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
  。。。。
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  0x97, 0x26, 0x08, 0x39
};
unsigned int mobilenet_model_len = 496912;
这时候,又有同学说了,你们这些方法都太弱了:你们有SD卡,有文件系统,有xxd!这些我统统不需要,不用额外安装工具,不用文件系统扩展,不用看着我这空荡荡的钱包,还要祭出小钱钱去买张SD卡。

嗯,我只需要编译器+裸板即可!要的就是简洁(也想高调,可是小钱钱不允许啊)。

不卖关子了,我们有.incbin。这个小东西是一个汇编指令,用来包含某一个文件到汇编文件中,文件的内容将会按字节逐一添加到当前elf(镜像文件)节中。不会做任何方式的解释,保证数据的完整和一致性。即原封不动的添加进来,不过要注意,以下代码要保存在以.s尾缀的汇编文件中:

.global mobilenet_model   // 导出全局符号
.global mobilenet_model _end
.section .rodata   // 存储位置

. mobilenet_model :
   .incbin “mobilenet_v1_0.25_128_quant.tflite”
. mobilenet_model_end :

这样一来,同样可以使用mobilenet_model这个模型指针来进行模型的访问。

很难说,上面三位同学的方法哪一种更好一点,可能第三位同学提出的方法,是对于外部依赖最少的,只需要利用编译器对于汇编指令的支持即可。既不需要费力的移植文件系统,也不用花费小钱钱购买SD卡,也不用求求xxd工具帮我们做事。

当然,小编在这里也站一下队,明确一下立场!我投.incbin一票,当然了,这个也是小编一直在用的方式。更换模型,只需要修改一下导入路径即可,可以说香的不行了!

新的挑战

不好,,,好像有点跑题变成夸夸群了,回到主题。

小伙伴既然已经回答了小编提出的问题:导入模型的N种方法,小编就再追问大家一个问题:如果频繁更新模型要怎么办呢?

当然,使用文件系统的小伙伴可能这时候会心一笑了:哈哈,我就知道有这么一出,让我猜到了吧,比灵活性,没人能和我比!

的确,无论是使用.incbin还是xxd的方式,每更新一次模型都要对整个模型重新编译下载。而使用文件系统的方式,只需要将模型拖到SD即可,不过根据程序设计,是否需要保证模型名字保持一致才能够正确loading。。。这个就不是本篇要讨论的了。

柳暗花明

相信看到这里的小伙伴们心里已经有数了,小编一定是已经找到了另一种替代方案,既能实现模型的更新,又不用重新对模型进行编译。是的,小编也就不再卖关子了,这就揭开庐山真面目。

小编这里要提出的方法,有点类似于引入文件系统的概念,只不过,是一个手动管理的“丐版”文件系统。

一句话概括就是:在非易失性器件上,说普通话就是Nor Flash上开辟一块固定的区域来存储模型,之后我们只需要将最新的模型也同样下载到这一区域即可,这样一来,我们在主程序中,只需要维护这一区域,将其作为模型的数据起始地址,就可以达到实时更新模型的目的了。

是不是感觉小编的这个想法,思路是如此的清晰!而且,还免去了移植文件系统的繁琐过程,最重要的是,保住了钱包里的小钱钱,不用买SD卡了。

这里特别强调是Nor Flash,作为可以随机读的器件,可以方便地进行随机访问,使用起来或者说在程序的编写上会更加的便捷。当然,使用NAND flash也未曾不可,有兴趣的伙伴可以自行整理。

留下悬念

当然,可能有小伙伴要质疑:那你这个可以实现存储多个模型吗?小编很负责任地告诉大家,只要胆子大,宇宙都能给你装下!只不过,在存放数据的时候,需要额外存储一些帧头信息,告知程序一共有多少组模型存储其中。

小编将在下期为大家介绍如何设计合适的存储结果以存放我们的flash数据,并编写一个PC端小程序,负责进行数据的转换,敬请期待!

原文标题:一种基于MCU的神经网络模型灵活更新方案之先行篇

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

审核编辑:彭静

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

    关注

    90

    文章

    38295

    浏览量

    297347
  • 文件系统
    +关注

    关注

    0

    文章

    301

    浏览量

    20835
  • 模型
    +关注

    关注

    1

    文章

    3656

    浏览量

    51753

原文标题:一种基于MCU的神经网络模型灵活更新方案之先行篇

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    AI模型的配置AI模型该怎么做?

    STM32可以跑AI,这个AI模型怎么搞,知识盲区
    发表于 10-14 07:14

    如何将GCC项目导入NuEclipse?

    如何将GCC项目导入NuEclipse?
    发表于 09-01 07:04

    AI Cube如何导入数据集?

    我从在线平台标注完并且下载了数据集,也按照ai cube的要求修改了文件夹名称,但是导入提示 不知道是什么原因,我该怎么办? 以下是我修改后的文件夹目录
    发表于 08-11 08:12

    关于NanoEdge AI用于n-Class的问题求解

    ,但把模型的静态库加到Keil5的工程中编译后运行在STM32F407G-DISC1的开发板上仿真测试时,我输入的数据不管怎么变,AI模型输出的结果永远是第1个分类(非unknown)
    发表于 08-11 06:44

    新唐科技推出高效AI MCU部署工具NuML Toolkit

    随着 AI 技术加速导入各类嵌入式系统,如何将训练完成的 AI 模型顺利部署至资源有限的微控制器成为工程
    的头像 发表于 08-01 17:21 1894次阅读

    ai_cube训练模型最后部署失败是什么原因?

    ai_cube训练模型最后部署失败是什么原因?文件保存路径也没有中文 查看AICube/AI_Cube.log,看看报什么错?
    发表于 07-30 08:15

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

    “  9.0.3 的小版本更新中增加一个非常实用的功能:直接导入 Altium 的工程,省去了分别导入原理图和 PCB 的麻烦。  ”   Altium 导入器 从  8.0 开始,K
    的头像 发表于 07-21 11:15 2682次阅读
    KiCad 已支持<b class='flag-5'>导入</b> Altium <b class='flag-5'>工程</b>(Project)

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

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

    如何将一个FA模型开发的声明式范式应用切换到Stage模型

    模型切换概述 本文介绍如何将一个FA模型开发的声明式范式应用切换到Stage模型,您需要完成如下动作: 工程切换:新建一个Stage
    发表于 06-04 06:22

    红发布AI+警务大模型解决方案

    近日,万红在第12届中国国际警用装备博览会上,正式发布了AI+警务大模型解决方案,以一体化的警务智能体,打造公安政务服务、政务办公等多种警务智能助手,涵盖警务工作10余项场景化应用,推进警务“智”变,提升公安机关新质战斗力。
    的头像 发表于 05-16 17:42 932次阅读

    首创开源架构,天玑AI开发套件让端侧AI模型接入得心应手

    AI的演进正在逼近“终端智能涌现”的拐点,从通用模型向场景落地迁移成为关键议题。联发科以“AI随芯,应用无界”为主题召开天玑开发者大会2025(MDDC 2025),不仅聚合了全球生态资源,还
    发表于 04-13 19:52

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

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

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

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

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

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

    将测量的太阳光谱导入VirtualLab Fusion

    ,我们以太阳光为例,说明了如何将测量到的光谱导入VirtualLab Fusion中,然后介绍了如何使用所述数据用作光学系统中光源的光谱组成。 建模任务 如何将测量到的太阳光光谱(见下图)
    发表于 01-23 10:22