相信不少在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
+關注
關注
87文章
31511瀏覽量
270304 -
文件系統
+關注
關注
0文章
287瀏覽量
19970 -
模型
+關注
關注
1文章
3305瀏覽量
49216
原文標題:一種基于MCU的神經網絡模型靈活更新方案之先行篇
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論