请选择 进入手机版 | 继续访问电脑版
查看: 401|回复: 40

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

[复制链接]
  • TA的每日心情
    开心
    2022-11-30 13:07
  • 签到天数: 209 天

    [LV.7]常住居民III

    2733

    主题

    5382

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    25599
    最后登录
    2022-12-7
    发表于 2022-7-14 10:32:22 | 显示全部楼层 |阅读模式
    一种基于MCU的神经网络模型灵活更新方案之先行篇

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

    各抒己见

    这时候有同学会说了:我有文件系统啊,模型放到sd卡中,文件操作读进来分分钟啊!还有的同学会说了:我有xxd,当然,xxd也是TFLM的御用工具,负责将一个文件以十六进制的形式显示出来,使用过这个推理引擎的同学一定对下面这段注释很是熟悉:
    1. // xxd -i mobilenet_v1_0.25_128_quant.tflite > mobilenet_v1_0.25_128_quant_model.h
    复制代码
    这之后,我们的模型就会被转化成类似于下面这个样子,不要怀疑,这就是我们的模型真正的样子,并非眉清目秀,在程序中就可以通过mobilenet_model这个指针来访问模型数据:
    1. const char mobilenet_model[] __ALIGNED(16) = {
    2.   0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
    3.   0x18, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00,
    4.   0x0e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x78, 0x5b, 0x07, 0x00,
    5.   0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
    6.   。。。。
    7.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    8.   0x97, 0x26, 0x08, 0x39
    9. };
    10. unsigned int mobilenet_model_len = 496912;
    复制代码
    这时候,又有同学说了,你们这些方法都太弱了:你们有SD卡,有文件系统,有xxd!这些我统统不需要,不用额外安装工具,不用文件系统扩展,不用看着我这空荡荡的钱包,还要祭出小钱钱去买张SD卡。
    嗯,我只需要编译器+裸板即可!要的就是简洁(也想高调,可是小钱钱不允许啊)。

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

    4. . mobilenet_model :
    5.    .incbin “mobilenet_v1_0.25_128_quant.tflite”
    6. . mobilenet_model_end :
    复制代码
    这样一来,同样可以使用mobilenet_model这个模型指针来进行模型的访问。

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

    当然,小编在这里也站一下队,明确一下立场!我投.incbin一票,当然了,这个也是小编一直在用的方式。更换模型,只需要修改一下导入路径即可,可以说香的不行了!
    新的挑战
    不好,,,好像有点跑题变成夸夸群了,回到主题。

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

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

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

    柳暗花明

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

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

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

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

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

    留下悬念

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

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

    本期,小编就先给大家卖个关子了,答应小编,要做彼此的天使,下期一定要来哟!





    签到www.nxpic.org.cn
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-11-1 17:12
  • 签到天数: 325 天

    [LV.8]以坛为家I

    3

    主题

    1124

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    4109
    最后登录
    2022-12-6
    发表于 2022-7-15 07:05:22 | 显示全部楼层
    不错的思路,使用外置flash存储来保存数据,在数据量不大的时候还是很有优势的
    要是我,我肯定选不想填写,别问我为啥,懒~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:44
  • 签到天数: 295 天

    [LV.8]以坛为家I

    1

    主题

    896

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2192
    最后登录
    2022-12-7
    发表于 2022-7-15 09:14:03 | 显示全部楼层
    学习一下
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情

    3 天前
  • 签到天数: 1394 天

    [LV.10]以坛为家III

    4

    主题

    3857

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7928
    最后登录
    2022-12-7
    发表于 2022-7-15 14:15:01 | 显示全部楼层
    先学习一下再说
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-5 08:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    69

    主题

    1942

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    5962
    最后登录
    2022-12-6
    发表于 2022-7-15 14:25:10 | 显示全部楼层
    神经网络是趋势
    加油哦
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 15:12
  • 签到天数: 516 天

    [LV.9]以坛为家II

    0

    主题

    1268

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    2699
    最后登录
    2022-12-7
    发表于 2022-7-15 14:29:44 | 显示全部楼层
    MCU的神经网络模型
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 09:11
  • 签到天数: 852 天

    [LV.10]以坛为家III

    8

    主题

    1420

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3531
    最后登录
    2022-12-7
    发表于 2022-7-15 16:24:47 | 显示全部楼层
    学习一下
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 08:34
  • 签到天数: 252 天

    [LV.8]以坛为家I

    1

    主题

    372

    帖子

    0

    高级会员

    Rank: 4

    积分
    916
    最后登录
    2022-12-7
    发表于 2022-7-15 16:25:36 | 显示全部楼层
    神经网络很热门啊
    哈哈哈
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 08:40
  • 签到天数: 254 天

    [LV.8]以坛为家I

    2

    主题

    395

    帖子

    0

    高级会员

    Rank: 4

    积分
    958
    最后登录
    2022-12-7
    发表于 2022-7-15 16:26:30 | 显示全部楼层
    开整!
    嘎嘎
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    前天 23:11
  • 签到天数: 833 天

    [LV.10]以坛为家III

    4

    主题

    2013

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    3871
    最后登录
    2022-12-6
    发表于 2022-7-15 16:38:48 | 显示全部楼层
    进来看看
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2022-12-8 03:51 , Processed in 0.084734 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表