NNoM
NNoM (Neural Network on Microcontroller)
1. 簡(jiǎn)介
NNoM是一個(gè)專門為了神經(jīng)網(wǎng)絡(luò)在 MCU 上運(yùn)行的框架。
NNoM 是一個(gè)定點(diǎn)神經(jīng)網(wǎng)絡(luò)庫(kù), 現(xiàn)在支持 8-bit定點(diǎn)格式。
當(dāng)前 NNoM 支持?jǐn)?shù)十種操作,卷積,池化,激活,矩陣計(jì)算等等。
此外還提供多種在線評(píng)估方法,包括時(shí)間統(tǒng)計(jì),內(nèi)存統(tǒng)計(jì),Top-K 準(zhǔn)確度,Confusion Matrix 等等。
它擁有以下優(yōu)點(diǎn):
- 快速開(kāi)發(fā): 電腦上訓(xùn)練的 Keras 模型直接轉(zhuǎn)換成 C 文件。
- 默認(rèn)純C后端: 移植和使用暢通無(wú)阻,支持32/64bit,MCU/PC。
- 支持復(fù)雜結(jié)構(gòu): 支持多種復(fù)雜的網(wǎng)絡(luò)模型結(jié)構(gòu)。
- 完善的文檔: 擁有 API 文檔,入門指南,優(yōu)化指南。
- 入門簡(jiǎn)單: 多個(gè)從簡(jiǎn)單到復(fù)雜的例子,完全開(kāi)源。
MCU 上的神經(jīng)網(wǎng)絡(luò)能做什么?
- 語(yǔ)音關(guān)鍵詞識(shí)別 (KeyWord Spotting)
- 使用運(yùn)動(dòng)傳感器識(shí)別活動(dòng)狀態(tài) (Human Activity Recognition)
- 神經(jīng)網(wǎng)絡(luò)控制系統(tǒng) (替代PID等傳統(tǒng)控制方法)
- 圖像處理 (帶專用加速器的 MCU)
- ...
** 為什么需要 NNoM **
2014年后的網(wǎng)絡(luò),更高效,也更復(fù)雜。
CMSIS-NN 之類的庫(kù)太底層,需要設(shè)置的參數(shù)眾多,不夠靈活,只能應(yīng)用在比較傳統(tǒng)的單路徑網(wǎng)絡(luò)上。
而新的網(wǎng)絡(luò)傾向于從結(jié)構(gòu)上做優(yōu)化,不可避免地需要在結(jié)構(gòu)上做設(shè)計(jì)和優(yōu)化。
復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)導(dǎo)致非常難以使用傳統(tǒng)的底層庫(kù)進(jìn)行部署。
最初,NNoM 在 CMSIS-NN 上封裝了一層結(jié)構(gòu)層專門用于處理復(fù)雜的網(wǎng)絡(luò)路徑并且簡(jiǎn)化了參數(shù)計(jì)算。
后來(lái) NNoM 有了自己的腳本可以一鍵生成相應(yīng)的 C 文件,更進(jìn)一步提升了使用性。
新的純 C 后端也使得使用 NNoM 后,網(wǎng)絡(luò)的部署幾乎沒(méi)有平臺(tái)的限制。
1.1 目錄結(jié)構(gòu)
nnom
├───docs
│ ├───figures // 文檔圖片
│ └───*.md // 文檔
├───examples // 例子
├───inc // 頭文件
├───port // 移植文件
├───scripts // 腳本工具,模型轉(zhuǎn)換工具
├───src // 源代碼
│ LICENSE // 軟件包許可證
│ README.md // 軟件包簡(jiǎn)介
└───SConscript // 構(gòu)建腳本
1.2 許可證
NNoM 使用 LGPL-3.0 許可證,詳見(jiàn)LICENSE文件。
1.3 依賴
RT-Thread 3.0+
2. 獲取軟件包
RT-Thread online packages --->
miscellaneous packages --->
[*] NNoM: A Higher-level Nerual Network ... --->
- 推薦選擇 latest 版本。
- 退出 menuconfig 后,需要使用
pkgs --update
命令下載軟件包。
3. 使用軟件包
從 例子 開(kāi)始,例子從淺到深,適合直接硬干的玩家。
從 在線文檔 開(kāi)始,適合規(guī)規(guī)矩矩的大佬。
3.1 背景知識(shí)
- Python 3 環(huán)境,推薦 Anaconda
- 神經(jīng)網(wǎng)絡(luò)和機(jī)器學(xué)習(xí)的基本知識(shí)
在 MCU 上做神經(jīng)網(wǎng)絡(luò)需要使用者具備一些簡(jiǎn)單的機(jī)器學(xué)習(xí)的概念,比如卷積層,全連接層, 和 Keras 或是其他工具的初步技巧。
NNoM 可以使用自帶的 python 腳本很好地配合 Keras 來(lái)部署神經(jīng)網(wǎng)絡(luò)到 MCU。所以推薦使用 Keras 來(lái)學(xué)習(xí)。
如果你對(duì)機(jī)器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)完全陌生也沒(méi)有關(guān)系,Keras 號(hào)稱30秒入門。
3.2 例子
/examples
下有幾個(gè)不同的例子。
- mnist-simple 手寫數(shù)字識(shí)別 (超級(jí)簡(jiǎn)單,Msh 交互)
- uci-inception 使用6軸運(yùn)動(dòng)傳感器進(jìn)行人體運(yùn)動(dòng)識(shí)別(Inception 結(jié)構(gòu), CMSIS-NN加速,使用Y-modem發(fā)送測(cè)試數(shù)據(jù),支持 Msh命令行交互)
- mnist-densenet 手寫數(shù)字識(shí)別 (DenseNet 結(jié)構(gòu))
更多例子正在路上...
- 關(guān)鍵詞識(shí)別例子(KeyWord Spotting)
3.3 優(yōu)化
NNoM 默認(rèn)使用純 C 后端, 同時(shí)支持 CMSIS-NN/DSP 后端。選擇 CMSIS 后端后,會(huì)有5倍左右的性能提升.
開(kāi)啟優(yōu)化的方式可以查看 Porting and Optimisation Guide
4. 聯(lián)系方式
- 阿嘉 (Jianjia Ma)
- majianjia@live.com
感謝 Wearable Bio-Robotics Group (WBR), Loughborough University