張 強,孫 靜+,王威廉,康立富
(1.云南大學 信息學院,云南 昆明 650500;2.云南師范大學商學院 數據科學與工程學院,云南 昆明 651701)
一個完整的卷積神經網絡(convolutional neural networks,CNN)包括輸入層、隱藏層和輸出層。隱藏層的每個神經元只與前一層的局部神經元相連,并提取該局部域的特征,其每一個計算層都由多個特征映射組成,每個特征映射是一個平面,平面上所有神經元的權值相等,輸出層接收來自隱藏層的向量,可設計為輸出物體的中心坐標、大小和分類[1]。在現有的可參考文獻中,CNN圖像處理大多是在PC端進行訓練和測試,基于中央處理單元(central processing unit,CPU)的算法只能順序執行,在處理大量數據的計算時,會帶來明顯的時間延遲,即使是高性能計算機也不能完全保證低延時的實時圖像處理。
現場可編程門陣列(field programmable gate arrary,FPGA)具備并行結構,可同時高速并行處理數據,提高圖像處理的實時性,廣泛應用于邊沿檢測、灰度轉換、閾值檢測等實時圖像處理算法中。基于CNN隱藏層參數可共享的特點,利用FPGA進行CNN實時圖像處理的硬件加速,即可解決CNN對PC資源的高依賴、高延時等缺陷[2,3]。本文對CNN圖像處理算法的并行執行能力進行了研究,采用Vivado高層次綜合(high-level synthesis,HLS)實現了將訓練好的CNN模型隱藏層參數共享,并用FPGA加速CNN實時圖像處理。實驗結果表明,本文提出的方法達到了預期目的,該方法識別國家標注技術研究所(mixed national institute of standards and technology,MNIST)庫中10 000例手寫體樣本僅需8.69 s,而傳統PC端識別相同樣本的時間為30 s。此方法具有設計周期短、設計封裝為IP(intellectual property,IP)核后,易跨平臺移植等優勢。
為便于CNN算法的硬件加速實現圖像實時處理的目的,將CNN算法的隱藏層進行了自定義設計,包括兩個卷積層、兩個池化層及一個全連接層,三者在隱藏層中的執行順序如圖1所示[4]。

圖1 CNN隱藏層流程
本方法設計的CNN一共有兩個卷積層,目的是將局部特征提取出來,leraning-rate_param包含權重值與偏置值的學習率,前者決定分割平面的方向所在,后者決定豎直平面沿著垂直于直線方向移動的距離,二者共同決定訓練出的特征值與真實值之間的差距;激活函數負責將上一層網絡上的輸入映射到輸出端,提供下一層網絡的輸入向量。在卷積層之間、卷積層與全連接層之間都需要激活函數實現向量映射;在兩個激活函數之后皆有分別對應的池化層,目的是對提取的特征值做一次濾波,簡化網絡計算復雜度,提取主要特征;全連接層在整個卷積神經網絡中起到“分類器”的作用,將學到的“分布式特征表示”映射到樣本標記空間,使得輸出層能有更好的圖像視覺效果。
整個實驗過程中可以根據自己的需要調整CNN隱藏層參數,如圖1花括號內英文變量所表示,根據識別效果的收斂性,反饋到卷積層與全連接層中,修改leraning-rate_param、weight_filler、bias_filler等參數來調整CNN的訓練模型以達到更好的訓練與識別效果[5]。
卷積神經網絡框架Caffe(convolutional architecture for fast feature embedding)是一種常見的深度學習框架,主要應用在視頻、圖像處理方面的應用上。目前深度學習的框架大多運行在高性能計算機上,以達到更快的訓練與識別速度,在PC端搭建和配置Caffe是訓練CNN模型的基礎,得到訓練好的CNN模型caffemodel.h5即可進行硬件加速CNN實時圖像處理[6]。
在Caffe框架下,可以直接運行MNIST數據庫中手寫體數字數據集的下載腳本get_mnist.sh即可得到如圖2所示的4個壓縮文件,且解壓后皆是以向量與多維度矩陣文件格式存儲的文件。

