趙 凡,白 雪,楊 濤,趙不賄,徐雷鈞
(1.江蘇大學(xué)電氣信息工程學(xué)院,江蘇 鎮(zhèn)江 212013;2.鎮(zhèn)江芯智慧電子科技有限公司,江蘇 鎮(zhèn)江 212001)
卷積神經(jīng)網(wǎng)絡(luò)的概念在19世紀(jì)60年代被提出。1998年,Yann Lecun提出了新的網(wǎng)絡(luò)框架LeNet-5[1],并在分類任務(wù)上得到很好的效果。Hinton等在Imagenet上提出的Alexnet[2]網(wǎng)絡(luò),以其優(yōu)異的識(shí)別效果,使卷積神經(jīng)網(wǎng)絡(luò)受到學(xué)術(shù)界極大關(guān)注。隨后,超分辨率測(cè)試序列(visual geometry group Network,VGGNet)[3]、GoogleNet[4]、深度殘差網(wǎng)絡(luò)(deep residual network ResNet)[5]、YOLO[6]等新的神經(jīng)網(wǎng)絡(luò)模型不斷被提出,使得圖像識(shí)別的精度越來越高。如今,卷積神經(jīng)網(wǎng)絡(luò)已經(jīng)被應(yīng)用在工業(yè)、農(nóng)業(yè)[7-12]、無人駕駛、醫(yī)療等各個(gè)領(lǐng)域。
然而,由于新型網(wǎng)絡(luò)模型在網(wǎng)絡(luò)層數(shù)上的增加,導(dǎo)致中央處理器(central processing unit,CPU)運(yùn)行速度慢和圖形處理器(graphics processing unit,GPU)功耗高的缺點(diǎn)開始顯現(xiàn)。而專用集成電路(application specific integrated circuit,ASIC)在網(wǎng)絡(luò)模型的通用性上表現(xiàn)較差,且造價(jià)昂貴。為了解決這些問題,近年來出現(xiàn)了許多利用現(xiàn)場(chǎng)可編程門陣列(field programmable gate array,FPGA)來加速卷積神經(jīng)網(wǎng)絡(luò)的研究。文獻(xiàn)[13]~文獻(xiàn)[17]利用FPGA設(shè)計(jì)了卷積神經(jīng)網(wǎng)絡(luò)加速器,實(shí)現(xiàn)并行化的卷積神經(jīng)網(wǎng)絡(luò),取得了不錯(cuò)的效果。
卷積神經(jīng)網(wǎng)絡(luò)主要由輸入層、卷積層、池化層、全連接層和輸出層等構(gòu)成。卷積神經(jīng)網(wǎng)絡(luò)通過對(duì)圖像進(jìn)行卷積和池化運(yùn)算實(shí)現(xiàn)特征的提取,最終識(shí)別圖像分類。
卷積神經(jīng)網(wǎng)絡(luò)的輸入層可以是一維數(shù)據(jù),也可以是多維數(shù)據(jù)。以彩色圖像為例,由于圖像由R、G、B這3個(gè)通道組成,所以輸入層將會(huì)是三維數(shù)組。卷積層的作用主要是提取輸入圖像的特征。卷積層包括卷積核和激勵(lì)函數(shù)等。輸入特征的每個(gè)神經(jīng)元會(huì)有1個(gè)權(quán)值系數(shù)。當(dāng)卷積核在輸入特征圖上遍歷時(shí),權(quán)值會(huì)和卷積核的系數(shù)進(jìn)行卷積運(yùn)算。每種網(wǎng)絡(luò)都可以有不同的卷積核大小、步長(zhǎng)和卷積層數(shù)。相對(duì)來說,網(wǎng)絡(luò)越復(fù)雜,則卷積層數(shù)越多。池化層的作用主要是對(duì)卷積后的輸出特征進(jìn)行再次提取和過濾,使輸出特征圖的神經(jīng)元大幅減少。全連接層相當(dāng)于傳統(tǒng)神經(jīng)網(wǎng)絡(luò)中的隱含層,通過對(duì)輸出特征的神經(jīng)元和全連接層的神經(jīng)元進(jìn)行全連接實(shí)現(xiàn)非線性組合運(yùn)算,最終由輸出層輸出結(jié)果。卷積神經(jīng)網(wǎng)絡(luò)框圖如圖1所示。
圖1 卷積神經(jīng)網(wǎng)絡(luò)框圖Fig.1 Block diagram of convolutional neural network
目前,利用CPU和FPGA結(jié)合的多核異構(gòu)系統(tǒng)進(jìn)行硬件加速,已成為一種行之有效的方法[18]?;贔PGA的卷積神經(jīng)網(wǎng)絡(luò)識(shí)別系統(tǒng)總體結(jié)構(gòu)如圖2所示。
圖2 基于FPGA的卷積神經(jīng)網(wǎng)絡(luò)識(shí)別系統(tǒng)總體結(jié)構(gòu)圖Fig.2 Overall structure diagram of convolutional neural network recognition system based on FPGA
該FPGA片上帶有多處理器片上系統(tǒng)(multiprocessor system on chip,MPSOC),包含處理系統(tǒng)(processing system,PS)和可編程邏輯(programmable logic,PL)兩個(gè)部分。在FPGA的PL側(cè)設(shè)計(jì)了卷積、池化、激活函數(shù)、縮放函數(shù)、像素值歸一化以及可配置直接內(nèi)存訪問(direct memory access,DMA)模塊,而FPGA的PS負(fù)責(zé)主控系統(tǒng)以及PL側(cè)的參數(shù)配置。此外,利用視頻直接內(nèi)存訪問(video direct memory access,VDMA)和掛載在PS側(cè)的以太網(wǎng)模塊,可實(shí)時(shí)顯示CMOS攝像頭采集的圖像。
在軟件中實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)的方法是采用浮點(diǎn)數(shù)進(jìn)行運(yùn)算。然而,在硬件中實(shí)現(xiàn)浮點(diǎn)運(yùn)算不僅需要消耗大量的數(shù)字信號(hào)處理器(digital signal processor,DSP)資源,而且會(huì)導(dǎo)致大量功耗。一旦網(wǎng)絡(luò)層數(shù)過多,需要的乘法器資源增多,可能在算法實(shí)現(xiàn)過程中出現(xiàn)時(shí)序問題或者功耗過高。因此,將浮點(diǎn)數(shù)量化成定點(diǎn)數(shù)是很有必要的。文獻(xiàn)[19]提出將64 bit的浮點(diǎn)數(shù)量化為16 bit的定點(diǎn)數(shù),最終的試驗(yàn)結(jié)果是將FPGA與CPU的誤差精度控制在3%以內(nèi)。
值得注意的是,相關(guān)研究者僅關(guān)注了運(yùn)算過程的量化,而輸入圖像歸一化這部分量化過程大多被忽略。為了進(jìn)一步提高識(shí)別速度與精度,本設(shè)計(jì)采用查表法對(duì)數(shù)據(jù)的歸一化和量化進(jìn)行處理。將0~255間的像素量化后的結(jié)果存入RAM,并以攝像頭采集的像素值作為索引獲取量化后的值,最終僅消耗512 KB的片上緩存。
FPGA圖像縮放如圖3所示。
圖3 FPGA圖像縮放框圖Fig.3 FPGA image scaling block diagram
為了滿足網(wǎng)絡(luò)模型對(duì)輸入圖像尺寸的要求,需要設(shè)計(jì)縮放模塊[20]。同時(shí),為了減少圖像送入網(wǎng)絡(luò)的時(shí)間,本設(shè)計(jì)采用FPGA的邏輯資源實(shí)現(xiàn)雙線性差值縮放算法。該差值方法與網(wǎng)絡(luò)模型訓(xùn)練時(shí)保持一致,可降低圖像尺寸對(duì)識(shí)別準(zhǔn)確率的影響。通過編寫可配置的DMA、片上緩存和縮放坐標(biāo)生成模塊,可實(shí)現(xiàn)FPGA縮放。與直接利用FPGA的片上系統(tǒng)相比,純邏輯縮放的時(shí)間約為系統(tǒng)側(cè)縮放的六分之一。
卷積神經(jīng)網(wǎng)絡(luò)的計(jì)算量集中在卷積層和池化層兩部分。其本質(zhì)上是由大量的矩陣乘法和加法等數(shù)學(xué)運(yùn)算構(gòu)成的。卷積層的一般形式[21]如式(1)所示:
(1)
在通用處理器上實(shí)現(xiàn)這兩個(gè)過程需要逐步遍歷整個(gè)特征圖,串行進(jìn)行乘法和加法。而對(duì)于圖像處理,F(xiàn)PGA可利用其并行優(yōu)勢(shì),實(shí)現(xiàn)同一時(shí)鐘下多通道的同時(shí)計(jì)算。其主要思想是通過將特征圖輸入通道分塊合并為大位寬的數(shù)據(jù),并調(diào)用乘法器計(jì)算出每個(gè)子塊的結(jié)果。然而,某些卷積核多、網(wǎng)絡(luò)層數(shù)深的網(wǎng)絡(luò)模型不能充分利用FPGA的高速接口通道。本試驗(yàn)為了最大化利用FPGA的并行特性,在對(duì)特征圖進(jìn)行分塊時(shí):若卷積核尺寸為奇數(shù),則使用單卷積;若卷積核尺寸為偶數(shù),則將同時(shí)使用2個(gè)卷積模塊。由于單卷積包含在雙卷積模塊中,本文以雙卷積模塊為例進(jìn)行詳解。卷積并行化如圖4所示。
圖4 卷積并行化示意圖Fig.4 Schematic diagram of convolution parallelization
圖4中,c、w、h分別為輸入特征圖的通道、寬度和高度方向。對(duì)于1個(gè)224×224×3的圖像,從寬度和高度方向分塊,需要考慮到特征圖尺度的奇偶性。為了減少?gòu)?fù)雜度,本設(shè)計(jì)選擇沿圖像通道方向?qū)⑵溥M(jìn)行子塊劃分。
雙卷積的子塊具體運(yùn)算過程中,子塊一和子塊二的數(shù)據(jù)分別來自2個(gè)高性能接口通道。2個(gè)子塊計(jì)算過程相同且同時(shí)刻進(jìn)行。子塊卷積運(yùn)算如圖5所示。
圖5 子塊卷積運(yùn)算示意圖Fig.5 Schematic diagram of sub block convolution operation
特征圖的16mt位數(shù)據(jù)與權(quán)重的16mt位數(shù)據(jù)對(duì)應(yīng)乘加,即可求出雙卷積子塊的值。單個(gè)子塊的計(jì)算式如式(2)所示。
(2)
對(duì)于池化層的并行化處理,文獻(xiàn)[22]利用高層次綜合(high-level synthesis,HLS),把5個(gè)for循環(huán)綜合成FPGA可用的池化層IP。HLS作為XILINX公司新推出的高效設(shè)計(jì)工具,可將C/C++語言轉(zhuǎn)化為硬件描述語言描述的寄存器轉(zhuǎn)換層(register-transfer level,RTL),而且開發(fā)周期短。不過,由于需要將IP掛載在高級(jí)可擴(kuò)展接口(advanced extensible interface,AXI)總線上,工具自動(dòng)轉(zhuǎn)化后的IP突發(fā)傳輸效果不佳,使其對(duì)數(shù)據(jù)方向寄存器(data direction register,DDR)的讀寫操作變慢,對(duì)傳輸時(shí)間有較大影響。因此,本設(shè)計(jì)采用手寫RTL來實(shí)現(xiàn)池化運(yùn)算模塊。
池化并行化計(jì)算如圖6所示。
圖6 池化層并行化計(jì)算示意圖Fig.6 Schematic diagram of data pooling layer parallelization computation
圖6(a)為數(shù)據(jù)讀取的過程。左側(cè)為當(dāng)前讀取的數(shù)據(jù),沿著c(高度)方向?qū)t(單個(gè)數(shù)據(jù)為n比特)個(gè)數(shù)據(jù)存入片內(nèi)存儲(chǔ)單元。右側(cè)為當(dāng)前數(shù)據(jù)讀取完成后,執(zhí)行下次讀取,沿著h(高度)方向?qū)⒌谝恍衜t×n×hbit的數(shù)據(jù)全部存儲(chǔ)。圖6(b)為池化層數(shù)據(jù)具體的存儲(chǔ)方式。若為最大池化,則將mt個(gè)數(shù)據(jù)讀出后與下一行的mt個(gè)數(shù)據(jù)進(jìn)行比較,并將最大值存入該存儲(chǔ)單元,直至緩存的行數(shù)等于池化的高度。若為均值池化,則將緩存的數(shù)據(jù)讀出后與下一行相加,作同樣計(jì)算,直至緩存的行數(shù)等于池化的高度。整個(gè)池化層復(fù)用同一塊緩存空間,以減少緩存的使用。
Softmax分類器原理較簡(jiǎn)單,是一個(gè)概率計(jì)算過程[23]。Softmax函數(shù)主要應(yīng)用在神經(jīng)網(wǎng)絡(luò)的輸出層。它將整個(gè)網(wǎng)絡(luò)的輸出值歸一化到(0,1)之間。Softmax公式如下:
(3)
式中:xu、xv為激活層輸入的參數(shù),u、v為序號(hào);n為激活層的輸入總個(gè)數(shù)。
在分類、檢測(cè)等問題上,對(duì)輸出層進(jìn)行Softmax操作。此時(shí),可以將Softmax的結(jié)果看作事物出現(xiàn)的概率。對(duì)于Softmax的FPGA處理,采用相關(guān)算法予以實(shí)現(xiàn),包括坐標(biāo)旋轉(zhuǎn)數(shù)字計(jì)算機(jī)(coordinate rotation digital computer,CORDIC)算法、多項(xiàng)式擬合法、分段擬合法、查表法。CORDIC算法計(jì)算時(shí)間長(zhǎng),精度不高。多項(xiàng)式擬合法消耗的資源與階數(shù)相關(guān)。分段擬合法效果較好,但較為繁雜[24]。查表法精度高、速度快。文獻(xiàn)[25]通過構(gòu)建基底查表,實(shí)現(xiàn)了輸入[-10,+10]內(nèi)的計(jì)算。但是精度越高,消耗存儲(chǔ)資源就越多,且受輸入范圍的影響越大。為了避免在Softmax函數(shù)的實(shí)現(xiàn)上消耗過多資源,并確保較高的精度,本設(shè)計(jì)提出改進(jìn)的FPGA多次查表和乘法器并用的方法來實(shí)現(xiàn)Softmax。
首先,將計(jì)算公式作進(jìn)一步變換,如式(4)所示。
(4)
按式(4)變換,可將分母中每個(gè)指數(shù)函數(shù)的范圍限制在(0,1)內(nèi)。其優(yōu)點(diǎn)是在制作查找表時(shí)可以減小數(shù)據(jù)的范圍,降低ROM的深度。不過由于數(shù)據(jù)精度選擇的不同,直接制作查找表依然會(huì)消耗過多ROM資源。本文采用多次拆分查表和調(diào)用乘法器相結(jié)合的方法。以進(jìn)行一次查表為例。首先,在整個(gè)網(wǎng)絡(luò)運(yùn)算過程中,都是以定點(diǎn)數(shù)進(jìn)行運(yùn)算的。在制作查表時(shí),需要將定點(diǎn)前輸入數(shù)據(jù)所對(duì)應(yīng)的指數(shù)函數(shù)結(jié)果制表。以式(4)中1個(gè)分母為例,其計(jì)算表達(dá)式如式(5)所示:
(5)
式中:xint為xu-x1結(jié)果的整數(shù)部分;xfloat為xu-x1結(jié)果的小數(shù)部分。
通過將整數(shù)部分和小數(shù)部分拆開查表,可以減少存儲(chǔ)單元的使用。接著,繼續(xù)將其分解,如式(6)所示。
(6)
最后,由于r是在i的取值范圍內(nèi),因此只需對(duì)整數(shù)和小數(shù)部分范圍的一半進(jìn)行制作查表,并通過查表和直接調(diào)用乘法器求出其乘積。該方法會(huì)消耗少量的乘法器,但可以節(jié)省大量的ROM資源。為求出f(xu),在求出分母的結(jié)果后,由于式(4)的分母是有界數(shù),因此可以再次查表或者直接利用乘法器和線性逼近等方法求出其倒數(shù)。
本文設(shè)計(jì)的FPGA開發(fā)環(huán)境為Vivado 2019.1,開發(fā)平臺(tái)為ZCU104,芯片型號(hào)為XCZU 7EV-FFVC 1156-2-E,攝像頭型號(hào)為OV5640,軟件開發(fā)平臺(tái)為TensorFlow2.0,CPU型號(hào)為Intel i5-8250U,GPU型號(hào)為NVIDIA GTX1650。在試驗(yàn)中,分別在CPU、GPU實(shí)現(xiàn)上述網(wǎng)絡(luò)模型,并對(duì)比FPGA實(shí)現(xiàn)的準(zhǔn)確率、識(shí)別速度。整個(gè)試驗(yàn)流程如下。
①準(zhǔn)備和制作數(shù)據(jù)集。通過高清攝像機(jī)采集正常的蘋果、梨和腐敗的蘋果、梨這4種圖像,并根據(jù)其類別,制作40 000張數(shù)據(jù)集。
②計(jì)算機(jī)端訓(xùn)練網(wǎng)絡(luò)。利用TensorFlow2.0框架建立網(wǎng)絡(luò)模型,對(duì)制作的數(shù)據(jù)集進(jìn)行訓(xùn)練。由于對(duì)小樣本的水果數(shù)據(jù)進(jìn)行訓(xùn)練,采用的卷積神經(jīng)網(wǎng)絡(luò)模型參數(shù)如表1所示。
表1 卷積神經(jīng)網(wǎng)絡(luò)模型參數(shù)Tab.1 Convolution neural network model parameters
③計(jì)算機(jī)端將權(quán)重和閾值保存為二進(jìn)制文件;利用ZCU104上的PS將權(quán)重寫入FPGA的DDR中;利用ZCU104上的PL進(jìn)行圖像采集、預(yù)處理、數(shù)據(jù)量化和上述網(wǎng)絡(luò)模型的前向推理。輸出結(jié)果通過以太網(wǎng)口傳輸?shù)接?jì)算機(jī)端的上位機(jī)。在Visual Studio2019中,通過C#的Socket通信搭建服務(wù)器,接收FPGA的采集圖像和分類結(jié)果。
在計(jì)算機(jī)端和FPGA平臺(tái)分別測(cè)試1 000張圖片。各平臺(tái)準(zhǔn)確率對(duì)比如表2所示。FPGA因?yàn)榱炕脑?,?zhǔn)確率相較于其他平臺(tái)有所降低,但已經(jīng)可以滿足實(shí)際應(yīng)用需求。
表2 各平臺(tái)準(zhǔn)確率對(duì)比Tab.2 Accuracy comparison of each platform
各平臺(tái)識(shí)別速度對(duì)比如表3所示。與CPU相比,ZCU104的運(yùn)行速度約為CPU的3倍。而與GPU相比,ZCU104略快于GPU,但相差不大。
表3 各平臺(tái)識(shí)別速度對(duì)比Tab.3 Comparison of recognition speed of each platform
ZCU104資源主要使用了12%的查找表、30%的塊隨機(jī)存儲(chǔ)器以及6%的乘法器。由于整個(gè)識(shí)別系統(tǒng)中包含縮放模塊、卷積模塊、池化,且縮放模塊的實(shí)現(xiàn)本身就占用較多資源,所以資源使用量略高。但對(duì)一般的FPGA來說,足以滿足該資源的消耗。
本設(shè)計(jì)實(shí)現(xiàn)了卷積神經(jīng)網(wǎng)絡(luò)在FPGA上的搭建,并利用此網(wǎng)絡(luò)模型,對(duì)自制的40 000張水果數(shù)據(jù)集進(jìn)行測(cè)試,ZCU104的準(zhǔn)確率達(dá)到95.8%。由于定點(diǎn)化的原因,ZCU104的準(zhǔn)確率相較于CPU和GPU有所降低,但相差不大。而ZCU104、CPU、GPU的識(shí)別耗時(shí)分別為28.3 ms、88.9 ms、29.1 ms,表明ZCU104的識(shí)別速度達(dá)到CPU的3倍,同時(shí)也略快于GPU。
相比于以往的卷積神經(jīng)網(wǎng)絡(luò)加速器,本設(shè)計(jì)建立了基于FPGA的完整識(shí)別系統(tǒng),包含了從圖像采集到最終的識(shí)別分類。
首先,本設(shè)計(jì)采用查表法,優(yōu)化圖像預(yù)處理和歸一化;其次,采用雙通道進(jìn)行卷積層計(jì)算和流式數(shù)據(jù)傳輸;最后,利用乘法器和多次查表相結(jié)合的方法,改進(jìn)Softmax函數(shù)的計(jì)算。
本設(shè)計(jì)最大程度地減少了DSP的消耗,同時(shí)提高了識(shí)別的實(shí)時(shí)性。本文設(shè)計(jì)的卷積神經(jīng)網(wǎng)絡(luò)可通過ZCU104系統(tǒng)側(cè)重配置,具有較高的通用性,對(duì)進(jìn)一步研究卷積神經(jīng)網(wǎng)絡(luò)的識(shí)別以及檢測(cè)模型的應(yīng)用有著重要意義。