趙 凡,白 雪,楊 濤,趙不賄,徐雷鈞
(1.江蘇大學電氣信息工程學院,江蘇 鎮江 212013;2.鎮江芯智慧電子科技有限公司,江蘇 鎮江 212001)
卷積神經網絡的概念在19世紀60年代被提出。1998年,Yann Lecun提出了新的網絡框架LeNet-5[1],并在分類任務上得到很好的效果。Hinton等在Imagenet上提出的Alexnet[2]網絡,以其優異的識別效果,使卷積神經網絡受到學術界極大關注。隨后,超分辨率測試序列(visual geometry group Network,VGGNet)[3]、GoogleNet[4]、深度殘差網絡(deep residual network ResNet)[5]、YOLO[6]等新的神經網絡模型不斷被提出,使得圖像識別的精度越來越高。如今,卷積神經網絡已經被應用在工業、農業[7-12]、無人駕駛、醫療等各個領域。
然而,由于新型網絡模型在網絡層數上的增加,導致中央處理器(central processing unit,CPU)運行速度慢和圖形處理器(graphics processing unit,GPU)功耗高的缺點開始顯現。而專用集成電路(application specific integrated circuit,ASIC)在網絡模型的通用性上表現較差,且造價昂貴。為了解決這些問題,近年來出現了許多利用現場可編程門陣列(field programmable gate array,FPGA)來加速卷積神經網絡的研究。文獻[13]~文獻[17]利用FPGA設計了卷積神經網絡加速器,實現并行化的卷積神經網絡,取得了不錯的效果。
卷積神經網絡主要由輸入層、卷積層、池化層、全連接層和輸出層等構成。卷積神經網絡通過對圖像進行卷積和池化運算實現特征的提取,最終識別圖像分類。
卷積神經網絡的輸入層可以是一維數據,也可以是多維數據。以彩色圖像為例,由于圖像由R、G、B這3個通道組成,所以輸入層將會是三維數組。卷積層的作用主要是提取輸入圖像的特征。卷積層包括卷積核和激勵函數等。輸入特征的每個神經元會有1個權值系數。當卷積核在輸入特征圖上遍歷時,權值會和卷積核的系數進行卷積運算。每種網絡都可以有不同的卷積核大小、步長和卷積層數。相對來說,網絡越復雜,則卷積層數越多。池化層的作用主要是對卷積后的輸出特征進行再次提取和過濾,使輸出特征圖的神經元大幅減少。全連接層相當于傳統神經網絡中的隱含層,通過對輸出特征的神經元和全連接層的神經元進行全連接實現非線性組合運算,最終由輸出層輸出結果。卷積神經網絡框圖如圖1所示。

圖1 卷積神經網絡框圖Fig.1 Block diagram of convolutional neural network
目前,利用CPU和FPGA結合的多核異構系統進行硬件加速,已成為一種行之有效的方法[18]?;贔PGA的卷積神經網絡識別系統總體結構如圖2所示。

圖2 基于FPGA的卷積神經網絡識別系統總體結構圖Fig.2 Overall structure diagram of convolutional neural network recognition system based on FPGA
該FPGA片上帶有多處理器片上系統(multiprocessor system on chip,MPSOC),包含處理系統(processing system,PS)和可編程邏輯(programmable logic,PL)兩個部分。在FPGA的PL側設計了卷積、池化、激活函數、縮放函數、像素值歸一化以及可配置直接內存訪問(direct memory access,DMA)模塊,而FPGA的PS負責主控系統以及PL側的參數配置。此外,利用視頻直接內存訪問(video direct memory access,VDMA)和掛載在PS側的以太網模塊,可實時顯示CMOS攝像頭采集的圖像。
在軟件中實現卷積神經網絡的方法是采用浮點數進行運算。然而,在硬件中實現浮點運算不僅需要消耗大量的數字信號處理器(digital signal processor,DSP)資源,而且會導致大量功耗。一旦網絡層數過多,需要的乘法器資源增多,可能在算法實現過程中出現時序問題或者功耗過高。因此,將浮點數量化成定點數是很有必要的。文獻[19]提出將64 bit的浮點數量化為16 bit的定點數,最終的試驗結果是將FPGA與CPU的誤差精度控制在3%以內。
值得注意的是,相關研究者僅關注了運算過程的量化,而輸入圖像歸一化這部分量化過程大多被忽略。為了進一步提高識別速度與精度,本設計采用查表法對數據的歸一化和量化進行處理。將0~255間的像素量化后的結果存入RAM,并以攝像頭采集的像素值作為索引獲取量化后的值,最終僅消耗512 KB的片上緩存。
FPGA圖像縮放如圖3所示。

