黎海濤,劉 鳴,張 帥
(1.北京工業(yè)大學(xué) 信息學(xué)部,北京 100124;2.北京工業(yè)大學(xué) 樊恭烋榮譽(yù)學(xué)院,北京 100124)
隨著科學(xué)技術(shù)的不斷發(fā)展,電子設(shè)備和人們生活的關(guān)系越發(fā)緊密,人與機(jī)器間交流的信息更加豐富,急需研究開(kāi)發(fā)方便、可靠的人機(jī)交互系統(tǒng)。作為一種新型人機(jī)交互方式,手勢(shì)識(shí)別允許用戶在不接觸設(shè)備的情況下通過(guò)簡(jiǎn)單的手勢(shì)來(lái)控制設(shè)備,在操作方式上更加直觀和自然,交互方式更加人性化[1],具有廣泛的應(yīng)用前景。
手勢(shì)識(shí)別是模式識(shí)別的一個(gè)分支,其實(shí)現(xiàn)需要通過(guò)算法來(lái)檢測(cè)人類(lèi)的手勢(shì)動(dòng)作。傳統(tǒng)的手勢(shì)識(shí)別方法有模板匹配法[2]和Hu不變矩法[3]。模板匹配法是先準(zhǔn)備好手勢(shì)的模板,當(dāng)有圖像輸入時(shí),使用模板來(lái)逐行掃描整個(gè)圖像,每次掃描就計(jì)算一次相關(guān)度,當(dāng)相關(guān)度超過(guò)設(shè)定閾值時(shí)就判定檢測(cè)到模板中的手勢(shì)。該方法的優(yōu)點(diǎn)是算法簡(jiǎn)單、計(jì)算量較低,缺點(diǎn)是若手勢(shì)發(fā)生旋轉(zhuǎn)或者縮放則無(wú)法正確檢測(cè),故實(shí)用性低。Hu不變矩法通過(guò)計(jì)算圖像的不變矩進(jìn)行識(shí)別,具有平移、旋轉(zhuǎn)、放縮不變的性質(zhì),即使圖像中的手勢(shì)發(fā)生變化也能進(jìn)行檢測(cè),因而實(shí)用性更高,但是當(dāng)目標(biāo)紋理復(fù)雜時(shí)準(zhǔn)確率較低,不適用于復(fù)雜環(huán)境。
隨著深度學(xué)習(xí)技術(shù)的不斷發(fā)展,神經(jīng)網(wǎng)絡(luò)被成功應(yīng)用于手勢(shì)識(shí)別系統(tǒng),其識(shí)別準(zhǔn)確率高于模板匹配法、Hu不變矩法,且在復(fù)雜背景下的魯棒性更強(qiáng)。因此,越來(lái)越多的手勢(shì)識(shí)別系統(tǒng)采用神經(jīng)網(wǎng)絡(luò)進(jìn)行識(shí)別,成為當(dāng)前的主流技術(shù)。雖然神經(jīng)網(wǎng)絡(luò)法具有很高的準(zhǔn)確率,但其運(yùn)行需要進(jìn)行大量運(yùn)算,這對(duì)系統(tǒng)的性能和功耗提出了很高要求,所以目前神經(jīng)網(wǎng)絡(luò)大都部署在桌面級(jí)平臺(tái),而難以應(yīng)用于嵌入式設(shè)備中。
為了把手勢(shì)識(shí)別系統(tǒng)部署于嵌入式平臺(tái),研究人員開(kāi)展了很多工作,其中基于現(xiàn)場(chǎng)可編程門(mén)陣列(field programmable gate array,FPGA)平臺(tái)搭建神經(jīng)網(wǎng)絡(luò)成為一種新的嘗試。利用FPGA高速并行數(shù)據(jù)處理的特性,達(dá)到加快處理速度同時(shí)降低功耗的效果[4]。文獻(xiàn)[5]把徑向基函數(shù)網(wǎng)絡(luò)部署在FPGA平臺(tái)上,實(shí)現(xiàn)了對(duì)24種手語(yǔ)的識(shí)別,在保持高識(shí)別率的同時(shí)壓縮了系統(tǒng)體積。文獻(xiàn)[6]利用FPGA設(shè)計(jì)了一個(gè)神經(jīng)網(wǎng)絡(luò)加速器,在功耗只有GPU的26.7%的情況下,運(yùn)行速度提高了5倍。然而上述研究?jī)H采用結(jié)構(gòu)簡(jiǎn)單的網(wǎng)絡(luò),而實(shí)際應(yīng)用中由于識(shí)別環(huán)境的復(fù)雜性和多樣性,簡(jiǎn)單結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)存在無(wú)法準(zhǔn)確識(shí)別的問(wèn)題。因此,需要研究如何利用FPGA實(shí)現(xiàn)基于深度神經(jīng)網(wǎng)絡(luò)的手勢(shì)識(shí)別。
由于利用FPGA器件設(shè)計(jì)深層神經(jīng)網(wǎng)絡(luò)需要耗費(fèi)較大成本,導(dǎo)致實(shí)現(xiàn)復(fù)雜神經(jīng)網(wǎng)絡(luò)存在困難,因此采用集成的處理單元來(lái)實(shí)現(xiàn)深層網(wǎng)絡(luò)就成為新的合理選擇。賽靈思公司于2019年發(fā)布了深度學(xué)習(xí)處理單元(deep-learning processor,DPU),為FPGA部署深度神經(jīng)網(wǎng)絡(luò)提供了新的解決方案?;诖?,本文利用DPU把ResNet-50網(wǎng)絡(luò)部署于FPGA器件,設(shè)計(jì)了一個(gè)低功耗的手勢(shì)識(shí)別系統(tǒng),以解決基于深度神經(jīng)網(wǎng)絡(luò)的嵌入式FPGA手勢(shì)識(shí)別問(wèn)題。
嵌入式FPGA手勢(shì)識(shí)別系統(tǒng)的結(jié)構(gòu)如圖1所示,采用軟件和硬件相結(jié)合的方法在ZYNQ平臺(tái)上進(jìn)行設(shè)計(jì)。由于ZYNQ內(nèi)部包含可編程邏輯(programmable logic,PL)和處理系統(tǒng)(processing system,PS),所以設(shè)計(jì)分為硬件和軟件兩部分進(jìn)行。硬件設(shè)計(jì)包括DPU部署、神經(jīng)網(wǎng)絡(luò),軟件設(shè)計(jì)包括Linux系統(tǒng)、應(yīng)用程序。
圖1 系統(tǒng)結(jié)構(gòu)
在嵌入式FPGA手勢(shì)識(shí)別系統(tǒng)中,DPU部署單元對(duì)DPU相關(guān)參數(shù)進(jìn)行配置,將其部署在ZYNQ的PL端,為運(yùn)行神經(jīng)網(wǎng)絡(luò)搭建硬件平臺(tái)。神經(jīng)網(wǎng)絡(luò)單元構(gòu)建并訓(xùn)練深度神經(jīng)網(wǎng)絡(luò),并對(duì)網(wǎng)絡(luò)進(jìn)行量化和編譯操作,得到可以被DPU讀取和運(yùn)行的神經(jīng)網(wǎng)絡(luò)文件。PS端的Linux系統(tǒng)單元在系統(tǒng)中添加DPU驅(qū)動(dòng)和相關(guān)運(yùn)行庫(kù),并對(duì)設(shè)備樹(shù)進(jìn)行修改來(lái)確保DPU能正確運(yùn)行,為應(yīng)用程序搭建好軟件平臺(tái)。應(yīng)用程序單元對(duì)DPU進(jìn)行初始化并創(chuàng)建DPU任務(wù),調(diào)用神經(jīng)網(wǎng)絡(luò)模型對(duì)手勢(shì)圖像進(jìn)行識(shí)別。
整個(gè)嵌入式手勢(shì)識(shí)別系統(tǒng)的工作流程為:PS端運(yùn)行嵌入式Linux系統(tǒng),通過(guò)程序?qū)κ謩?shì)圖片進(jìn)行預(yù)處理,同時(shí)對(duì)DPU進(jìn)行初始化操作,然后將處理后的圖像傳遞給PL端的DPU;DPU調(diào)用神經(jīng)網(wǎng)絡(luò)模型對(duì)接收到的圖像進(jìn)行識(shí)別,然后將識(shí)別結(jié)果返回PS,最后通過(guò)串口或以太網(wǎng)將結(jié)果輸出到主機(jī)。
下面針對(duì)所提基于DPU的手勢(shì)識(shí)別系統(tǒng),給出各個(gè)功能單元的設(shè)計(jì)方法。
DPU是一個(gè)針對(duì)卷積神經(jīng)網(wǎng)絡(luò)優(yōu)化過(guò)的計(jì)算單元,它采用流水線結(jié)構(gòu),內(nèi)部集成了大量加法器、乘法器、非線性器等神經(jīng)網(wǎng)絡(luò)所需要的運(yùn)算單元,可以支持和運(yùn)行各種卷積神經(jīng)網(wǎng)絡(luò),適用于深層網(wǎng)絡(luò)的部署。DPU被部署在ZYNQ設(shè)備的PL中,并通過(guò)AXI總線與PS進(jìn)行通信和數(shù)據(jù)交互。
為了適應(yīng)不同項(xiàng)目的需求,DPU可以對(duì)一些參數(shù)進(jìn)行設(shè)置,包括DPU核心數(shù)、DPU架構(gòu)、RAM利用率、通道擴(kuò)展、深度卷積、平均池化等,通過(guò)修改這些參數(shù)可以根據(jù)硬件資源的不同優(yōu)化資源配置,達(dá)到提高PL利用率的效果。DPU的配置信息如表1所示。
表1 DPU配置
DPU最多可以設(shè)置3個(gè)核心,由于其為流水線結(jié)構(gòu),多個(gè)核心可以帶來(lái)更快的處理速度,但同時(shí)也會(huì)消耗更多的硬件資源。由于實(shí)驗(yàn)平臺(tái)硬件資源限制,本設(shè)計(jì)只使用1個(gè)DPU核心。DPU可以設(shè)置不同的卷積結(jié)構(gòu),如B512、B800、B1024、B1152、B1600、B2304、B3136、B4096等。并行度高的卷積結(jié)構(gòu)的處理速度更快,本文選用B1152結(jié)構(gòu)。在DPU運(yùn)行時(shí)片上RAM會(huì)緩存網(wǎng)絡(luò)的權(quán)重、參數(shù)等信息,高RAM利用率可以為DPU帶來(lái)更大的片上存儲(chǔ),也可以一定程度提高系統(tǒng)性能,由于片上RAM不足,本文設(shè)置為低利用率。
通道擴(kuò)展可以提高DPU的處理效率,當(dāng)輸入通道數(shù)低于總通道數(shù)時(shí),神經(jīng)網(wǎng)絡(luò)無(wú)法完全使用所有可用的硬件通道,故本設(shè)計(jì)采用通道擴(kuò)展以提高DPU的性能。深度卷積可以降低卷積操作時(shí)的參數(shù)量和運(yùn)算成本,考慮到深度卷積操作會(huì)降低并行度,本設(shè)計(jì)中不采用深度卷積。DPU的平均池化可以支持2×2到8×8的池化范圍,本文采用平均池化。ReLU類(lèi)型可以設(shè)置DPU執(zhí)行哪種激活函數(shù),我們采用ReLU和ReLU6作為激活函數(shù)。
DPU使用了雙數(shù)據(jù)率技術(shù)來(lái)提高性能,因此需要輸入2個(gè)時(shí)鐘,一個(gè)時(shí)鐘是通用邏輯工作所需,另一個(gè)2倍頻時(shí)鐘是DSP工作所需??紤]到開(kāi)發(fā)板的實(shí)際供電能力,本文選擇150 MHz作為通用邏輯工作時(shí)鐘,300 MHz作為DSP工作時(shí)鐘。DPU通過(guò)AXI總線與PS進(jìn)行通信,當(dāng)參數(shù)設(shè)置完成后,需要給AXI從機(jī)接口分配地址,這些地址在系統(tǒng)被DPU驅(qū)動(dòng)和設(shè)備樹(shù)所調(diào)用。DPU的地址分配如表2所示。
表2 DPU的地址分配
本文采用文獻(xiàn)[7]給出的ResNet-50網(wǎng)絡(luò)作為運(yùn)行于DPU端的神經(jīng)網(wǎng)絡(luò)模型。ResNet網(wǎng)絡(luò)能夠簡(jiǎn)化深層網(wǎng)絡(luò)的訓(xùn)練過(guò)程,使深層網(wǎng)絡(luò)在擁有較少參數(shù)的同時(shí)保持很高的準(zhǔn)確率,適合在嵌入式設(shè)備中使用。以ResNet-152網(wǎng)絡(luò)為例,即使它的網(wǎng)絡(luò)深度遠(yuǎn)高于VGG網(wǎng)絡(luò),卻只有很低的參數(shù)數(shù)量。
ResNet在網(wǎng)絡(luò)結(jié)構(gòu)上引入殘差的概念,允許原始輸入的信息不經(jīng)過(guò)下一層而直接傳遞到后面的層中,在一定程序上保護(hù)了信息的完整性。ResNet的殘差單元如圖2所示。用x表示輸入,F(xiàn)(x)表示原始的映射,則引入殘差結(jié)構(gòu)后,原始的映射變化為F(x)+x。如果實(shí)際所需要的映射為P(x),則只需讓原始映射F(x)=P(x)-x就可以達(dá)到和正常網(wǎng)絡(luò)一樣的結(jié)果。這說(shuō)明殘差網(wǎng)絡(luò)結(jié)構(gòu)不影響正常網(wǎng)絡(luò)的識(shí)別準(zhǔn)確率,但是可以更容易被訓(xùn)練和優(yōu)化,簡(jiǎn)化了深度網(wǎng)絡(luò)訓(xùn)練的難度。
圖2 ResNet的殘差單元
不同層數(shù)的ResNet網(wǎng)絡(luò)有不同的結(jié)構(gòu),但從整體上看ResNet網(wǎng)絡(luò)結(jié)構(gòu)相對(duì)固定,都是由上述的殘差模塊堆疊在一起實(shí)現(xiàn)的。ResNet-50網(wǎng)絡(luò)結(jié)構(gòu)如表3所示。除了Conv1卷積層外,其他4個(gè)卷積層均只使用1×1和3×3卷積核,輸入數(shù)據(jù)經(jīng)過(guò)卷積層后再和自身進(jìn)行殘差處理,使得網(wǎng)絡(luò)更容易被訓(xùn)練。
表3 ResNet-50網(wǎng)絡(luò)結(jié)構(gòu)
由于神經(jīng)網(wǎng)絡(luò)使用浮點(diǎn)數(shù)對(duì)網(wǎng)絡(luò)的權(quán)重進(jìn)行存儲(chǔ),而FPGA因其硬件的特性,只能使用定點(diǎn)數(shù),所以需要將浮點(diǎn)神經(jīng)網(wǎng)絡(luò)模型量化為定點(diǎn)神經(jīng)網(wǎng)絡(luò)模型。同時(shí),由于定點(diǎn)網(wǎng)絡(luò)模型運(yùn)行時(shí)的計(jì)算復(fù)雜度低,所以相比浮點(diǎn)網(wǎng)絡(luò)模型能帶來(lái)更快的速度和更高的能量效率,能有效地降低功耗。本文采用深度壓縮工具(deep compression tool,DECENT)對(duì)網(wǎng)絡(luò)進(jìn)行量化操作,得到8位定點(diǎn)網(wǎng)絡(luò)模型。
由于DPU無(wú)法直接讀取定點(diǎn)網(wǎng)絡(luò)模型,故需要對(duì)模型進(jìn)行編譯。本文利用深度神經(jīng)網(wǎng)絡(luò)編譯器(deep neural network compiler,DNNC)來(lái)編譯量化后的網(wǎng)絡(luò),得到DPU的可執(zhí)行文件。
由于DPU被部署于PL,若程序需調(diào)用DPU,就需要在系統(tǒng)中進(jìn)行相關(guān)配置。Linux系統(tǒng)部分負(fù)責(zé)添加DPU驅(qū)動(dòng)和運(yùn)行庫(kù),并根據(jù)DPU對(duì)設(shè)備樹(shù)進(jìn)行修改,為手勢(shì)識(shí)別定制嵌入式系統(tǒng)。
DPU運(yùn)行時(shí)需要調(diào)用系統(tǒng)內(nèi)的相關(guān)驅(qū)動(dòng)。為了讓其能夠正確運(yùn)行,需要把DPU驅(qū)動(dòng)添加到系統(tǒng)中。為了方便程序的開(kāi)發(fā),賽靈思公司提供了一套DPU運(yùn)行庫(kù),其包含了DPU相關(guān)的API函數(shù),簡(jiǎn)化了底層器件的復(fù)雜性,可以加速DPU程序開(kāi)發(fā),故把這套運(yùn)行庫(kù)添加到系統(tǒng)中。
為能讓系統(tǒng)正確加載DPU驅(qū)動(dòng),我們?cè)谠O(shè)備樹(shù)中針對(duì)DPU設(shè)置進(jìn)行修改,包括寄存器地址、中斷號(hào)等,使得這些參數(shù)和硬件邏輯設(shè)計(jì)中的配置完全相同,確保DPU驅(qū)動(dòng)的正常工作。DPU的寄存器地址是指DPU被分配的基本地址,根據(jù)硬件邏輯設(shè)計(jì),本文分配的DPU寄存器地址為0x40000000。設(shè)備樹(shù)中DPU的中斷描述由3部分組成,它們包含了硬件邏輯設(shè)計(jì)中DPU的中斷信息。第1部分表示中斷類(lèi)型,0x0代表共享外圍中斷(shared peripheral interrupt,SPI),0x1代表處理器到處理器中斷(processor to processor interrupt,PPI),本文使用SPI中斷。第2部分表示系統(tǒng)中斷的狀態(tài)位,ZYNQ的SPI中斷如表4所示。由于DPU部署時(shí)使用的中斷為IRQ_F2P[0],從表中可以得到這個(gè)信號(hào)將觸發(fā)61號(hào)中斷,對(duì)應(yīng)的狀態(tài)位為29,故本文的中斷狀態(tài)位為29。第3部分表示中斷觸發(fā)方式,0x1指上升沿觸發(fā),0x2指下降沿觸發(fā),0x4指高電平觸發(fā),0x8指低電平觸發(fā),本文使用高電平觸發(fā)。
表4 ZYNQ的共享外圍中斷
應(yīng)用程序負(fù)責(zé)為DPU創(chuàng)建任務(wù),通過(guò)相關(guān)API函數(shù)調(diào)用ResNet-50網(wǎng)絡(luò)對(duì)手勢(shì)圖像進(jìn)行識(shí)別。程序流程如圖3所示。首先打開(kāi)DPU,這一步將初始化DPU內(nèi)核并加載驅(qū)動(dòng);其次加載編譯后的神經(jīng)網(wǎng)絡(luò)模型,為模型分配DPU內(nèi)核;再次將DPU內(nèi)核實(shí)例化,為神經(jīng)網(wǎng)絡(luò)創(chuàng)建DPU任務(wù);然后運(yùn)行DPU,將圖像送入DPU內(nèi)核中進(jìn)行處理;最后按照相反的順序依次銷(xiāo)毀DPU任務(wù)和DPU內(nèi)核,關(guān)閉DPU并釋放資源。由于在實(shí)驗(yàn)所用平臺(tái)的DPU不支持Softmax操作,所以先計(jì)算Softmax,從而得到識(shí)別結(jié)果。
圖3 程序流程
DPU的應(yīng)用程序是一種異構(gòu)程序,它包含在PS中ARM上運(yùn)行的代碼和在PL中DPU上運(yùn)行的代碼。由于電腦的處理器為X86架構(gòu),而ZYNQ上的PS為ARM架構(gòu),所以若直接在電腦上編譯應(yīng)用程序,得到的文件將無(wú)法在PS上運(yùn)行,這是由于處理器結(jié)構(gòu)不同所導(dǎo)致的。為了生成能在PS上運(yùn)行的文件,需要對(duì)代碼進(jìn)行交叉編譯。本文利用G++編譯器對(duì)應(yīng)用程序進(jìn)行編譯,得到可被ARM執(zhí)行的文件。同時(shí),利用DNNC編譯器對(duì)深度學(xué)習(xí)模型進(jìn)行編譯,得到可被DPU執(zhí)行的文件。當(dāng)編譯完成后把這兩個(gè)文件鏈接在一起,生成一個(gè)可以被ZYNQ執(zhí)行的文件,該文件包含ARM和DPU運(yùn)行的所有必需信息。
根據(jù)前述設(shè)計(jì)方案,本文研制出一套基于DPU的嵌入式手勢(shì)識(shí)別原型系統(tǒng),下面給出該系統(tǒng)實(shí)驗(yàn)結(jié)果。
本文用黑金AX7020開(kāi)發(fā)板作為硬件平臺(tái),其FPGA芯片為Zynq XC7Z020,采用軟件和硬件相結(jié)合的方法進(jìn)行DPU的部署。先用Vivado設(shè)計(jì)套件在PL端搭建硬件平臺(tái),再用PetaLinux設(shè)計(jì)工具在PS端搭建軟件平臺(tái)。然后,利用Caffe框架訓(xùn)練深度學(xué)習(xí)模型后,用DECENT工具對(duì)模型進(jìn)行量化,最后用DNNC工具編譯量化的神經(jīng)網(wǎng)絡(luò)模型。
本文采用的數(shù)據(jù)集如圖4所示,共4 800張圖片,包含了手勢(shì)0到手勢(shì)5這6種手勢(shì),其中訓(xùn)練數(shù)據(jù)集有4 320張圖片,測(cè)試數(shù)據(jù)集有480張圖片。
圖4 數(shù)據(jù)集圖片
訓(xùn)練中使用的參數(shù)為:固定學(xué)習(xí)率為 0.001,批量大小10,迭代次數(shù)3 000次,momentum為0.9,weight_decay為0.000 1。由于數(shù)據(jù)集數(shù)量較少,采用Finetune方法進(jìn)行訓(xùn)練[8],使用在ImageNet數(shù)據(jù)集上預(yù)訓(xùn)練的權(quán)重作為網(wǎng)絡(luò)的初始權(quán)重。
實(shí)驗(yàn)原型系統(tǒng)由邏輯電路、軟件平臺(tái)、神經(jīng)網(wǎng)絡(luò)和應(yīng)用程序組成。邏輯電路部分負(fù)責(zé)系統(tǒng)的硬件平臺(tái)設(shè)計(jì),將DPU部署到PL,為運(yùn)行神經(jīng)網(wǎng)絡(luò)做好硬件基礎(chǔ)。軟件平臺(tái)部分負(fù)責(zé)進(jìn)行嵌入式Linux系統(tǒng)的設(shè)計(jì),針對(duì)系統(tǒng)的特點(diǎn)和需求定制Linux系統(tǒng),為運(yùn)行應(yīng)用程序做好軟件基礎(chǔ)。神經(jīng)網(wǎng)絡(luò)部分負(fù)責(zé)設(shè)計(jì)在DPU上運(yùn)行的神經(jīng)網(wǎng)絡(luò),通過(guò)對(duì)訓(xùn)練后的網(wǎng)絡(luò)進(jìn)行量化和編譯操作,得到能被DPU讀取和運(yùn)行的可執(zhí)行文件。應(yīng)用程序部分負(fù)責(zé)設(shè)計(jì)在嵌入式Linux系統(tǒng)上運(yùn)行的程序,該程序?qū)⑹謩?shì)圖片送入DPU中進(jìn)行處理,得到手勢(shì)的識(shí)別結(jié)果。
系統(tǒng)的實(shí)驗(yàn)步驟如圖5所示。第一步是創(chuàng)建硬件平臺(tái),使用Vivado設(shè)計(jì)套件進(jìn)行可編程邏輯電路的設(shè)計(jì),生成包含硬件配置信息的HDF文件。第二步是搭建軟件平臺(tái),使用PetaLinux開(kāi)發(fā)工具導(dǎo)入硬件配置信息,在嵌入式Linux系統(tǒng)內(nèi)核中添加DPU驅(qū)動(dòng)和運(yùn)行庫(kù),生成系統(tǒng)的啟動(dòng)文件boot.bin、image.ub和根目錄sysroot。第三步是量化和編譯神經(jīng)網(wǎng)絡(luò)模型,使用Caffe框架訓(xùn)練手勢(shì)識(shí)別神經(jīng)網(wǎng)絡(luò)模型,然后通過(guò)DECENT和DNNC工具對(duì)模型進(jìn)行量化和編譯操作,得到量化的神經(jīng)網(wǎng)絡(luò)模型。第四步是編寫(xiě)應(yīng)用程序,調(diào)用DPU內(nèi)核進(jìn)行圖像識(shí)別,然后將量化后的網(wǎng)絡(luò)模型、應(yīng)用程序、sysroot進(jìn)行交叉編譯,最后得到可以在Linux系統(tǒng)中運(yùn)行的可執(zhí)行文件。
圖5 實(shí)驗(yàn)步驟
部署DPU所使用的FPGA資源如表5所示。由于神經(jīng)網(wǎng)絡(luò)運(yùn)行時(shí)需要使用DSP對(duì)數(shù)據(jù)進(jìn)行處理,實(shí)驗(yàn)中DSP的使用率達(dá)到了88.18%。同時(shí)為了提高運(yùn)算速度,DPU會(huì)將中間參數(shù)存儲(chǔ)在BRAM中,這也導(dǎo)致BRAM的使用率達(dá)到83.93%。LUT資源消耗和DPU結(jié)構(gòu)息息相關(guān),受到LUT資源的限制,本文只使用B1152結(jié)構(gòu)而沒(méi)有選擇更高性能的結(jié)構(gòu)。
表5 FPGA資源利用率
在數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果如圖6所示,圖中顯示了識(shí)別時(shí)間、系統(tǒng)性能、置信度、識(shí)別結(jié)果等主要參數(shù)。從圖中可以看出該神經(jīng)網(wǎng)絡(luò)每次運(yùn)行需要花費(fèi)約59.7 ms,識(shí)別幀率可達(dá)到16幀/s。由于ResNet-50網(wǎng)絡(luò)運(yùn)行一次需要進(jìn)行7.71×109的運(yùn)算操作,通過(guò)計(jì)算可以得出本系統(tǒng)的性能為129 GOPS。
圖6 手勢(shì)圖片識(shí)別結(jié)果
DPU對(duì)測(cè)試集圖片的識(shí)別結(jié)果為:在480張測(cè)試圖片中,469張圖片被正確識(shí)別,11張圖片被錯(cuò)誤識(shí)別,識(shí)別的準(zhǔn)確率為97.7%。與浮點(diǎn)神經(jīng)網(wǎng)絡(luò)98.2%準(zhǔn)確率相比,量化后神經(jīng)網(wǎng)絡(luò)的識(shí)別率基本相同。這說(shuō)明使用DECENT工具進(jìn)行量化操作對(duì)網(wǎng)絡(luò)的準(zhǔn)確率不會(huì)造成太大的影響。
表6從網(wǎng)絡(luò)模型、硬件平臺(tái)、性能、功耗、能效比等方面與另外3種在FPGA上實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的方法進(jìn)行比較。由于高功耗一般會(huì)產(chǎn)生高性能,而不同方法間使用的網(wǎng)絡(luò)結(jié)構(gòu)和硬件平臺(tái)不盡相同,為了消除不同設(shè)備功耗帶來(lái)的影響,增加能效比這一參數(shù)來(lái)衡量不同硬件平臺(tái)間的結(jié)果。
表6 與其他在FPGA上的神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)方法的對(duì)比
所設(shè)計(jì)系統(tǒng)在150 MHz的頻率下,達(dá)到了129 GOPS的性能,通過(guò)功率計(jì)測(cè)得功耗為4.9 W,具有26.3 GOPS/W的能效比,相比于文獻(xiàn)[9-11],能效比分別提高了85%、93%、34%。與文獻(xiàn)[9]相比,本文在功耗更低的情況下,達(dá)到了幾乎一致的性能。與文獻(xiàn)[10]相比,雖然系統(tǒng)性能存在較大差距,但本文功耗僅不到其20%,在能效比上具有較大優(yōu)勢(shì)。與同種芯片的文獻(xiàn)[11]相比,本文的頻率和性能更高,能耗比更優(yōu)。與現(xiàn)有3種方法進(jìn)行比較可以看出,本文設(shè)計(jì)的嵌入式手勢(shì)識(shí)別系統(tǒng)在能效比上具有很大優(yōu)勢(shì),在同樣性能下能達(dá)到更低的功耗,這有利于其工程應(yīng)用。
針對(duì)嵌入式手勢(shì)識(shí)別系統(tǒng)難以設(shè)計(jì)深度網(wǎng)絡(luò)模型的問(wèn)題,本文基于DPU提出一種低功耗手勢(shì)識(shí)別系統(tǒng)設(shè)計(jì)方案。通過(guò)將DPU部署在FPGA器件端,調(diào)用ResNet-50模型對(duì)手勢(shì)圖片進(jìn)行識(shí)別,為嵌入式手勢(shì)識(shí)別系統(tǒng)的實(shí)現(xiàn)提供了新的技術(shù)路線。實(shí)驗(yàn)結(jié)果表明,在AX7020開(kāi)發(fā)板上,本文提出的方法在頻率為150 MHz時(shí),可以達(dá)到129 GOPS的性能和26.3 GOPS/W的能效比,識(shí)別準(zhǔn)確率為97.7%。相比于現(xiàn)有文獻(xiàn)中神經(jīng)網(wǎng)絡(luò)的FPGA實(shí)現(xiàn)方法,所提方法運(yùn)行時(shí)的功耗僅有4.9 W,在能效比上具有較大優(yōu)勢(shì)。