圖2 MNIST手寫體數據集壓縮包
前兩個壓縮文件分別是CNN訓練時使用的60 000例圖像文件與對應的標簽文件;后兩個壓縮文件分別是測試CNN模型caffemodel.h5時使用的10 000例圖像文件與對應的標簽文件,圖像文件共由5個部分組成,見表1,標簽文件由3個部分組成,見表2。

表1 數據集圖像文件的組成

表2 數據集標簽文件的組成
由于上述4個文件為二進制原始數據文件,不能在Caffe中直接使用,可以直接運行Caffe環境下自帶的create_mnist.sh腳本文件,將原始數據制作成為Caffe可以識別的lmdb格式文件,即可在Caffe中直接使用。
Caffe環境下新建兩個腳本,一個是訓練用的CNN網絡結構腳本two_conv_train.prototxt,另一個是訓練用的CNN參數腳本two_conv_train_solver.prototxt,前者按照圖1所示流程編寫,后者主要設置訓練次數、模型參數、最大迭代次數及模型輸出參數等,具體參數設置參照表3[7]。

表3 CNN網絡訓練參數
設置完成后,可直接運行two_conv_train_ex_solver.prototxt腳本,經過多次調參并訓練完成后,可得到two_conv_train_iter_70000.caffemodel.h5。在PC端利用Intel i7-8700 CPU測試訓練好的CNN網絡模型,可達到0.99的準確率,耗時30 s。如圖3所示,此caffemodel.h5模型即為優化后的CNN模型文件,可以在硬件加速CNN實時圖像處理中得以應用[8]。

圖3 PC端CNN識別手寫體結果
根據上述得到的caffemodel.h5模型,編寫提參腳本直接提取模型參數的權重值和偏置值,并與卷積核數保持對應一致,各卷積層與全連接層的權重值與偏置值的個數見表4。

表4 隱藏層內各子分類的權重值
將caffemodel.h5模型讀取出的權重值和偏置值參數保存為conv1p.txt、conv2p.txt、FC.txt3個文檔,分別對應卷積層1、卷積層2、全連接層的模型參數,在Vivado HLS中以C++語言讀取模型參數的文本文檔,供硬件加速CNN實時圖像處理使用。
本方法設計的CNN網絡具有兩個卷積層、兩個池化層、一個全連接層、兩次激活函數,包含6個5*5的卷積核,所以在每一個卷積層內采用6個循環遍歷卷積核行、卷積核列、圖像通道、圖像高度、圖像寬度、卷積核的點,可用圖4所示代碼表示[9]。

圖4 硬件化的CNN模型設計
每一層卷積層內一共使用了5個乘法器并行實現,在CNN的硬件加速中,將乘法器固化成硬件的核,以方便后續調用,每一個乘法器的核心代碼如圖5所示[10]。乘法器可固化為硬件核,本質上是將輸入的數據直接以寄存器的方式賦值,從上至下使用了4個for循環進行矩陣的轉換,且添加了兩個#pragmaHLSPIPELINE一級流水的約束關鍵字,通過允許并發執行操作來減少函數或循環的啟動間隔。整個卷積層使用6個for循環實現卷積核與圖像的卷積運算,再使用5個乘法器核并行實現累加得到該卷積層的結果,并輸出到激活函數[11]。

圖5 基于Vivado HLS的乘法器原型設計
在Vivado HLS中用C++編寫讀取caffemodel.h5模型參數文檔,用于輸入圖像在卷積層中的調用,從輸入層導入MNIST手寫體數據集之后,各層間的流程如圖6所示。
將28*28大小的輸入數據用卷積層1的參數進行卷積,并作為結構體c1輸出;將結構體c1的輸入向量經過Relu函數處理,得到大于0的數據再通過池化層1處理得到結構體s2。
同理再一次將結構體s2輸入到第二層卷積層卷積、激活函數Relu處理及池化層2處理,得到的結果數據保存為結構體s4;將s4輸入到全連接層進行全局變量提取,再經過輸出層處理即可得到識別出的手寫體數字[12]。

