相信不少在MCU平臺(tái)使用Tensorflow Lite Micro(Tensorflow Lite Micro專(zhuān)為嵌入式平臺(tái)推出的專(zhuān)用版TFlite),以下簡(jiǎn)稱TFLm,推理引擎體驗(yàn)過(guò)AI的小伙伴們,一定都遇到過(guò)這樣的情況:當(dāng)我們歷經(jīng)千辛萬(wàn)苦訓(xùn)練出來(lái)一個(gè)模型之后,要如何將它導(dǎo)入工程里呢?
各抒己見(jiàn)
這時(shí)候有同學(xué)會(huì)說(shuō)了:我有文件系統(tǒng)啊,模型放到sd卡中,文件操作讀進(jìn)來(lái)分分鐘?。∵€有的同學(xué)會(huì)說(shuō)了:我有xxd,當(dāng)然,xxd也是TFLM的御用工具,負(fù)責(zé)將一個(gè)文件以十六進(jìn)制的形式顯示出來(lái),使用過(guò)這個(gè)推理引擎的同學(xué)一定對(duì)下面這段注釋很是熟悉:
// xxd -i mobilenet_v1_0.25_128_quant.tflite > mobilenet_v1_0.25_128_quant_model.h
這之后,我們的模型就會(huì)被轉(zhuǎn)化成類(lèi)似于下面這個(gè)樣子,不要懷疑,這就是我們的模型真正的樣子,并非眉清目秀,在程序中就可以通過(guò)mobilenet_model這個(gè)指針來(lái)訪問(wèn)模型數(shù)據(jù):
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;
這時(shí)候,又有同學(xué)說(shuō)了,你們這些方法都太弱了:你們有SD卡,有文件系統(tǒng),有xxd!這些我統(tǒng)統(tǒng)不需要,不用額外安裝工具,不用文件系統(tǒng)擴(kuò)展,不用看著我這空蕩蕩的錢(qián)包,還要祭出小錢(qián)錢(qián)去買(mǎi)張SD卡。
嗯,我只需要編譯器+裸板即可!要的就是簡(jiǎn)潔(也想高調(diào),可是小錢(qián)錢(qián)不允許啊)。
不賣(mài)關(guān)子了,我們有.incbin。這個(gè)小東西是一個(gè)匯編指令,用來(lái)包含某一個(gè)文件到匯編文件中,文件的內(nèi)容將會(huì)按字節(jié)逐一添加到當(dāng)前elf(鏡像文件)節(jié)中。不會(huì)做任何方式的解釋?zhuān)WC數(shù)據(jù)的完整和一致性。即原封不動(dòng)的添加進(jìn)來(lái),不過(guò)要注意,以下代碼要保存在以.s尾綴的匯編文件中:
.global mobilenet_model // 導(dǎo)出全局符號(hào) .global mobilenet_model _end .section .rodata // 存儲(chǔ)位置 . mobilenet_model : .incbin “mobilenet_v1_0.25_128_quant.tflite” . mobilenet_model_end :
這樣一來(lái),同樣可以使用mobilenet_model這個(gè)模型指針來(lái)進(jìn)行模型的訪問(wèn)。
很難說(shuō),上面三位同學(xué)的方法哪一種更好一點(diǎn),可能第三位同學(xué)提出的方法,是對(duì)于外部依賴最少的,只需要利用編譯器對(duì)于匯編指令的支持即可。既不需要費(fèi)力的移植文件系統(tǒng),也不用花費(fèi)小錢(qián)錢(qián)購(gòu)買(mǎi)SD卡,也不用求求xxd工具幫我們做事。
當(dāng)然,小編在這里也站一下隊(duì),明確一下立場(chǎng)!我投.incbin一票,當(dāng)然了,這個(gè)也是小編一直在用的方式。更換模型,只需要修改一下導(dǎo)入路徑即可,可以說(shuō)香的不行了!
新的挑戰(zhàn)
不好,,,好像有點(diǎn)跑題變成夸夸群了,回到主題。
小伙伴既然已經(jīng)回答了小編提出的問(wèn)題:導(dǎo)入模型的N種方法,小編就再追問(wèn)大家一個(gè)問(wèn)題:如果頻繁更新模型要怎么辦呢?
當(dāng)然,使用文件系統(tǒng)的小伙伴可能這時(shí)候會(huì)心一笑了:哈哈,我就知道有這么一出,讓我猜到了吧,比靈活性,沒(méi)人能和我比!
的確,無(wú)論是使用.incbin還是xxd的方式,每更新一次模型都要對(duì)整個(gè)模型重新編譯下載。而使用文件系統(tǒng)的方式,只需要將模型拖到SD即可,不過(guò)根據(jù)程序設(shè)計(jì),是否需要保證模型名字保持一致才能夠正確loading。。。這個(gè)就不是本篇要討論的了。
柳暗花明
相信看到這里的小伙伴們心里已經(jīng)有數(shù)了,小編一定是已經(jīng)找到了另一種替代方案,既能實(shí)現(xiàn)模型的更新,又不用重新對(duì)模型進(jìn)行編譯。是的,小編也就不再賣(mài)關(guān)子了,這就揭開(kāi)廬山真面目。
小編這里要提出的方法,有點(diǎn)類(lèi)似于引入文件系統(tǒng)的概念,只不過(guò),是一個(gè)手動(dòng)管理的“丐版”文件系統(tǒng)。
一句話概括就是:在非易失性器件上,說(shuō)普通話就是Nor Flash上開(kāi)辟一塊固定的區(qū)域來(lái)存儲(chǔ)模型,之后我們只需要將最新的模型也同樣下載到這一區(qū)域即可,這樣一來(lái),我們?cè)谥鞒绦蛑?,只需要維護(hù)這一區(qū)域,將其作為模型的數(shù)據(jù)起始地址,就可以達(dá)到實(shí)時(shí)更新模型的目的了。
是不是感覺(jué)小編的這個(gè)想法,思路是如此的清晰!而且,還免去了移植文件系統(tǒng)的繁瑣過(guò)程,最重要的是,保住了錢(qián)包里的小錢(qián)錢(qián),不用買(mǎi)SD卡了。
這里特別強(qiáng)調(diào)是Nor Flash,作為可以隨機(jī)讀的器件,可以方便地進(jìn)行隨機(jī)訪問(wèn),使用起來(lái)或者說(shuō)在程序的編寫(xiě)上會(huì)更加的便捷。當(dāng)然,使用NAND flash也未曾不可,有興趣的伙伴可以自行整理。
留下懸念
當(dāng)然,可能有小伙伴要質(zhì)疑:那你這個(gè)可以實(shí)現(xiàn)存儲(chǔ)多個(gè)模型嗎?小編很負(fù)責(zé)任地告訴大家,只要膽子大,宇宙都能給你裝下!只不過(guò),在存放數(shù)據(jù)的時(shí)候,需要額外存儲(chǔ)一些幀頭信息,告知程序一共有多少組模型存儲(chǔ)其中。
小編將在下期為大家介紹如何設(shè)計(jì)合適的存儲(chǔ)結(jié)果以存放我們的flash數(shù)據(jù),并編寫(xiě)一個(gè)PC端小程序,負(fù)責(zé)進(jìn)行數(shù)據(jù)的轉(zhuǎn)換,敬請(qǐng)期待!
來(lái)源:恩智浦MCU加油站
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系小編進(jìn)行處理
審核編輯 黃宇
-
mcu
+關(guān)注
關(guān)注
146文章
17347瀏覽量
352734 -
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4781瀏覽量
101205 -
AI
+關(guān)注
關(guān)注
87文章
31615瀏覽量
270430 -
模型
+關(guān)注
關(guān)注
1文章
3329瀏覽量
49246
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
【PYNQ-Z2試用體驗(yàn)】神經(jīng)網(wǎng)絡(luò)基礎(chǔ)知識(shí)
求一種基于GAP技術(shù)的網(wǎng)絡(luò)保護(hù)設(shè)備設(shè)計(jì)新方案
如何構(gòu)建神經(jīng)網(wǎng)絡(luò)?
輕量化神經(jīng)網(wǎng)絡(luò)的相關(guān)資料下載
卷積神經(jīng)網(wǎng)絡(luò)模型發(fā)展及應(yīng)用
一種基于高效采樣算法的時(shí)序圖神經(jīng)網(wǎng)絡(luò)系統(tǒng)介紹
一種基于人工神經(jīng)網(wǎng)絡(luò)的秘密共享方案
一種攜帶歷史元素的循環(huán)神經(jīng)網(wǎng)絡(luò)推薦模型
![<b class='flag-5'>一種</b>攜帶歷史元素的循環(huán)<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b>推薦<b class='flag-5'>模型</b>](https://file.elecfans.com/web1/M00/E8/3B/pIYBAGBj0fCAECwAAAI4hhciGqk523.png)
卷積神經(jīng)網(wǎng)絡(luò)模型有哪些?卷積神經(jīng)網(wǎng)絡(luò)包括哪幾層內(nèi)容?
cnn卷積神經(jīng)網(wǎng)絡(luò)模型 卷積神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)模型 生成卷積神經(jīng)網(wǎng)絡(luò)模型
卷積神經(jīng)網(wǎng)絡(luò)模型搭建
卷積神經(jīng)網(wǎng)絡(luò)模型的優(yōu)缺點(diǎn)
一種基于MCU的神經(jīng)網(wǎng)絡(luò)模型在線更新方案之數(shù)據(jù)處理篇
![<b class='flag-5'>一種</b>基于<b class='flag-5'>MCU</b>的<b class='flag-5'>神經(jīng)網(wǎng)絡(luò)</b><b class='flag-5'>模型</b>在線<b class='flag-5'>更新方案</b><b class='flag-5'>之</b>數(shù)據(jù)處理<b class='flag-5'>篇</b>](https://file1.elecfans.com/web2/M00/A4/9B/wKgaomUD4aSAdgkSAAAdTqdPumA019.png)
評(píng)論