范世朝,鄭國強,孫國慶,韓旭
(河南科技大學信息工程學院,河南 洛陽 471023)
常規(guī)的基于FPGA的人臉識別系統(tǒng)大多是利用HDL語言來實現(xiàn),這就要求開發(fā)者熟悉硬件之間的邏輯關(guān)系。為了使軟件開發(fā)者能更方便的參與FPGA開發(fā),Xilinx公司推出了HLS高層次綜合工具和PYNQ系列FPGA開發(fā)板。對于軟件開發(fā)者可以在HLS平臺利用C語言實現(xiàn)邏輯功能,之后高層次綜合會自動將C語言轉(zhuǎn)化為Verilog語言,生成相應的IP核。而PYNQ系列開發(fā)板ARM端內(nèi)置Jupyter notebook網(wǎng)絡服務器,Linux系統(tǒng)和IPython內(nèi)核,可以十分方便的利用Python對生成的IP核進行調(diào)用,大大降低了開發(fā)門檻[1]。
本文利用PYNQ-Z2開發(fā)板為基礎(chǔ),設(shè)計出一個基于卷積神經(jīng)網(wǎng)絡的人臉識別系統(tǒng),該系統(tǒng)能夠識別輸入的人臉圖像的面部特征,并判斷目標是否是訓練庫中的用戶,如果是會在結(jié)果中標識出目標的名字。該系統(tǒng)的總體架構(gòu)如圖1:
圖1 系統(tǒng)總體架構(gòu)圖
利用Python調(diào)用PC端的攝像頭,實時采集圖像數(shù)據(jù),并進行人臉識別,當識別出人臉時,會自動抓取圖片并進行保存。這里對人臉進行識別的方法是調(diào)OpenCV的cv2級聯(lián)分類器haarcascade_frontalface_alt2.xml,同時在調(diào)用級聯(lián)器時,對級聯(lián)器的detectMultiScal函數(shù)中minNeighbors參數(shù)進行設(shè)置,來設(shè)定需要達到的檢測有效點數(shù),本文需要達到的檢測有效點數(shù)是2,意味著只有連續(xù)兩次識別成功時才會認為識別出了人臉數(shù)據(jù)。同時為了保證后續(xù)進行模型訓練時圖像的大小相同,在識別時設(shè)置保存的人臉圖像大小統(tǒng)一為64×64[2]。
整個數(shù)據(jù)集的制作流程如下:
圖2 數(shù)據(jù)集制作流程
訓練主要采用的是TensorFlow框架。訓練時,系統(tǒng)輸入層大小是64×64,卷積層有32個3×3大小的卷積核,并使用same方式卷積。池化層與卷積層交替循環(huán),三次池化均為最大池化,大小為2×2。第三層池化層之后是一層全連接層和一層輸出層。經(jīng)8個輸出端的輸出層輸出預測結(jié)果。訓練時選用的激活函數(shù)是ReLU函數(shù),使用TensorFlow自帶的AdamOptimizer優(yōu)化器對模型參數(shù)進行訓練。模型訓練完畢后將生成的模型文件導入Jupyter notebook[3][4]。
卷積神經(jīng)網(wǎng)絡的重點在卷積層,池化層和全連接層,其中,全連接層我們通過復用卷積模塊的方式來使用,這樣可以節(jié)省片上資源,只需要將卷積核的大小從3×3改為16×16,但是也要注意一些參數(shù)維度的改變。設(shè)計方案如下:
通過HLS設(shè)計平臺,利用C語言或者C++設(shè)計子函數(shù)實現(xiàn)卷積層和池化層,之后進行高級綜合將其轉(zhuǎn)化為Verilog語言,封裝成IP核。IP核設(shè)計完成后需要設(shè)計block design以使IP核與ARM端通信。這里卷積模塊與池化模塊都通過AXI總線與PYNQ連接,在導入IP核后VIVADO會自動進行連接,連接后的結(jié)果如下:
圖3 block design 設(shè)計
之后將設(shè)計好的block design導出為bit文件和tcl文件,并將導出的bit文件和tcl文件下載到PYNQ開發(fā)板的SD卡中就可以復現(xiàn)人臉識別系統(tǒng)。
將訓練好的模型文件和生成的bit和tcl文件導入Jupyter notebook后就可以編寫Python代碼復現(xiàn)人臉識別系統(tǒng)。首先需要在Python代碼中導入Overlay以便于調(diào)用制作的卷積層和池化層的函數(shù),之后利用OpenCV識別待檢測圖像的人臉部分,提取出來人臉特征與模型文件進行比對,之后將比對結(jié)果進行輸出即可。
本設(shè)計用的仿真策略是通過HLS工具編寫test bench文件對卷積模塊和池化模塊進行仿真驗證。
對于卷積層模塊仿真如下圖所示,使用same方式進行卷積,所謂same方式卷積,即在進行卷積運算會在輸入四周補零之后再進行運算,可以保證輸入和輸出的矩陣大小是等同的,仿真結(jié)果如下:
圖4 卷積模塊仿真
資源占用情況如下,其中DSP:主要用來進行數(shù)字信號處理。LUT是查找表,但是本質(zhì)上就是一個RAM,它把數(shù)據(jù)事先寫入RAM后,每當輸入一個信號就等于輸入一個地址進行查表,找出地址對應的內(nèi)容,然后輸出。FF:觸發(fā)器,一種時鐘信號觸發(fā)時才能動作的存儲單元電路。
圖5 資源占用
對于池化層模塊,使用3×3最大池化,即在3×3的區(qū)域內(nèi)選擇一個最大值進行輸出:
圖6 池化模塊仿真
其中資源占用情況如圖所示:
圖7 資源占用
本文提出了一種基于PYNQ-Z2的FPGA人臉識別系統(tǒng),同時構(gòu)建其軟硬件平臺,使用OpenCV級聯(lián)器進行人臉檢測,使用卷積神經(jīng)網(wǎng)絡訓練模型,利用HLS生成卷積層和池化層的IP核,并利用其仿真工具編寫test bench文件對結(jié)果進行了仿真測試,經(jīng)過測試可知,本文提出的方法能夠滿足實際需求,并無需考慮硬件的邏輯結(jié)構(gòu),顯著降低了開發(fā)難度,同時資源占用較低。