圖3 FPGA圖像縮放框圖Fig.3 FPGA image scaling block diagram
為了滿足網絡模型對輸入圖像尺寸的要求,需要設計縮放模塊[20]。同時,為了減少圖像送入網絡的時間,本設計采用FPGA的邏輯資源實現雙線性差值縮放算法。該差值方法與網絡模型訓練時保持一致,可降低圖像尺寸對識別準確率的影響。通過編寫可配置的DMA、片上緩存和縮放坐標生成模塊,可實現FPGA縮放。與直接利用FPGA的片上系統相比,純邏輯縮放的時間約為系統側縮放的六分之一。
卷積神經網絡的計算量集中在卷積層和池化層兩部分。其本質上是由大量的矩陣乘法和加法等數學運算構成的。卷積層的一般形式[21]如式(1)所示:
(1)

在通用處理器上實現這兩個過程需要逐步遍歷整個特征圖,串行進行乘法和加法。而對于圖像處理,FPGA可利用其并行優勢,實現同一時鐘下多通道的同時計算。其主要思想是通過將特征圖輸入通道分塊合并為大位寬的數據,并調用乘法器計算出每個子塊的結果。然而,某些卷積核多、網絡層數深的網絡模型不能充分利用FPGA的高速接口通道。本試驗為了最大化利用FPGA的并行特性,在對特征圖進行分塊時:若卷積核尺寸為奇數,則使用單卷積;若卷積核尺寸為偶數,則將同時使用2個卷積模塊。由于單卷積包含在雙卷積模塊中,本文以雙卷積模塊為例進行詳解。卷積并行化如圖4所示。

圖4 卷積并行化示意圖Fig.4 Schematic diagram of convolution parallelization
圖4中,c、w、h分別為輸入特征圖的通道、寬度和高度方向。對于1個224×224×3的圖像,從寬度和高度方向分塊,需要考慮到特征圖尺度的奇偶性。為了減少復雜度,本設計選擇沿圖像通道方向將其進行子塊劃分。

雙卷積的子塊具體運算過程中,子塊一和子塊二的數據分別來自2個高性能接口通道。2個子塊計算過程相同且同時刻進行。子塊卷積運算如圖5所示。

圖5 子塊卷積運算示意圖Fig.5 Schematic diagram of sub block convolution operation
特征圖的16mt位數據與權重的16mt位數據對應乘加,即可求出雙卷積子塊的值。單個子塊的計算式如式(2)所示。
(2)

對于池化層的并行化處理,文獻[22]利用高層次綜合(high-level synthesis,HLS),把5個for循環綜合成FPGA可用的池化層IP。HLS作為XILINX公司新推出的高效設計工具,可將C/C++語言轉化為硬件描述語言描述的寄存器轉換層(register-transfer level,RTL),而且開發周期短。不過,由于需要將IP掛載在高級可擴展接口(advanced extensible interface,AXI)總線上,工具自動轉化后的IP突發傳輸效果不佳,使其對數據方向寄存器(data direction register,DDR)的讀寫操作變慢,對傳輸時間有較大影響。因此,本設計采用手寫RTL來實現池化運算模塊。
池化并行化計算如圖6所示。

圖6 池化層并行化計算示意圖Fig.6 Schematic diagram of data pooling layer parallelization computation
圖6(a)為數據讀取的過程。左側為當前讀取的數據,沿著c(高度)方向將mt(單個數據為n比特)個數據存入片內存儲單元。右側為當前數據讀取完成后,執行下次讀取,沿著h(高度)方向將第一行mt×n×hbit的數據全部存儲。圖6(b)為池化層數據具體的存儲方式。若為最大池化,則將mt個數據讀出后與下一行的mt個數據進行比較,并將最大值存入該存儲單元,直至緩存的行數等于池化的高度。若為均值池化,則將緩存的數據讀出后與下一行相加,作同樣計算,直至緩存的行數等于池化的高度。整個池化層復用同一塊緩存空間,以減少緩存的使用。
Softmax分類器原理較簡單,是一個概率計算過程[23]。Softmax函數主要應用在神經網絡的輸出層。它將整個網絡的輸出值歸一化到(0,1)之間。Softmax公式如下:

(3)
式中:xu、xv為激活層輸入的參數,u、v為序號;n為激活層的輸入總個數。
在分類、檢測等問題上,對輸出層進行Softmax操作。此時,可以將Softmax的結果看作事物出現的概率。對于Softmax的FPGA處理,采用相關算法予以實現,包括坐標旋轉數字計算機(coordinate rotation digital computer,CORDIC)算法、多項式擬合法、分段擬合法、查表法。CORDIC算法計算時間長,精度不高。多項式擬合法消耗的資源與階數相關。分段擬合法效果較好,但較為繁雜[24]。查表法精度高、速度快。文獻[25]通過構建基底查表,實現了輸入[-10,+10]內的計算。但是精度越高,消耗存儲資源就越多,且受輸入范圍的影響越大。為了避免在Softmax函數的實現上消耗過多資源,并確保較高的精度,本設計提出改進的FPGA多次查表和乘法器并用的方法來實現Softmax。
首先,將計算公式作進一步變換,如式(4)所示。

