潘思園,王 永,黃 魯
(中國科學技術大學 微電子學院,安徽 合肥 230026)
近年來根據研究表明,神經網絡能夠在許多領域中執行各種任務,包括圖像識別、音頻和視頻處理與分析等。用于計算機視覺的大多數現代神經網絡架構都包括卷積層,因此其被稱為卷積神經網絡(CNN)。CNN具有高計算要求,深度神經網絡對計算要求更高。在移動設備和嵌入式系統[1]中同樣需要使用深度卷積神經網絡,如自動駕駛汽車[2]、醫療設備中的視頻處理[3]等。這就需要高精度和實時物體識別的能力。然而CPU通常不夠快,FPGA相較CPU有更快的處理速度,是用硬件加速CNN的最佳選擇。目前在FPGA上搭建的文字識別的系統有:基于BP神經網絡的FPGA實現[4]和基于循環切分法的FPGA實現[5],但前者的參數量過多,速度較慢,后者的準確度不高。
本文基于高性能CNN-VGG16[6]進行較大調整和改進,在TensorFlow框架下訓練出成熟漢字識別CNN網絡,其準確率高達98.36%。同時,通過卷積核復用、浮點數定點化等硬件化方法,將CNN前向通道搭建到FPGA上。最后,在FPGA上輸入待識別的漢字得到判斷結果。該網絡速度相較于CPU提高了6.76倍,并取得了幾乎無損的97.58%的正確率。
選取casia中文手寫數據庫[7]用于文中的訓練和測試。如表1所示,casia數據集是由模式識別國家重點實驗室分享,來源于300余人書寫的用于評估標準特征的機器學習和分類算法的中文手寫數據集。其中離線手寫數據集為HWDB1.0和HWDB1.1,在線手寫數據集為OLHWDB1.0和OLHWDB1.1。選取離線手寫數據HWDB1.1中的20個漢字,分別為:一,二,三,四,五,六,七,八,九,十,東,南,西,北,上,下,左,右,萬,丈。

表1 casia數據集
為了使該網絡對真實的攝像頭圖片更加友好,這里將ov5640采集的圖片也加入到數據集進行該網絡訓練。每個漢字一共拍攝了50張,并對圖片進行顏色反轉、旋轉、隨機添加0%~10%的噪音等方法進行數據增強。把320×240的圖片縮放為32×32再放進神經網絡一起訓練,使得訓練出的網絡更加適應真實環境。采集圖片與數據集圖片對比如圖1、圖2所示。

圖1 ov5640采集圖片

圖2 數據集圖片
經過反復訓練與結構改進,最終確定的CNN模型如圖3所示。此CNN結構共有一個輸入層、六個卷積層、一個全連接以及一個輸出識別結果的softmax分類層。網絡全部采用3×3的卷積核。最后一層采用全局池化,其余層均采用2×2最大池化核。由于卷積核可以擴大通道數,池化可以縮小特征圖的大小,可以在模型架構搭建得更深的同時,放緩計算量的增加,并且獲得更大的感受野。每一層的尺寸和計算參數如表2所示,可以看出90%以上的計算量都集中在卷積層。由于在最后一層的卷積層后面加入全局池化,所以大大降低了全連接層的參數。

圖3 CNN網絡模型結構

網絡層輸出尺寸參數數量權重/bias各層計算量/FLOPSinput32×32×1——conv132×32×872/873 728conv232×32×8576/8589 824pool116×16×8——conv316×16×161 152/16294 912conv416×16×162 304/16589 824pool28×8×16——conv58×8×324 608/32294 912conv68×8×329 216/3258 824global_max_pooling1×1×32——dense21672/21672Softmax21——總計—18 600/1332 433 696
通過使用TensorFlow來進行網絡訓練,設置學習率learning rate為0.001,并且選擇SGD優化器算法。經過200次迭代訓練后,最終可以實現98.36%測試集準確率,模型的準確率如圖4所示。

