0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

應(yīng)用TFLm引擎進(jìn)行模型文件導(dǎo)入

恩智浦MCU加油站 ? 來源:恩智浦MCU加油站 ? 作者:恩智浦MCU加油站 ? 2022-07-28 09:05 ? 次閱讀

書接上文(點(diǎn)此查看前文),我們橫向比較了在應(yīng)用TFLm引擎進(jìn)行模型文件導(dǎo)入時候,所使用的三種常用方式:

SD卡存儲結(jié)合文件系統(tǒng),

xxd小工具進(jìn)行文件的十六進(jìn)制轉(zhuǎn)換

以及使用匯編指令.incbin直接進(jìn)行模型導(dǎo)入。

可以說各有所長,但是,當(dāng)我們需要頻繁地進(jìn)行模型的替換、更新時,麻煩就出現(xiàn)了。xxd和.incbin的形式都需要重新編譯目標(biāo)工程,并下載到板子中。 當(dāng)我們的程序體量較大時,即便不需要對全部工程進(jìn)行編譯(做到改啥編啥),但是,下載這一步,是無論如何不能跳過的,隨著最終鏡像大小的不同,所消耗的時間也會不同。而使用文件系統(tǒng)的方式,無形中增加了移植文件系統(tǒng)的工作量。

設(shè)計(jì)思路

為了克服這一問題,小編在上一篇的結(jié)尾提出了一個新的方案,直接把flash看作一大塊空白存儲區(qū),并開辟一個固定區(qū)域存放模型文件。這樣一來,我們只需要在程序中將模型的讀取位置固定,無論模型是否更新,都能夠讀取最新的模型數(shù)據(jù),進(jìn)行后續(xù)處理。 而且小編也特意強(qiáng)調(diào)建議大家直接使用Nor Flash來實(shí)現(xiàn)這一操作。 以i.MX RT系列MCU為例說明這樣做的優(yōu)勢。i.MX RT系列由于沒有片上Flash芯片,都通過外擴(kuò)Flash芯片存儲代碼。當(dāng)我們將啟動方式調(diào)整為XIP,即從flash啟動時,芯片內(nèi)部的BootROM會幫我們配置初始化好這個片上的Flash芯片,而由于Nor Flash的特性,支持隨機(jī)的內(nèi)存訪問,也就是說,我們在程序內(nèi)部,可以直接通過指針的形式進(jìn)行訪問,甚至可以直接調(diào)用memcpy函數(shù)進(jìn)行數(shù)據(jù)的拷貝。 比起集成文件系統(tǒng)的方式,可以說方便至極。不過,也不是說Nand Flash就不適合,只是處理起來會稍稍麻煩一點(diǎn),由于不支持隨機(jī)的讀操作,就要先拷貝到RAM區(qū)域再進(jìn)行操作。

設(shè)計(jì)實(shí)現(xiàn)

言歸正傳,為了方便進(jìn)行數(shù)據(jù)的管理,我們需要設(shè)計(jì)一套簡單的管理邏輯,說的專業(yè)一點(diǎn)就是為我們的數(shù)據(jù)添加一個幀頭,當(dāng)然,既然大道至簡,數(shù)據(jù)打包格式大致就是如下格式(可能有些簡陋啊,大家見諒):

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

當(dāng)然為了能夠在程序中使用,我們再定義一個對應(yīng)的C語言形式來表達(dá),這里要用到C語言中0長度數(shù)組的概念:

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

這樣一來,我們就具象化了我們所設(shè)計(jì)的那個簡單的數(shù)據(jù)打包協(xié)議。

下一步是如何將數(shù)據(jù)打包成我們要的樣子,這里要借助于Python來編寫一個簡單的腳本處理,并假設(shè)最終會生成一個二進(jìn)制文件,假設(shè)輸入一個多維數(shù)組results,首先構(gòu)建其幀頭,默認(rèn)維度不足4的數(shù)據(jù),用1補(bǔ)齊,保證最終的幀頭包含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()