(4)
按式(4)變換,可將分母中每個指數函數的范圍限制在(0,1)內。其優點是在制作查找表時可以減小數據的范圍,降低ROM的深度。不過由于數據精度選擇的不同,直接制作查找表依然會消耗過多ROM資源。本文采用多次拆分查表和調用乘法器相結合的方法。以進行一次查表為例。首先,在整個網絡運算過程中,都是以定點數進行運算的。在制作查表時,需要將定點前輸入數據所對應的指數函數結果制表。以式(4)中1個分母為例,其計算表達式如式(5)所示:
(5)
式中:xint為xu-x1結果的整數部分;xfloat為xu-x1結果的小數部分。
通過將整數部分和小數部分拆開查表,可以減少存儲單元的使用。接著,繼續將其分解,如式(6)所示。
(6)

最后,由于r是在i的取值范圍內,因此只需對整數和小數部分范圍的一半進行制作查表,并通過查表和直接調用乘法器求出其乘積。該方法會消耗少量的乘法器,但可以節省大量的ROM資源。為求出f(xu),在求出分母的結果后,由于式(4)的分母是有界數,因此可以再次查表或者直接利用乘法器和線性逼近等方法求出其倒數。
本文設計的FPGA開發環境為Vivado 2019.1,開發平臺為ZCU104,芯片型號為XCZU 7EV-FFVC 1156-2-E,攝像頭型號為OV5640,軟件開發平臺為TensorFlow2.0,CPU型號為Intel i5-8250U,GPU型號為NVIDIA GTX1650。在試驗中,分別在CPU、GPU實現上述網絡模型,并對比FPGA實現的準確率、識別速度。整個試驗流程如下。
①準備和制作數據集。通過高清攝像機采集正常的蘋果、梨和腐敗的蘋果、梨這4種圖像,并根據其類別,制作40 000張數據集。
②計算機端訓練網絡。利用TensorFlow2.0框架建立網絡模型,對制作的數據集進行訓練。由于對小樣本的水果數據進行訓練,采用的卷積神經網絡模型參數如表1所示。

表1 卷積神經網絡模型參數Tab.1 Convolution neural network model parameters
③計算機端將權重和閾值保存為二進制文件;利用ZCU104上的PS將權重寫入FPGA的DDR中;利用ZCU104上的PL進行圖像采集、預處理、數據量化和上述網絡模型的前向推理。輸出結果通過以太網口傳輸到計算機端的上位機。在Visual Studio2019中,通過C#的Socket通信搭建服務器,接收FPGA的采集圖像和分類結果。
在計算機端和FPGA平臺分別測試1 000張圖片。各平臺準確率對比如表2所示。FPGA因為量化的原因,準確率相較于其他平臺有所降低,但已經可以滿足實際應用需求。

表2 各平臺準確率對比Tab.2 Accuracy comparison of each platform
各平臺識別速度對比如表3所示。與CPU相比,ZCU104的運行速度約為CPU的3倍。而與GPU相比,ZCU104略快于GPU,但相差不大。

表3 各平臺識別速度對比Tab.3 Comparison of recognition speed of each platform
ZCU104資源主要使用了12%的查找表、30%的塊隨機存儲器以及6%的乘法器。由于整個識別系統中包含縮放模塊、卷積模塊、池化,且縮放模塊的實現本身就占用較多資源,所以資源使用量略高。但對一般的FPGA來說,足以滿足該資源的消耗。
本設計實現了卷積神經網絡在FPGA上的搭建,并利用此網絡模型,對自制的40 000張水果數據集進行測試,ZCU104的準確率達到95.8%。由于定點化的原因,ZCU104的準確率相較于CPU和GPU有所降低,但相差不大。而ZCU104、CPU、GPU的識別耗時分別為28.3 ms、88.9 ms、29.1 ms,表明ZCU104的識別速度達到CPU的3倍,同時也略快于GPU。
相比于以往的卷積神經網絡加速器,本設計建立了基于FPGA的完整識別系統,包含了從圖像采集到最終的識別分類。
首先,本設計采用查表法,優化圖像預處理和歸一化;其次,采用雙通道進行卷積層計算和流式數據傳輸;最后,利用乘法器和多次查表相結合的方法,改進Softmax函數的計算。
本設計最大程度地減少了DSP的消耗,同時提高了識別的實時性。本文設計的卷積神經網絡可通過ZCU104系統側重配置,具有較高的通用性,對進一步研究卷積神經網絡的識別以及檢測模型的應用有著重要意義。