潘思園,王 永,黃 魯
(中國科學(xué)技術(shù)大學(xué) 微電子學(xué)院,安徽 合肥 230026)
近年來根據(jù)研究表明,神經(jīng)網(wǎng)絡(luò)能夠在許多領(lǐng)域中執(zhí)行各種任務(wù),包括圖像識(shí)別、音頻和視頻處理與分析等。用于計(jì)算機(jī)視覺的大多數(shù)現(xiàn)代神經(jīng)網(wǎng)絡(luò)架構(gòu)都包括卷積層,因此其被稱為卷積神經(jīng)網(wǎng)絡(luò)(CNN)。CNN具有高計(jì)算要求,深度神經(jīng)網(wǎng)絡(luò)對(duì)計(jì)算要求更高。在移動(dòng)設(shè)備和嵌入式系統(tǒng)[1]中同樣需要使用深度卷積神經(jīng)網(wǎng)絡(luò),如自動(dòng)駕駛汽車[2]、醫(yī)療設(shè)備中的視頻處理[3]等。這就需要高精度和實(shí)時(shí)物體識(shí)別的能力。然而CPU通常不夠快,F(xiàn)PGA相較CPU有更快的處理速度,是用硬件加速CNN的最佳選擇。目前在FPGA上搭建的文字識(shí)別的系統(tǒng)有:基于BP神經(jīng)網(wǎng)絡(luò)的FPGA實(shí)現(xiàn)[4]和基于循環(huán)切分法的FPGA實(shí)現(xiàn)[5],但前者的參數(shù)量過多,速度較慢,后者的準(zhǔn)確度不高。
本文基于高性能CNN-VGG16[6]進(jìn)行較大調(diào)整和改進(jìn),在TensorFlow框架下訓(xùn)練出成熟漢字識(shí)別CNN網(wǎng)絡(luò),其準(zhǔn)確率高達(dá)98.36%。同時(shí),通過卷積核復(fù)用、浮點(diǎn)數(shù)定點(diǎn)化等硬件化方法,將CNN前向通道搭建到FPGA上。最后,在FPGA上輸入待識(shí)別的漢字得到判斷結(jié)果。該網(wǎng)絡(luò)速度相較于CPU提高了6.76倍,并取得了幾乎無損的97.58%的正確率。
選取casia中文手寫數(shù)據(jù)庫[7]用于文中的訓(xùn)練和測試。如表1所示,casia數(shù)據(jù)集是由模式識(shí)別國家重點(diǎn)實(shí)驗(yàn)室分享,來源于300余人書寫的用于評(píng)估標(biāo)準(zhǔn)特征的機(jī)器學(xué)習(xí)和分類算法的中文手寫數(shù)據(jù)集。其中離線手寫數(shù)據(jù)集為HWDB1.0和HWDB1.1,在線手寫數(shù)據(jù)集為OLHWDB1.0和OLHWDB1.1。選取離線手寫數(shù)據(jù)HWDB1.1中的20個(gè)漢字,分別為:一,二,三,四,五,六,七,八,九,十,東,南,西,北,上,下,左,右,萬,丈。
表1 casia數(shù)據(jù)集
為了使該網(wǎng)絡(luò)對(duì)真實(shí)的攝像頭圖片更加友好,這里將ov5640采集的圖片也加入到數(shù)據(jù)集進(jìn)行該網(wǎng)絡(luò)訓(xùn)練。每個(gè)漢字一共拍攝了50張,并對(duì)圖片進(jìn)行顏色反轉(zhuǎn)、旋轉(zhuǎn)、隨機(jī)添加0%~10%的噪音等方法進(jìn)行數(shù)據(jù)增強(qiáng)。把320×240的圖片縮放為32×32再放進(jìn)神經(jīng)網(wǎng)絡(luò)一起訓(xùn)練,使得訓(xùn)練出的網(wǎng)絡(luò)更加適應(yīng)真實(shí)環(huán)境。采集圖片與數(shù)據(jù)集圖片對(duì)比如圖1、圖2所示。
圖1 ov5640采集圖片
圖2 數(shù)據(jù)集圖片
經(jīng)過反復(fù)訓(xùn)練與結(jié)構(gòu)改進(jìn),最終確定的CNN模型如圖3所示。此CNN結(jié)構(gòu)共有一個(gè)輸入層、六個(gè)卷積層、一個(gè)全連接以及一個(gè)輸出識(shí)別結(jié)果的softmax分類層。網(wǎng)絡(luò)全部采用3×3的卷積核。最后一層采用全局池化,其余層均采用2×2最大池化核。由于卷積核可以擴(kuò)大通道數(shù),池化可以縮小特征圖的大小,可以在模型架構(gòu)搭建得更深的同時(shí),放緩計(jì)算量的增加,并且獲得更大的感受野。每一層的尺寸和計(jì)算參數(shù)如表2所示,可以看出90%以上的計(jì)算量都集中在卷積層。由于在最后一層的卷積層后面加入全局池化,所以大大降低了全連接層的參數(shù)。
圖3 CNN網(wǎng)絡(luò)模型結(jié)構(gòu)
網(wǎng)絡(luò)層輸出尺寸參數(shù)數(shù)量權(quán)重/bias各層計(jì)算量/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——總計(jì)—18 600/1332 433 696
通過使用TensorFlow來進(jìn)行網(wǎng)絡(luò)訓(xùn)練,設(shè)置學(xué)習(xí)率learning rate為0.001,并且選擇SGD優(yōu)化器算法。經(jīng)過200次迭代訓(xùn)練后,最終可以實(shí)現(xiàn)98.36%測試集準(zhǔn)確率,模型的準(zhǔn)確率如圖4所示。
圖4 模型準(zhǔn)確率
通常,在CPU上搭建的神經(jīng)網(wǎng)絡(luò)均采用浮點(diǎn)數(shù)進(jìn)行計(jì)算。當(dāng)在硬件上實(shí)現(xiàn)時(shí),由于難以控制浮點(diǎn)數(shù)的尾數(shù)和各種操作的指數(shù),通常采用定點(diǎn)數(shù)進(jìn)行計(jì)算。
考慮到本網(wǎng)絡(luò)第一層卷積,輸入是二維矩陣32×32,其值為[0;1)(對(duì)原始圖片進(jìn)行歸一化處理后)。對(duì)于3×3卷積,第二層中某個(gè)特征值(i,j)可以如下計(jì)算:
(1)
由于權(quán)重ωi,j和偏差b已知,可以得到第二層輸入的最小值(mn)和最大值(mx)。設(shè)M=max(|mn|,|mx|)。將ωi,j和b除以M,則對(duì)于任意輸入數(shù)據(jù),可保證第二層上的值不超過1,稱M為卷積層的縮減系數(shù)。對(duì)于后面的每一層,都使用相同的方法,即可保證神經(jīng)網(wǎng)絡(luò)每一層輸入的值始終∈[-1;1],每一層的衰減系數(shù)見表3。
表3:每一層最大值和最小值及衰減系數(shù)
最后一層加入的是Softmax[8]函數(shù),公式如下:
(2)
雖然在過程中對(duì)權(quán)值的大小進(jìn)行了改變,進(jìn)而改變了最后的輸出,但由于最后的分類函數(shù)是Softmax,因而最后一層神經(jīng)元大小的相對(duì)位置沒有改變,所以不影響最終的輸出結(jié)果。
在對(duì)每一層執(zhí)行以上縮減方法之后,可以確切地知道每一層值的范圍,即可以從浮點(diǎn)運(yùn)算轉(zhuǎn)移到定點(diǎn)運(yùn)算,可以用xb=[x×2N],來表示每一位對(duì)應(yīng)的值。設(shè)z=x+y,那么加法可以表示為:
(3)
乘法可以被表示為:
(4)
將乘法結(jié)果除以2N,可以得到實(shí)際的值,硬件實(shí)現(xiàn)為將它移動(dòng)N位(取高N位),對(duì)應(yīng)的硬件電路如圖5所示。
圖5 定點(diǎn)化硬件電路
N為數(shù)據(jù)位寬,M為最大卷積核的尺寸,這里為9(3×3)。
使用帶卷積塊的定點(diǎn)計(jì)算時(shí),有兩種不同的方法:
(1)在每次加法和乘法的基本運(yùn)算后舍入;
(2)在每層卷積運(yùn)算后進(jìn)行全精度計(jì)算和舍入。
實(shí)驗(yàn)對(duì)比后發(fā)現(xiàn),在每層卷積運(yùn)算后舍入會(huì)取得更高的準(zhǔn)確度和更低的功耗。因此,本文最終選擇在卷積運(yùn)算最后進(jìn)行全精度的計(jì)算和舍入。
不同權(quán)重位寬[9-10]對(duì)應(yīng)的準(zhǔn)確率如圖6所示,在充分考慮識(shí)別精度和定點(diǎn)位寬資源消耗之后,文中最終確定11 bit的數(shù)據(jù)。相對(duì)于32 bit的浮點(diǎn)數(shù),模型參數(shù)的儲(chǔ)存量可以下降到原來的0.34。
圖6 不同權(quán)重精度對(duì)應(yīng)的準(zhǔn)確率
即該定點(diǎn)化方法處理后的網(wǎng)絡(luò)與浮點(diǎn)數(shù)的網(wǎng)絡(luò)等效工作,但定點(diǎn)化后的網(wǎng)絡(luò)參數(shù)量和計(jì)算量均大大減少,數(shù)據(jù)帶寬和計(jì)算效率顯著提高,更利于硬件實(shí)現(xiàn)。
CNN前向通道在FPGA上搭建的整體流程如圖7所示,相機(jī)拍攝的照片由圖像采集模塊采集,并將圖像信息存儲(chǔ)到DDR3中。從320×240的圖像中裁剪出224×224像素的中心部分,進(jìn)而得到需要的圖像尺寸32×32。224×224的圖像被分成7×7塊,計(jì)算這些塊中的每一個(gè)平均值,并在32×32圖像中形成對(duì)應(yīng)的像素。圖像降采樣算法簡單,降采樣后精度并無損失,并能將圖像裁剪到合適尺寸。
圖7 數(shù)據(jù)流程圖
卷積神經(jīng)網(wǎng)絡(luò)加速器設(shè)計(jì)如圖8所示,主要包括處理單元(CU)、片上緩沖(database)、卷積層、池化層、全連接層、激活函數(shù)(ReLU)和控制數(shù)據(jù)流的狀態(tài)機(jī)(FSM)。CU是加速器的基本單元。圖像數(shù)據(jù)存放在外部DDR中,經(jīng)過預(yù)處理縮放到32×32再送進(jìn)加速器計(jì)算。由于FPGA片上資源有限,卷積計(jì)算中間的特征圖需要先緩存于片上Buffer中,再送進(jìn)CU。這里使用雙Buffer來實(shí)現(xiàn)流水線操作,提高數(shù)據(jù)計(jì)算效率。
由Memorycontrol模塊控制卷積計(jì)算的輸入數(shù)據(jù)和輸出數(shù)據(jù)的緩存。狀態(tài)機(jī)(FSM)控制不同模塊的調(diào)用,來保證卷積核的復(fù)用。最后通過一個(gè)ReLU函數(shù)實(shí)現(xiàn)該卷積層的輸出。
圖8 神經(jīng)網(wǎng)絡(luò)加速器框圖
卷積單元(CU)的硬件實(shí)現(xiàn)如圖9所示。其中包含9個(gè)PE,PE的功能是把輸入一個(gè)特征值和權(quán)重系數(shù)相乘同時(shí)通過D觸發(fā)器將該特征值傳遞給下一個(gè)PE單元。在不使用乘法時(shí)通過EN_ctrl信號(hào)把乘法器關(guān)掉從而節(jié)約功耗。
在3×3的卷積運(yùn)算中權(quán)重?cái)?shù)據(jù)解碼后輸入到CU,特征數(shù)據(jù)通過FIFO輸入到卷積單元中,對(duì)應(yīng)執(zhí)行9次乘法運(yùn)算后,將得到的9個(gè)值進(jìn)行加法運(yùn)算求得這一部分的和,作為輸出。
圖9 CU模塊硬件實(shí)現(xiàn)
(1)權(quán)重復(fù)用
在執(zhí)行卷積運(yùn)算時(shí)要用到乘法器和加法器,并不停地讀寫特征數(shù)據(jù),過程中將消耗大量的資源。為了提高整體速度,降低資源消耗,本文提出如圖10所示的卷積核復(fù)用。由于網(wǎng)絡(luò)中卷積核大小均為3×3且結(jié)構(gòu)不算復(fù)雜,會(huì)提升網(wǎng)絡(luò)整體速度。同時(shí),采用卷積核復(fù)用,降低資源消耗。
圖10 卷積數(shù)據(jù)流
(2)移位寄存器
為執(zhí)行卷積運(yùn)算,需要從輸入圖像獲得9個(gè)相鄰像素的值,在下一次獲得的9個(gè)像素中,有6個(gè)像素已經(jīng)在前一步驟中被接收(參見圖11)。為了縮短數(shù)據(jù)調(diào)用的時(shí)間,本文開發(fā)移位寄存器以將新數(shù)據(jù)保持在其輸入端并同時(shí)讓舊數(shù)據(jù)退出。因此,每個(gè)步驟只需要3個(gè)新值而不是9個(gè)。
圖11 移位寄存器操作
(3)卷積核權(quán)重拼接
當(dāng)調(diào)用計(jì)算所需的數(shù)據(jù)時(shí),每個(gè)值在調(diào)用時(shí)都會(huì)占據(jù)一個(gè)時(shí)鐘周期。為了提高數(shù)據(jù)訪問的便利性,在放入RAM之前,數(shù)據(jù)以9個(gè)塊的形式堆疊,之后可以在一個(gè)同地址訪問它們。利用這種存儲(chǔ)方式,可以在一個(gè)時(shí)鐘周期內(nèi)執(zhí)行9個(gè)權(quán)重?cái)?shù)據(jù)的讀取,從而加速卷積和全連接層的計(jì)算(參見圖12)。
圖12 卷積核權(quán)重拼接
Modelsim仿真的波形如圖13所示,w11~w19表示權(quán)重?cái)?shù)據(jù),p11~p19表示圖像數(shù)據(jù)。從圖中可以看出,在一段時(shí)間內(nèi)權(quán)重?cái)?shù)據(jù)沒有變化而特征數(shù)據(jù)不斷改變。說明網(wǎng)絡(luò)在執(zhí)行時(shí)采用權(quán)重復(fù)用,提高了數(shù)據(jù)帶寬,降低了數(shù)據(jù)頻繁讀寫所帶來的額外功耗。
圖13 Modelsim仿真圖
本實(shí)驗(yàn)使用黑金Sparten6開發(fā)板AX545,AX545采用的是Xilinx的Spartan6系列XC6SLX45-2CSG324的FPGA作為核心處理器,具有豐富的硬件資源和外圍接口。它使連接外圍設(shè)備更容易;開發(fā)板板載了一片高速DDR3 DRAM,256 MB(128 M×16 bit),可用于存儲(chǔ)輸入圖像信息。電路板本身具有2.09 MB的RAM,可用于存儲(chǔ)神經(jīng)網(wǎng)絡(luò)的權(quán)重。
本文通過攝像頭采集實(shí)際手寫漢字來進(jìn)行檢測,并將實(shí)驗(yàn)結(jié)果與CPU實(shí)現(xiàn)進(jìn)行對(duì)比。漢字識(shí)別的最小速度應(yīng)該超過30 FPS,即神經(jīng)網(wǎng)絡(luò)應(yīng)在33 ms內(nèi)處理單個(gè)圖像。硬件開發(fā)平臺(tái)如圖14所示。
圖14 硬件平臺(tái)
實(shí)驗(yàn)結(jié)果展示在圖15中,成功識(shí)別出的漢字對(duì)應(yīng)的標(biāo)簽顯示在LCD右下角。每個(gè)漢字選取50個(gè)樣本,測試結(jié)果如表4所示,識(shí)別率均在94%以上。
圖15 實(shí)驗(yàn)結(jié)果展示
漢字樣本正確識(shí)別率/%漢字樣本正確識(shí)別率/%東504896一5050100南504794二504998西504998三504896北504794四504896上504998五504896下504896六504998左504794七504794右504794八504794萬504896九504896丈504896十504998
整個(gè)電路工作在100 MHz的時(shí)鐘頻率下,項(xiàng)目的資源消耗見表5。從表中可以看出在滿足實(shí)時(shí)性要求的同時(shí),DSP資源消耗93.1%,RAM使用率為84.5%。在計(jì)算中所需的乘法器和特征圖存儲(chǔ)空間,是二者消耗較大的主因。
表5 FPGA資源使用情況
表6是FPGA實(shí)現(xiàn)與CPU實(shí)現(xiàn)的速度和功耗對(duì)比。功耗由Xilinx Power Estimator(XPE)工具獲取。從中可以看出,識(shí)別1 000幅圖片,F(xiàn)PGA耗時(shí)為9.33 s,CPU耗時(shí)為72.43 s,速度提高6.76倍;FPGA功耗為 76.32 W,僅為CPU的26.28%。
表6 速度及功耗對(duì)比
本文提出了基于FPGA的CNN漢字識(shí)別系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn),其采用定點(diǎn)計(jì)算、卷積核分時(shí)復(fù)用等硬件優(yōu)化方法,在結(jié)構(gòu)簡化、速度相較CPU提升近7倍的同時(shí),達(dá)到幾乎無損的97.58%的正確率。由于參數(shù)數(shù)量較少,本文避免了內(nèi)存帶寬的常見問題,在FPGA資源允許的情況下,將在今后的工作中搭建更為復(fù)雜的神經(jīng)網(wǎng)絡(luò)。