聊到這兒,可能有同學(xué)會問了,針對于tflite模型,我們往往只需要知道其首地址就好了,TFLm會處理那些長度信息,我還有必要構(gòu)造幀頭嗎?這下給小編問的有點(diǎn)啞口無言。馬上著手設(shè)計(jì)了第二種數(shù)據(jù)結(jié)構(gòu):

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

是的,針對于模型數(shù)據(jù)這一特殊的存在,可以設(shè)計(jì)出更加精簡的表達(dá)格式,而且,我們知道tflite模型本身實(shí)際上已經(jīng)是二進(jìn)制文件的形式了,也就是說,可以直接拿過來使用,無需再做任何操作,直接燒寫到固定地址即可。

那我們上面所設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)就毫無用武之地了嗎?當(dāng)然不是!小編做這些當(dāng)然都是有理由的啊。

大家想一想,運(yùn)行神經(jīng)網(wǎng)絡(luò)模型的時候,光有模型就可以了嗎?當(dāng)然不,我們還缺少輸入??!如果你是攝像頭輸入,請?zhí)^這節(jié)。而如果是離線測試呢?需要大量加載靜態(tài)圖到內(nèi)存中,是不是和之前我們的分析就類似了。

每次更換測試數(shù)據(jù),依舊需要重新下載鏈接,那么按照本文提供的方案,也為數(shù)據(jù)設(shè)置一塊固定的區(qū)域,然后借助于上述save_to_bin代碼,將數(shù)據(jù)打包成固定格式,是不是就可以在程序中利用那個結(jié)構(gòu)體訪問了呢?沒錯!小編早就設(shè)計(jì)好了。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 芯片
    +關(guān)注

    關(guān)注

    452

    文章

    50026

    瀏覽量

    419814
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16813

    瀏覽量

    349456
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    647

    瀏覽量

    32745