圖4 模型準確率
通常,在CPU上搭建的神經網絡均采用浮點數進行計算。當在硬件上實現時,由于難以控制浮點數的尾數和各種操作的指數,通常采用定點數進行計算。
考慮到本網絡第一層卷積,輸入是二維矩陣32×32,其值為[0;1)(對原始圖片進行歸一化處理后)。對于3×3卷積,第二層中某個特征值(i,j)可以如下計算:

(1)
由于權重ωi,j和偏差b已知,可以得到第二層輸入的最小值(mn)和最大值(mx)。設M=max(|mn|,|mx|)。將ωi,j和b除以M,則對于任意輸入數據,可保證第二層上的值不超過1,稱M為卷積層的縮減系數。對于后面的每一層,都使用相同的方法,即可保證神經網絡每一層輸入的值始終∈[-1;1],每一層的衰減系數見表3。

表3:每一層最大值和最小值及衰減系數
最后一層加入的是Softmax[8]函數,公式如下:

(2)
雖然在過程中對權值的大小進行了改變,進而改變了最后的輸出,但由于最后的分類函數是Softmax,因而最后一層神經元大小的相對位置沒有改變,所以不影響最終的輸出結果。
在對每一層執行以上縮減方法之后,可以確切地知道每一層值的范圍,即可以從浮點運算轉移到定點運算,可以用xb=[x×2N],來表示每一位對應的值。設z=x+y,那么加法可以表示為:

(3)
乘法可以被表示為:

(4)
將乘法結果除以2N,可以得到實際的值,硬件實現為將它移動N位(取高N位),對應的硬件電路如圖5所示。

圖5 定點化硬件電路
N為數據位寬,M為最大卷積核的尺寸,這里為9(3×3)。
使用帶卷積塊的定點計算時,有兩種不同的方法:
(1)在每次加法和乘法的基本運算后舍入;
(2)在每層卷積運算后進行全精度計算和舍入。
實驗對比后發現,在每層卷積運算后舍入會取得更高的準確度和更低的功耗。因此,本文最終選擇在卷積運算最后進行全精度的計算和舍入。
不同權重位寬[9-10]對應的準確率如圖6所示,在充分考慮識別精度和定點位寬資源消耗之后,文中最終確定11 bit的數據。相對于32 bit的浮點數,模型參數的儲存量可以下降到原來的0.34。

圖6 不同權重精度對應的準確率
即該定點化方法處理后的網絡與浮點數的網絡等效工作,但定點化后的網絡參數量和計算量均大大減少,數據帶寬和計算效率顯著提高,更利于硬件實現。
CNN前向通道在FPGA上搭建的整體流程如圖7所示,相機拍攝的照片由圖像采集模塊采集,并將圖像信息存儲到DDR3中。從320×240的圖像中裁剪出224×224像素的中心部分,進而得到需要的圖像尺寸32×32。224×224的圖像被分成7×7塊,計算這些塊中的每一個平均值,并在32×32圖像中形成對應的像素。圖像降采樣算法簡單,降采樣后精度并無損失,并能將圖像裁剪到合適尺寸。

圖7 數據流程圖
卷積神經網絡加速器設計如圖8所示,主要包括處理單元(CU)、片上緩沖(database)、卷積層、池化層、全連接層、激活函數(ReLU)和控制數據流的狀態機(FSM)。CU是加速器的基本單元。圖像數據存放在外部DDR中,經過預處理縮放到32×32再送進加速器計算。由于FPGA片上資源有限,卷積計算中間的特征圖需要先緩存于片上Buffer中,再送進CU。這里使用雙Buffer來實現流水線操作,提高數據計算效率。
由Memorycontrol模塊控制卷積計算的輸入數據和輸出數據的緩存。狀態機(FSM)控制不同模塊的調用,來保證卷積核的復用。最后通過一個ReLU函數實現該卷積層的輸出。

圖8 神經網絡加速器框圖
卷積單元(CU)的硬件實現如圖9所示。其中包含9個PE,PE的功能是把輸入一個特征值和權重系數相乘同時通過D觸發器將該特征值傳遞給下一個PE單元。在不使用乘法時通過EN_ctrl信號把乘法器關掉從而節約功耗。
在3×3的卷積運算中權重數據解碼后輸入到CU,特征數據通過FIFO輸入到卷積單元中,對應執行9次乘法運算后,將得到的9個值進行加法運算求得這一部分的和,作為輸出。

