嵌入式中的人工神經(jīng)網(wǎng)絡(luò)
人工神經(jīng)網(wǎng)絡(luò)在AI中具有舉足輕重的地位,除了找到***的神經(jīng)網(wǎng)絡(luò)模型和訓(xùn)練數(shù)據(jù)集之外,人工神經(jīng)網(wǎng)絡(luò)的另一個(gè)挑戰(zhàn)是如何在嵌入式設(shè)備上實(shí)現(xiàn)它,同時(shí)優(yōu)化性能和功率效率。 使用云計(jì)算并不總是一個(gè)選項(xiàng),尤其是當(dāng)設(shè)備沒有連接的時(shí)候。 在這種情況下,需要一個(gè)能夠?qū)崟r(shí)進(jìn)行信號(hào)預(yù)處理和執(zhí)行神經(jīng)網(wǎng)絡(luò)的平臺(tái),需要***功耗,尤其是在一個(gè)電池設(shè)備上運(yùn)行的時(shí)候。
通過使用不同的工具(如 python 腳本) ,可以訓(xùn)練一個(gè)數(shù)據(jù)格式的網(wǎng)絡(luò)(在 Caffe 和 Tensorflow),然后使用Snapdragon 神經(jīng)處理引擎的SDK將其轉(zhuǎn)換為可在Snapdragon 平臺(tái)上運(yùn)行的神經(jīng)網(wǎng)絡(luò)。
概述
高通的Snapdragon 平臺(tái)和Snapdragon 神經(jīng)處理引擎SDK是一個(gè)非常好的選擇,可以在低功耗和小規(guī)模設(shè)備上創(chuàng)建一個(gè)定制的神經(jīng)網(wǎng)絡(luò)。 Snapdragon NPE 是為了給開發(fā)者提供工具,使他們能夠輕松地將智能從云端遷移到邊緣設(shè)備。
Snapdragon NPE 為開發(fā)者提供軟件工具,深度神經(jīng)網(wǎng)絡(luò)上的工作負(fù)載在移動(dòng)和其他邊緣物聯(lián)網(wǎng)(IoT)設(shè)備上,由 Snapdragon 處理器提供軟件工具。 開發(fā)者可以為所需的用戶體驗(yàn)選擇***的 Snapdragon 核心—— Qualcomm Kryo CPU、 Qualcomm Adreno GPU 或Hexagon DSP。
本文探討了利用 Matlab 工具在 Snapdragon 平臺(tái)上開發(fā)和實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò),并主要關(guān)注 ONNX 格式。 同時(shí),我們還研究了 Snapdragon 平臺(tái)如何通過使用 Snapdragon 核心和 SNPE SDK 提供的工具來幫助減少電力和處理時(shí)間。
設(shè)計(jì)并開發(fā)簡(jiǎn)單的 DNN
從設(shè)計(jì)和培訓(xùn)深度神經(jīng)網(wǎng)絡(luò)開始,使用 Matlab并移植帶Snapdragon的設(shè)計(jì),尋找Snapdragon上***的子系統(tǒng)來完成這項(xiàng)工作。
手寫數(shù)字識(shí)別系統(tǒng)
從使用 DNN 的手寫數(shù)字識(shí)別系統(tǒng)開始。 這個(gè)網(wǎng)絡(luò)與(音頻數(shù)字識(shí)別系統(tǒng))之間的主要區(qū)別之一是這個(gè)系統(tǒng)沒有對(duì)輸入信號(hào)進(jìn)行任何預(yù)處理。 具有異構(gòu)計(jì)算架構(gòu)的 Snapdragon 平臺(tái)擁有強(qiáng)大的音頻和圖像處理引擎,使用數(shù)字信號(hào)處理(dsp)和圖形處理單元(GPU)進(jìn)行音頻和圖像處理。
該網(wǎng)絡(luò)是一個(gè)基于三層卷積的網(wǎng)絡(luò)。為了開發(fā)和訓(xùn)練這個(gè)網(wǎng)絡(luò),可以使用 Matlab,還可以使用 Matlab 的手寫數(shù)據(jù)庫(kù)(與 MNIST 數(shù)據(jù)庫(kù)相同; 關(guān)于該數(shù)據(jù)庫(kù)的資料,請(qǐng)查看 Matlab 文檔)。
編寫腳本
選擇數(shù)據(jù)庫(kù)
- [XTrain,YTrain] = digitTrain4DArrayData;
- [XValidation,YValidation] = digitTest4DArrayData;
設(shè)置圖層
- layers = [ imageInputLayer([28 28 1],'Name','input', 'Normalization', 'none')
- convolution2dLayer(5,16,'Padding','same','Name','conv_1')
- batchNormalizationLayer('Name','BN_1')
- reluLayer('Name','relu_1')
- convolution2dLayer(3,32,'Padding','same','Name','conv_2')
- batchNormalizationLayer('Name','BN_2')
- reluLayer('Name','relu_2')
- fullyConnectedLayer(10,'Name','fc')
- softmaxLayer('Name','softmax')
- classificationLayer('Name','classOutput')];
建立網(wǎng)絡(luò)
- options = trainingOptions('sgdm',...
- 'MaxEpochs',6,...
- 'Shuffle','every-epoch',...
- 'ValidationData',{XValidation,YValidation},...
- 'ValidationFrequency',20,...
- 'Verbose',false,...
- 'Plots','training-progress');
進(jìn)行訓(xùn)練(有關(guān)訓(xùn)練過程的細(xì)節(jié),參見 Matlab的相關(guān)文檔)。
圖1 訓(xùn)練結(jié)果
為了驗(yàn)證網(wǎng)絡(luò),使用這個(gè)圖像作為分類器,網(wǎng)絡(luò)可以正確地對(duì)它進(jìn)行分類。
圖2 分類器
現(xiàn)在,在將網(wǎng)絡(luò)轉(zhuǎn)換為 ONNX 格式之后,進(jìn)入了下一步,即使用 SNPE 工具。
首先,需要將 ONNX 格式轉(zhuǎn)換為 DLC。
- snpe-onnx-to-dlc -m handwritten-onnx --debug
這將創(chuàng)建一個(gè) DLC 格式網(wǎng)絡(luò),可用于SNPE。
然后使用此命令,可以驗(yàn)證網(wǎng)絡(luò)結(jié)構(gòu)與在 Matlab 中創(chuàng)建的結(jié)構(gòu)是否匹配。
圖3 拓?fù)鋵?duì)比(左側(cè) SNPE DLC,右側(cè) Matlab)
現(xiàn)在使用相同的測(cè)試圖像并在 Snapdragon 目標(biāo)板上驗(yàn)證它。 以下是 ARM,cDSP 和 GPU 的結(jié)果摘要,使用了以下步驟:
拉取平臺(tái)上不同核(使用 dsp 和使用 gpu)的 snpe-net-run 結(jié)果
比較結(jié)果表明,DSP 和 GPU 關(guān)系密切,但在這些平臺(tái)上,與 GPU 相比,cDSP 沒有較大負(fù)載(特別是當(dāng)有圖形應(yīng)用程序運(yùn)行時(shí)).
使用信號(hào)預(yù)處理子系統(tǒng)
到目前為止,已經(jīng)實(shí)現(xiàn)的 DNN 網(wǎng)絡(luò)不需要對(duì)輸入信號(hào)進(jìn)行任何預(yù)處理(比如從輸入圖像中提取特征)。 然而,并不是所有的實(shí)現(xiàn)都是這樣。
對(duì)于這些情況和實(shí)現(xiàn)較低的功耗,可以使用Snapdragon-aDSP,mDSP,cDSP,GPU,dsp/hvx,arm/neon 的不同子系統(tǒng)。看看xDSP和如何使用這些處理器進(jìn)行特征提取的例子。
Snapdragon上的Hexagon xDSP
Hexagon DSP 是一種具有 L1/2緩存和內(nèi)存管理單元的多線程DSP,在大多數(shù) Snapdragon SOC上,它和其他核心一樣可以訪問一些資源。QuRT OS這個(gè)獨(dú)特的結(jié)構(gòu)創(chuàng)建了一個(gè)靈活的 DSP 平臺(tái),為不同的用例創(chuàng)建應(yīng)用程序。
圖4 DSP 硬件體系結(jié)構(gòu)
圖像處理
對(duì)于實(shí)時(shí)圖像處理,可以在 ISP 管道中注入定制的 HVX 模塊。 該模塊的管道位置可能不同,取決于Snapdragon 具體型號(hào)。 在某些平臺(tái)上,可以在相機(jī)傳感器接口模塊之后使用它。
圖5 圖像的管道處理
或者在其他地方,可以在相機(jī)管道的不同位置(紅點(diǎn))中注入 HVX 模塊。
圖6 HVX模塊的注入點(diǎn)
或者可以用于 ISP 之后的內(nèi)存轉(zhuǎn)移中。有幾個(gè)例子可以在 Hexagon sdk3.3中找到。
例如,一個(gè)使用 HVX 的噪聲640x480圖像上的 Sobel 處理,可以使用大約10K 的指令周期。
圖7 噪聲圖像的sobel 處理
音頻處理
對(duì)于音頻預(yù)處理,aDSP 及其 Elite 框架適用于實(shí)時(shí)特征提取。 在數(shù)字識(shí)別系統(tǒng)的 DNN 網(wǎng)絡(luò)中,該網(wǎng)絡(luò)的輸入為 Mel-frequency cepstral coefficients (MFCC) ,使用一秒音頻文件和14個(gè)系數(shù),輸入層為14x98。 這個(gè)數(shù)據(jù)是從 https://aiyprojects.withgoogle.com/open_speech_recording 中收集的,每個(gè)數(shù)字(0-9)使用1500個(gè)音頻文件。 這里有一個(gè)用于數(shù)字1的 MFCC 例子。
圖8 數(shù)字1的音頻信號(hào)
網(wǎng)絡(luò)配置為
圖9 數(shù)字的DNN
DNN將嘗試學(xué)習(xí)和分類這些類型的圖像為不同的數(shù)字。 特征提取部分是在 aDSP 中完成的,是 Elite 框架中音頻路徑拓?fù)渲械囊粋€(gè)定制模塊。
傳感器處理
平臺(tái)包含一個(gè)傳感器集線器,是Snapdragon 傳感器核心,可以幫助整合來自不同傳感器的數(shù)據(jù)并處理它們。 這種技術(shù)可以幫助從中央處理器卸載這些任務(wù),減少電池消耗,同時(shí)提供更好的性能。 針對(duì)傳感器行為識(shí)別目標(biāo)的任何傳感器信息的任何DNN預(yù)處理都可以從 DSP 上卸載,并且可以實(shí)時(shí)完成。
在上述所有情況下,可以不使用分配的 DSP 進(jìn)行輸入,而是使用 FastRPC 從 ARM 中卸載處理到任何其他子系統(tǒng)(如 mDSP) ,但是這種技術(shù)有它自己的處理開銷。
小結(jié)
Snapdragon 平臺(tái)和 Snapdragon 神經(jīng)處理引擎SDK提供了強(qiáng)大的平臺(tái)和工具,可以在低功耗和小規(guī)模的邊緣設(shè)備上創(chuàng)建一個(gè)定制的人工神經(jīng)網(wǎng)絡(luò)。
(本文編譯自 http://www.embedded-computing.com/iot/artificial-neural-networks-ann-on-snapdragon-based-edge-devices)
【本文來自51CTO專欄作者“老曹”的原創(chuàng)文章,作者微信公眾號(hào):喔家ArchiSelf,id:wrieless-com】








