原文標(biāo)題:一種基于MCU的神經(jīng)網(wǎng)絡(luò)模型在線更新方案之?dāng)?shù)據(jù)處理篇

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    TINA如何導(dǎo)入OPA356模型?

    請問TINA如何導(dǎo)入OPA356模型
    發(fā)表于 08-14 07:55

    導(dǎo)入keras或者onnx模型到cubeai進(jìn)行分析,為什么會報(bào)錯?

    請問我導(dǎo)入keras或者onnx模型到cubeai進(jìn)行分析,為什么會報(bào)錯,而且沒有報(bào)錯內(nèi)容,cubeai版本9.0.0。換成8.1.0版本后報(bào)錯內(nèi)容是invalid network。該怎么入手解決。
    發(fā)表于 07-03 07:55

    為什么用CubeIDE導(dǎo)入AI模型進(jìn)行分析會報(bào)錯?

    python已經(jīng)安裝好了,但是在用CubeAI的時候,導(dǎo)入模型進(jìn)行分析會報(bào)錯,無法分析。有知道為什么會報(bào)[AI:persondetection][12152] Failed to execute
    發(fā)表于 05-22 06:38

    谷歌模型怎么PS打開文件格式不變

    要將谷歌模型與Photoshop結(jié)合使用,并保持文件格式不變,這通常涉及將谷歌模型生成的圖像或圖形導(dǎo)入到Photoshop中進(jìn)行進(jìn)一步編輯或
    的頭像 發(fā)表于 02-29 18:09 ?765次閱讀

    使用ml configurator進(jìn)行tflite網(wǎng)絡(luò)模型的轉(zhuǎn)換不成功怎么解決?

    使用ml configurator進(jìn)行tflite網(wǎng)絡(luò)模型的轉(zhuǎn)換不成功,提示錯誤,請幫忙協(xié)助謝謝 [ERROR] Failed to run QEMU
    發(fā)表于 01-31 06:56

    IBIS模型如何導(dǎo)入到LTspice中?

    IBIS模型如何導(dǎo)入到LTspice中
    發(fā)表于 01-03 06:23

    kicad怎么打開導(dǎo)入非kicad文件

    KiCad是一款優(yōu)秀的電子設(shè)計(jì)自動化(EDA)軟件,它提供了強(qiáng)大的功能來設(shè)計(jì)電路圖和PCB布局。然而,有時候我們可能需要導(dǎo)入一些非KiCad文件,例如從其他EDA軟件導(dǎo)出的文件或者從制造商提供的
    的頭像 發(fā)表于 01-02 13:54 ?2490次閱讀

    HarmonyOS:使用MindSpore Lite引擎進(jìn)行模型推理

    使用 MindSpore Lite 推理引擎進(jìn)行模型推理的通用開發(fā)流程。 基本概念 在進(jìn)行開發(fā)前,請先了解以下概念。 張量 :它與數(shù)組和矩陣非常相似,是 MindSpore Lite
    發(fā)表于 12-14 11:41

    navicat導(dǎo)入SQL文件不成功

    Navicat是一款功能強(qiáng)大的數(shù)據(jù)庫管理工具,可以幫助用戶輕松管理和操作數(shù)據(jù)庫。然而,有時用戶在導(dǎo)入SQL文件時可能會遇到問題,導(dǎo)致導(dǎo)入不成功。本文將詳細(xì)介紹導(dǎo)入SQL
    的頭像 發(fā)表于 11-21 11:01 ?6023次閱讀

    將外部sql文件導(dǎo)入MySQL步驟

    將外部sql文件導(dǎo)入MySQL是一項(xiàng)非常常見的操作,它允許我們將事先準(zhǔn)備好的數(shù)據(jù)或數(shù)據(jù)庫結(jié)構(gòu)導(dǎo)入到MySQL數(shù)據(jù)庫中。本文將詳細(xì)介紹該過程的步驟,并提供一些實(shí)用的技巧和注意事項(xiàng)。 在開始之前,我們
    的頭像 發(fā)表于 11-21 11:00 ?1428次閱讀

    ADIsimPE如何導(dǎo)入SPICE模型,進(jìn)行設(shè)計(jì)仿真?

    HI ,我問一下,ADIsimPE 如何導(dǎo)入 SPICE 模型進(jìn)行設(shè)計(jì)仿真?
    發(fā)表于 11-17 14:36

    AD8475的spice模型有問題,無法導(dǎo)入TINA-TI中進(jìn)行仿真計(jì)算怎么解決?

    (dA8475, ad8475) (dA8475, ad8475)的spice模型有問題,無法導(dǎo)入TINA-TI中進(jìn)行仿真計(jì)算
    發(fā)表于 11-17 07:43

    將AD8428的Spice模型導(dǎo)入到ADIsimPE,進(jìn)行增益測試和噪聲仿真報(bào)錯的原因?

    我按照help文件說明,將AD8428的Spice模型導(dǎo)入到ADIsimPE。設(shè)計(jì)完成后,進(jìn)行增益測試和噪聲仿真,都出現(xiàn)的如下錯誤: 謝謝各位 以下內(nèi)容為評論 出現(xiàn)wa
    發(fā)表于 11-17 06:50

    如何將ADI公司的Spice模型導(dǎo)入到Multisim仿真軟件呢?

    請問如何將ADI公司的Spice模型導(dǎo)入到Multisim仿真軟件呢? 當(dāng)我導(dǎo)入時為什么找不到該文件呢?
    發(fā)表于 11-17 06:20

    請問LTspice怎么導(dǎo)入模型

    LTspice怎么導(dǎo)入模型? 我下載了如圖的模型,要怎么導(dǎo)入到LTspice中,去使用它完成電路圖的繪制? LTspice里的模型太少太少了
    發(fā)表于 11-14 08:24