關(guān)靖濤
(廣東海洋大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院,廣東 陽江 529500)
關(guān)鍵字:人工智能物聯(lián)網(wǎng);神經(jīng)網(wǎng)絡(luò);嵌入式系統(tǒng);微控制器
隨著神經(jīng)網(wǎng)絡(luò)技術(shù)的不斷普及,我們可以清晰的看到它對生活產(chǎn)生的各種變化,從起初將卷積神經(jīng)網(wǎng)絡(luò)應(yīng)用到了汽車的自動(dòng)駕駛和人臉識別等各個(gè)場景,到現(xiàn)在自然語言處理的集大成模型——ChatGPT 的出現(xiàn)帶來了更人性化的人機(jī)交互體驗(yàn),無一不體現(xiàn)出其重要性。目前神經(jīng)網(wǎng)絡(luò)標(biāo)準(zhǔn)的開發(fā)流程是先根據(jù)需求采集合適的數(shù)據(jù)并對其進(jìn)行分類標(biāo)記,再搭建特定的神經(jīng)網(wǎng)絡(luò)模型,隨后通過使用高算力、高性能的服務(wù)器來對目標(biāo)模型進(jìn)行訓(xùn)練,根據(jù)結(jié)果不斷對其權(quán)重參數(shù)或模型架構(gòu)進(jìn)行調(diào)整和優(yōu)化,在獲得了滿意的準(zhǔn)確率和推導(dǎo)能力之后便將模型部署到系統(tǒng)中,常規(guī)的部署方案是采用“遠(yuǎn)程”的推導(dǎo)方式,即用戶端負(fù)責(zé)數(shù)據(jù)的采集并使用某種通信方法將其傳送到服務(wù)器中進(jìn)行處理和推導(dǎo)[1],得到的結(jié)果再傳送回用戶端的執(zhí)行單元中,經(jīng)判斷決定本地設(shè)備該執(zhí)行何種類型的動(dòng)作。
用戶端的本地設(shè)備只參與了“數(shù)據(jù)采集”與“動(dòng)作執(zhí)行”的兩個(gè)步驟,核心設(shè)備仍然是神經(jīng)網(wǎng)絡(luò)模型所在的服務(wù)器端。這種傳統(tǒng)的部署方法隨著芯片計(jì)算能力的提升產(chǎn)生了許多變化與創(chuàng)新,其中人工智能物聯(lián)網(wǎng)(AIoT)就是其中新的應(yīng)用方向,它是由人工智能(AI)和物聯(lián)網(wǎng)(IoT)相互融合、相互促進(jìn)后誕生的新興技術(shù),目標(biāo)是豐富感知層的執(zhí)行能力,通過借助高性能的芯片,讓傳感節(jié)點(diǎn)來輔助完成神經(jīng)網(wǎng)絡(luò)模型推導(dǎo)過程中更多的重要步驟,甚至可以將規(guī)模不大、算力要求不高的模型下放到節(jié)點(diǎn)中,使整個(gè)系統(tǒng)能具備離線推導(dǎo)的能力。本文則解釋如何將神經(jīng)網(wǎng)絡(luò)模型推導(dǎo)過程中數(shù)據(jù)預(yù)處理這一步驟的內(nèi)容移植到本地的嵌入式設(shè)備,直接為神經(jīng)網(wǎng)絡(luò)模型提供可用的數(shù)據(jù),拓展人工智能網(wǎng)絡(luò)在工業(yè)發(fā)展和智能家具等領(lǐng)域的使用場景。
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)是深度學(xué)習(xí)最具代表性的算法之一,它是一種包含了卷積運(yùn)算并且?guī)в猩疃冉Y(jié)構(gòu)的前饋神經(jīng)網(wǎng)絡(luò),常適用于圖像識別或手寫識別等。卷積神經(jīng)網(wǎng)絡(luò)是通過使用不同大小的卷積核對目標(biāo)圖像的窗口或部分區(qū)域進(jìn)行采樣和特征抽取,最后利用這些特征來構(gòu)建出目標(biāo)圖像的分類或表示內(nèi)容。在此重點(diǎn)討論其使用的數(shù)據(jù)的類型和對輸入數(shù)據(jù)的處理方法。
卷積神經(jīng)網(wǎng)絡(luò)的處理對象是圖像,那么輸入到模型中的自然是與圖像相關(guān)的數(shù)據(jù),在對模型進(jìn)行訓(xùn)練或推導(dǎo)時(shí),常用的輸入數(shù)據(jù)就分為單通道圖像(灰度圖)和多通道圖像,獲得的圖像在經(jīng)過一系列步驟處理后才可進(jìn)行使用。
通常原始的圖像數(shù)據(jù)復(fù)雜度高,并且可能會含有大量噪聲等不利因素,直接使用會影響神經(jīng)網(wǎng)絡(luò)的準(zhǔn)確率和運(yùn)行效率,因此輸入的圖像必須要完成各種預(yù)處理操作[2]。而常規(guī)的數(shù)據(jù)預(yù)處理方法包括濾波去噪、去均值、歸一化或白化等相關(guān)操作。以下對歸一化和去均值兩種常用的處理方法做簡單的介紹。
1)歸一化。歸一化的目的是為了讓不同維度的數(shù)據(jù)具有相同的分布,有利于卷積神經(jīng)網(wǎng)絡(luò)在訓(xùn)練的過程中更好的優(yōu)化自身網(wǎng)絡(luò)的權(quán)重和偏置,以下為線性歸一化的表達(dá)式:
式中,xnew為歸一化后的目標(biāo)值,xorg為需要進(jìn)行歸一化的原始值,xmax、xmin分別為卷積神經(jīng)網(wǎng)絡(luò)模型輸入張量中的最大值與最小值。觀察公式可知在轉(zhuǎn)換完成后輸入張量中的所有數(shù)據(jù)可以標(biāo)準(zhǔn)化映射成在[0,1]區(qū)間的任何一數(shù)值,借此可以縮小輸入數(shù)值的范圍,做到降低模型的收斂速度和提高模型泛化等能力。
2)去均值。當(dāng)輸入的張量中有過大的均值時(shí),會導(dǎo)致參數(shù)的梯度過大,因此需要使用去均值的方法來處理數(shù)據(jù)。將張量中的原特征值減去均值后的結(jié)果即為新的特征值,處理后的數(shù)據(jù)各個(gè)維度都中心化為0,從而避免過多的數(shù)據(jù)偏差。
循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)是以序列數(shù)據(jù)作為輸入,并且在序列的演進(jìn)方向進(jìn)行遞歸,其所有循環(huán)單元都按照鏈?zhǔn)竭B接的遞歸型神經(jīng)網(wǎng)絡(luò)。因?yàn)檠h(huán)神經(jīng)網(wǎng)絡(luò)具有記憶性、參數(shù)共享以及圖靈完備等特點(diǎn),使得它對序列的非線性特征的學(xué)習(xí)具有優(yōu)勢,是深度學(xué)習(xí)中除卷積神經(jīng)網(wǎng)絡(luò)外的另一個(gè)重要算法。
循環(huán)神經(jīng)網(wǎng)絡(luò)應(yīng)用的場景很多如語音識別、語音助手和機(jī)器翻譯等,且可以和卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行結(jié)合來開發(fā)復(fù)雜應(yīng)用,如使用卷積神經(jīng)網(wǎng)絡(luò)對圖片的特征進(jìn)行分類后讓循環(huán)神經(jīng)網(wǎng)絡(luò)來生成對應(yīng)的文字描述等。
循環(huán)神經(jīng)網(wǎng)絡(luò)處理的對象是序列,這里“序列”的這個(gè)元素其實(shí)是我們生活中常見的連續(xù)并存在某種關(guān)聯(lián)的信息數(shù)據(jù)。
當(dāng)下循環(huán)神經(jīng)網(wǎng)絡(luò)最流行的應(yīng)用場景是自然語言處理(Natural Language Processing,NLP),目標(biāo)是讓計(jì)算機(jī)識別和理解人類使用的自然語言并執(zhí)行與其對應(yīng)的命令或動(dòng)作,但無論是語音識別還是多語種翻譯,最終都是將文本轉(zhuǎn)換成序列信息來進(jìn)行循環(huán)神經(jīng)網(wǎng)絡(luò)模型的推導(dǎo)和訓(xùn)練,下文也以序列作為網(wǎng)絡(luò)的使用對象展開講解。
循環(huán)神經(jīng)網(wǎng)絡(luò)在訓(xùn)練和部署這兩個(gè)不同的階段時(shí)針對輸入的信息會有不同的處理步驟,由于本文主題是以訓(xùn)練后的網(wǎng)絡(luò)模型為前提下進(jìn)行框架設(shè)計(jì)的,因此該節(jié)要處理的數(shù)據(jù)應(yīng)是訓(xùn)練數(shù)據(jù)集之外的輸入內(nèi)容,而且系統(tǒng)內(nèi)應(yīng)保存有訓(xùn)練完成的詞嵌入矩陣及字典等內(nèi)容來輔助完成操作。
(1)分詞 在部署模型的硬件系統(tǒng)中,無論是從存儲設(shè)備或者是網(wǎng)絡(luò)上獲得的文本信息,在加載后都是以字符串的形式等待處理,首先第一個(gè)步驟是將這一連串的句子進(jìn)行分詞,其中包括去除標(biāo)點(diǎn)符號、去除停用詞、同義詞替換、區(qū)分大小寫或辨別姓名等操作。
得到了分詞的數(shù)組后,下一個(gè)步驟則對數(shù)組中的特征詞和字典中的內(nèi)容進(jìn)行匹配,獲取其整型編號并映射到程序的存儲空間中。
(2)獨(dú)熱編碼 獨(dú)熱編碼又稱為一位有效編碼,采用N位的狀態(tài)寄存器來對N個(gè)狀態(tài)進(jìn)行編碼,使用在文本數(shù)據(jù)的預(yù)處理時(shí),需要根據(jù)字典中總單詞的大小來決定獨(dú)熱向量的維度,比如說此時(shí)與部署的神經(jīng)網(wǎng)絡(luò)模型匹配的字典中單詞的總數(shù)量為500,則要轉(zhuǎn)化的獨(dú)熱向量維度是500。每個(gè)單詞的獨(dú)熱向量與其映射的整型編號相關(guān)聯(lián)。
獨(dú)熱編碼的特點(diǎn)是使每個(gè)單詞都是單獨(dú)一維,單詞之間的特征完全相互獨(dú)立,但缺點(diǎn)也非常明顯,如果字典的單詞過多時(shí),每個(gè)單詞的維度會非常高,導(dǎo)致構(gòu)建循環(huán)神經(jīng)網(wǎng)絡(luò)時(shí)需要計(jì)算巨量的權(quán)重參數(shù),因此使用詞嵌入來對獨(dú)熱向量進(jìn)行降維。
在框架設(shè)計(jì)中,需要根據(jù)設(shè)備的實(shí)際性能來挑選輸入序列的處理手段,若是字典的總?cè)萘坎桓撸⒖刂破餍阅軓?qiáng)勁,則可以直接上傳獨(dú)熱向量,甚至可以在本地中利用詞嵌入矩陣轉(zhuǎn)換成稠密向量再發(fā)送到上位機(jī),否則只需要發(fā)送映射后的序列即可。
本節(jié)內(nèi)容講解數(shù)據(jù)預(yù)處理框架的實(shí)現(xiàn)方法,先根據(jù)部署的網(wǎng)絡(luò)類型設(shè)計(jì)硬件結(jié)構(gòu),選取合適的微控制器和外設(shè)等,隨后根據(jù)前文所闡述的兩種神經(jīng)網(wǎng)絡(luò)模型的數(shù)據(jù)處理方法來制定程序算法。同時(shí)該節(jié)內(nèi)容也介紹如何將預(yù)處理框架嵌入已有的硬件系統(tǒng)中,以及框架后續(xù)功能擴(kuò)展的思路和嘗試等。
搭建硬件系統(tǒng)時(shí)需要重點(diǎn)注意匹配兩個(gè)方面的內(nèi)容:
一是硬件系統(tǒng)的實(shí)際功能,若是項(xiàng)目設(shè)計(jì)時(shí)開發(fā)的系統(tǒng)是針對圖像進(jìn)行識別的話,在設(shè)備上就不需要增加一些與功能不相關(guān)的設(shè)備如麥克風(fēng)、電機(jī)等;二是考慮系統(tǒng)穩(wěn)定運(yùn)行時(shí)的性能要求,神經(jīng)網(wǎng)絡(luò)模型的運(yùn)算大多都牽涉到浮點(diǎn)數(shù)和矩陣的運(yùn)算,開發(fā)初期就應(yīng)明確芯片對浮點(diǎn)數(shù)的處理能力,系統(tǒng)正常運(yùn)行時(shí)是否需要進(jìn)行高強(qiáng)度高密度的計(jì)算任務(wù),確定適不適宜裝載預(yù)處理框架等。
本次搭建和測試預(yù)處理框架所選用的硬件如圖1 所示,該產(chǎn)品的核心采用了Cortex-M4 架構(gòu)的STM32F407微控制器,其內(nèi)部包含浮點(diǎn)運(yùn)算單元(Floating Point Unit,F(xiàn)PU)和DCMI 數(shù)字圖像采集接口,大大提高了對浮點(diǎn)數(shù)運(yùn)算和讀寫圖像的速度;另外開發(fā)板中已經(jīng)集成了Wifi 和Bluetooth 等通信模塊,搭載預(yù)處理框架后無需再外接設(shè)備就能將采集到的聲音或圖像信息直接傳送到附近物聯(lián)網(wǎng)系統(tǒng)的網(wǎng)關(guān)單元中。
圖1 搭載預(yù)處理框架的開發(fā)板
另一方面,若是有需求在原有的物聯(lián)網(wǎng)系統(tǒng)上進(jìn)行改造升級的,則需評估以下內(nèi)容:原有微控制器的性能是否能滿足要求;原有的硬件設(shè)備是否留有足夠的接口進(jìn)行擴(kuò)展;原有的系統(tǒng)是否已經(jīng)配備了通信模塊,是否需要額外增加多種通信方式;是否有擴(kuò)展外部存儲空間,存儲空間的大小是否合適。當(dāng)滿足了改造的條件之后,再根據(jù)神經(jīng)網(wǎng)絡(luò)模型的類型來增加必要外設(shè),即可完成原有系統(tǒng)的改造了。
預(yù)處理框架中軟件層面上的核心則是實(shí)現(xiàn)數(shù)據(jù)預(yù)處理方法的代碼化,簡而言之就是將文字方法和公式轉(zhuǎn)化成可執(zhí)行的代碼,至于對何種預(yù)處理方法進(jìn)行轉(zhuǎn)換則要根據(jù)實(shí)際的開發(fā)情況而定。本節(jié)對前文中卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)講解的預(yù)處理方法進(jìn)行程序的算法設(shè)計(jì),如圖2、圖3 所示。
圖2 圖片數(shù)據(jù)預(yù)處理程序算法
圖3 文本數(shù)據(jù)預(yù)處理程序算法
圖2 是針對卷積神經(jīng)網(wǎng)絡(luò)中常規(guī)的圖片預(yù)處理程序的算法過程,在實(shí)際的測試環(huán)節(jié)中,使用本文搭建的硬件系統(tǒng)進(jìn)行測試,處理一張200 萬像素的三通道圖像總共耗時(shí)約30ms,該處理速度已經(jīng)符合了現(xiàn)實(shí)生活中大部分應(yīng)用場景中的性能要求了。
同理,圖3 為循環(huán)神經(jīng)網(wǎng)絡(luò)模型的數(shù)據(jù)預(yù)處理程序算法,根據(jù)項(xiàng)目開發(fā)時(shí)設(shè)定的輸入序列結(jié)構(gòu)來選擇獨(dú)熱向量或者是映射后的序列作為程序的處理結(jié)果發(fā)送到上層應(yīng)用。在實(shí)際的測試中框架的運(yùn)行效果會隨著使用的字典大小變化而產(chǎn)生波動(dòng),若是模型使用字典的詞匯量較大,不對輸入進(jìn)行獨(dú)熱編碼而是直接發(fā)送映射后的序列顯然占用硬件系統(tǒng)的資源更少,發(fā)送速度更快,反之獨(dú)熱編碼的處理結(jié)果更合適字典容量較小的情況。
基于前文對預(yù)處理框架的設(shè)計(jì)思路,將編輯好的代碼燒錄到開發(fā)板中作為傳感節(jié)點(diǎn),實(shí)現(xiàn)對預(yù)處理框架的性能測試;通過節(jié)點(diǎn)處理采集到的圖像或序列數(shù)據(jù),然后傳送到已經(jīng)部署神經(jīng)網(wǎng)絡(luò)模型的上位機(jī)中進(jìn)行推導(dǎo),觀察和評估預(yù)處理框架的實(shí)際運(yùn)行效果。
(1)CNN 環(huán)境下的測試 本次測試在卷積神經(jīng)網(wǎng)絡(luò)的環(huán)境下選用的模型是YOLO 算法,對目標(biāo)環(huán)境進(jìn)行實(shí)時(shí)的、多角度的識別和監(jiān)控。該測試系統(tǒng)的監(jiān)控頻率為30Hz,傳感節(jié)點(diǎn)通過攝像頭OV2640 獲取圖像信息,圖像分辨率設(shè)置為800×600,實(shí)際的運(yùn)行結(jié)果如圖4 所示。
圖4 雙模式的識別效果對比
圖4a 顯示圖像為常規(guī)系統(tǒng)的識別結(jié)果,圖4b 則是在加載了預(yù)處理框架后的檢測圖像。在實(shí)際觀察中兩種模式都能穩(wěn)定的保持30Hz 的刷新頻率。同樣的為了驗(yàn)證預(yù)處理框架是否會影響神經(jīng)網(wǎng)絡(luò)模型推導(dǎo)的準(zhǔn)確率,本次測試分別統(tǒng)計(jì)了3 000 次、5 000 次與10 000 次的推導(dǎo),對比兩種模式下的識別情況,具體數(shù)據(jù)見表1。
表1 雙模式準(zhǔn)確率對比
由以上的數(shù)據(jù)可看出在搭載預(yù)處理框架的情況下,模型的準(zhǔn)確率仍然能夠保持95%以上,再結(jié)合實(shí)際的運(yùn)行效果,可以得出結(jié)論:在目前的設(shè)置下,將圖像識別中數(shù)據(jù)預(yù)處理的步驟放到速度較慢的傳感器節(jié)點(diǎn)中,不但不會影響監(jiān)控系統(tǒng)運(yùn)行,上層服務(wù)器還能釋放出的部分性能,在后續(xù)的維護(hù)中加以利用,進(jìn)一步優(yōu)化網(wǎng)絡(luò)模型的結(jié)構(gòu),提高系統(tǒng)的表現(xiàn)。
(2)RNN 環(huán)境下的測試 在針對循環(huán)神經(jīng)網(wǎng)絡(luò)的工作環(huán)境中,本次測試選用了經(jīng)典的Seq2Seq 模型來實(shí)現(xiàn)機(jī)器翻譯的應(yīng)用。此時(shí)通過串口向傳感節(jié)點(diǎn)發(fā)送需要翻譯的句子,節(jié)點(diǎn)在處理輸入數(shù)據(jù)后將序列信息發(fā)送到神經(jīng)網(wǎng)絡(luò)模型進(jìn)行推導(dǎo)翻譯,其效果如圖5 所示。
圖5 翻譯效果圖
從圖5 可看到在傳送節(jié)點(diǎn)中輸入需要翻譯的英文句子后,節(jié)點(diǎn)通過預(yù)處理框架將句子整理成長度為20 的序列信息發(fā)送到上層應(yīng)用,最終經(jīng)過算法推導(dǎo)得到正確的翻譯結(jié)果。在這里由于本次使用的字典容量為1k,若對輸入序列進(jìn)行獨(dú)熱編碼并直接發(fā)送獨(dú)熱向量會對節(jié)點(diǎn)造成不必要的資源浪費(fèi),故系統(tǒng)在正常運(yùn)行時(shí)僅傳輸了與單詞對應(yīng)的詞匯編號。
前文已經(jīng)通過測試初步實(shí)現(xiàn)了預(yù)處理框架在人工智能物聯(lián)網(wǎng)中的應(yīng)用,在實(shí)際的工業(yè)設(shè)計(jì)中還能根據(jù)任務(wù)需求的改動(dòng)進(jìn)行功能的擴(kuò)展[3],本節(jié)內(nèi)容先是評估了測試系統(tǒng)在執(zhí)行框架后的剩余資源和整體性能,分別提出了在框架中增加中數(shù)據(jù)增強(qiáng)和詞嵌入矩陣的兩種功能設(shè)計(jì)思路。
先是適用于卷積神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)增強(qiáng)功能,它是一種提高模型泛化能力的有效手段,原理是修改原始數(shù)據(jù),包括對圖像進(jìn)行旋轉(zhuǎn)、平移、錯(cuò)切或縮放等一系列操作,從而加入新的訓(xùn)練數(shù)據(jù),在后期對卷積神經(jīng)網(wǎng)絡(luò)模型的權(quán)重參數(shù)更新的時(shí)候會有更加積極的作用,預(yù)防過擬合的出現(xiàn),而在程序的改動(dòng)中只需要簡單的調(diào)整圖片的特征值即可。
這里使用了前文YOLO 監(jiān)控系統(tǒng),在程序代碼中設(shè)定為每10min 一次,截取當(dāng)前畫面進(jìn)行處理并保存到本地存儲,作為下次模型優(yōu)化時(shí)的訓(xùn)練集數(shù)據(jù)。該功能對截取的圖片進(jìn)行一系列的修改,如旋轉(zhuǎn)或鏡像等,以保證數(shù)據(jù)集的多樣式。
另一方面循環(huán)神經(jīng)網(wǎng)絡(luò)的擴(kuò)展功能則是嘗試將詞嵌入矩陣加入到框架當(dāng)中,由于深度學(xué)習(xí)在常規(guī)的自然語言處理應(yīng)用中會加入詞嵌入層,對輸入端的獨(dú)熱向量進(jìn)行降維,獲得包含豐富特性信息的稠密向量來進(jìn)行推導(dǎo),而詞嵌入層本質(zhì)是一個(gè)矩陣,其內(nèi)部數(shù)據(jù)在前期訓(xùn)練結(jié)束后便長期保持,直至下一次模型的更新或修改,因此利用這個(gè)特點(diǎn)可嘗試將其存放在本地存儲中,預(yù)處理框架可根據(jù)獨(dú)熱向量查找到對應(yīng)特征詞的稠密向量作為最后的處理結(jié)果,發(fā)送到上層應(yīng)用[4]。
本文講解了數(shù)據(jù)預(yù)處理框架的設(shè)計(jì)步驟,分別采用了卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)兩種模型中常見的預(yù)處理方法作為框架中程序的核心算法,部署在以STM32F407微控制器為核心的硬件設(shè)備中進(jìn)行測試,并提出了若干個(gè)功能擴(kuò)展的思路。在實(shí)際的工業(yè)環(huán)境中使用該數(shù)據(jù)預(yù)處理框架有諸多的好處,除了能提高神經(jīng)網(wǎng)絡(luò)模型的推導(dǎo)效率,提供多種途徑增強(qiáng)和優(yōu)化數(shù)據(jù)便于項(xiàng)目后期的維護(hù)和更新,還能對現(xiàn)有的硬件系統(tǒng)進(jìn)行適配,從而進(jìn)行人工智能項(xiàng)目的部署,降低研發(fā)的成本和門檻,還能讓深度學(xué)習(xí)的技術(shù)進(jìn)一步普及到更多的應(yīng)用場景,促進(jìn)物聯(lián)網(wǎng)向人工智能物聯(lián)網(wǎng)方向發(fā)展與壯大[5]。