圖6 硬件加速CNN的模型設計
硬件加速CNN的TestBench文件的編寫,遵從Vivado HLS格式規范,按照如圖7所示的流程進行編寫。
圖7中,輸入層的數據集是來自MNIST的手寫體測試數據集,分別是t10k-images-idx3-ubyte與t10k-label-idx1-ubyte兩個二進制數據文件,讀取的數據集參數即可直接進入硬件加速CNN算法中運算[13]。測試數據集在硬件加速CNN算法中的運算,是將卷積層的各個卷積核利用FPGA并行實現的方式,在相同時鐘周期到來時,全部卷積核同時與測試數據集參數執行完卷積運算,得到的卷積結果也可以在相同時鐘周期內完成激活函數、池化層的運算,進而在下一個時鐘周期來臨時,可繼續進行再一次的卷積、激活函數、池化的循環運算,直到輸出結果并結束運算。將經FPGA并行實現CNN圖像處理得到的輸出結果進行標簽判斷,將正確的識別結果與錯誤的識別結果及數量輸出,完成整個硬件加速CNN的圖像處理。

圖7 硬件加速CNN仿真文件編寫流程
在Vivado HLS中編譯C++編寫的硬件加速CNN圖像處理的算法,可以直接轉換成RTL級硬件電路,同時封裝為可以在Vivado中直接調用的Verilog IP核,方便日后硬件加速CNN圖像處理算法移植到高性能處理平臺Zynq片上系統(system on chip,SOC)中。
在Vivado HLS中利用C++語言編寫硬件加速CNN圖像處理算法,通過運行硬件加速CNN算法識別MNIST數據庫中的手寫體數字,得出如圖8所示的結果,同時Vivado HLS串口打印出實現本方法的時間消耗見表5,FPGA模塊資源消耗見表6。
從識別結果中可以看出,標簽數一共有7種,識別正確的也是7種,錯誤識別的標簽是0個,與CNN在PC端的測試準確率0.99基本吻合,可見本方法在識別效果上與PC端的效果幾乎一致。

圖8 硬件加速CNN識別手寫體數字結果
從本方法識別MNIST數據庫中10 000例手寫體數據樣本所消耗的時間來看,PC端利用Intel i7-8700 CPU測試訓練好的網絡耗時30 s,本次實驗結果產生的8.69 s耗時降低了77.7%的時長,單例樣本的識別時長為0.87 ms,低于人眼舒適放松時長1/24 s[14]。此外,表6所示塊狀RAM和FF模塊占用率達到20%左右,數字信號處理器模塊、顯示查找表占用率達到了67%左右,而本方法在Vivado HLS中選擇的芯片是Zynq 7020,所以均在Zynq 7020可編程邏輯(progarmmable logic,PL)承受范圍內,較好的實現了硬件加速CNN實時圖像處理。

表5 硬件加速CNN圖像處理所消耗的時間

表6 硬件加速CNN圖像處理的各模塊資源消耗情況
本方法實現了CNN圖像處理的硬件加速,8.69 s的耗時、Zynq 7020芯片硬件模塊占用率在20%至68%之間,相比PC端30 s的時間消耗、PC端資源的高依賴,硬件加速CNN圖像處理具有高實時性、低成本的優點。同時將硬件加速CNN圖像處理的C++程序封裝打包為Verilog IP,方便以后移植到Zynq SOC中去,應用到更多的領域。
本文在Vivado HLS中,設計實現了硬件加速CNN圖像處理,通過測試驗證得到與PC端相似的識別效果,彌補了CNN圖像處理對PC資源高依賴、高延時的缺陷,為CNN圖像處理的硬件加速推廣應用提供了可參考的方法。