圖9 CU模塊硬件實現
(1)權重復用
在執行卷積運算時要用到乘法器和加法器,并不停地讀寫特征數據,過程中將消耗大量的資源。為了提高整體速度,降低資源消耗,本文提出如圖10所示的卷積核復用。由于網絡中卷積核大小均為3×3且結構不算復雜,會提升網絡整體速度。同時,采用卷積核復用,降低資源消耗。

圖10 卷積數據流
(2)移位寄存器
為執行卷積運算,需要從輸入圖像獲得9個相鄰像素的值,在下一次獲得的9個像素中,有6個像素已經在前一步驟中被接收(參見圖11)。為了縮短數據調用的時間,本文開發移位寄存器以將新數據保持在其輸入端并同時讓舊數據退出。因此,每個步驟只需要3個新值而不是9個。

圖11 移位寄存器操作
(3)卷積核權重拼接
當調用計算所需的數據時,每個值在調用時都會占據一個時鐘周期。為了提高數據訪問的便利性,在放入RAM之前,數據以9個塊的形式堆疊,之后可以在一個同地址訪問它們。利用這種存儲方式,可以在一個時鐘周期內執行9個權重數據的讀取,從而加速卷積和全連接層的計算(參見圖12)。

圖12 卷積核權重拼接
Modelsim仿真的波形如圖13所示,w11~w19表示權重數據,p11~p19表示圖像數據。從圖中可以看出,在一段時間內權重數據沒有變化而特征數據不斷改變。說明網絡在執行時采用權重復用,提高了數據帶寬,降低了數據頻繁讀寫所帶來的額外功耗。

圖13 Modelsim仿真圖
本實驗使用黑金Sparten6開發板AX545,AX545采用的是Xilinx的Spartan6系列XC6SLX45-2CSG324的FPGA作為核心處理器,具有豐富的硬件資源和外圍接口。它使連接外圍設備更容易;開發板板載了一片高速DDR3 DRAM,256 MB(128 M×16 bit),可用于存儲輸入圖像信息。電路板本身具有2.09 MB的RAM,可用于存儲神經網絡的權重。
本文通過攝像頭采集實際手寫漢字來進行檢測,并將實驗結果與CPU實現進行對比。漢字識別的最小速度應該超過30 FPS,即神經網絡應在33 ms內處理單個圖像。硬件開發平臺如圖14所示。

圖14 硬件平臺
實驗結果展示在圖15中,成功識別出的漢字對應的標簽顯示在LCD右下角。每個漢字選取50個樣本,測試結果如表4所示,識別率均在94%以上。

圖15 實驗結果展示

漢字樣本正確識別率/%漢字樣本正確識別率/%東504896一5050100南504794二504998西504998三504896北504794四504896上504998五504896下504896六504998左504794七504794右504794八504794萬504896九504896丈504896十504998
整個電路工作在100 MHz的時鐘頻率下,項目的資源消耗見表5。從表中可以看出在滿足實時性要求的同時,DSP資源消耗93.1%,RAM使用率為84.5%。在計算中所需的乘法器和特征圖存儲空間,是二者消耗較大的主因。

表5 FPGA資源使用情況
表6是FPGA實現與CPU實現的速度和功耗對比。功耗由Xilinx Power Estimator(XPE)工具獲取。從中可以看出,識別1 000幅圖片,FPGA耗時為9.33 s,CPU耗時為72.43 s,速度提高6.76倍;FPGA功耗為 76.32 W,僅為CPU的26.28%。

表6 速度及功耗對比
本文提出了基于FPGA的CNN漢字識別系統的設計和實現,其采用定點計算、卷積核分時復用等硬件優化方法,在結構簡化、速度相較CPU提升近7倍的同時,達到幾乎無損的97.58%的正確率。由于參數數量較少,本文避免了內存帶寬的常見問題,在FPGA資源允許的情況下,將在今后的工作中搭建更為復雜的神經網絡。