裴悅琨 - 谷 宇 連明月 -
(1. 大連大學遼寧省北斗高精度位置服務技術工程實驗室,遼寧 大連 116622;2. 大連大學大連市環境感知與智能控制重點實驗室,遼寧 大連 116622)
卷積神經網絡(convolutional neural networks,CNN)是目前性能較好的深度學習算法之一。通過其網絡模型和足夠的訓練數據集,CNN可以為某些任務生成復雜的功能,勝過傳統的人工算法。目前,CNN已成功應用于手寫體數字識別及交通標志識別[1-2]等,并且取得了較好的效果。
基于CNN的水果品質檢測大多是在軟件平臺上實現。劉云等[3]基于CNN對蘋果進行分塊缺陷檢測,并且在軟件平臺上進行訓練和測試,檢測速度達到5個/s,且正確率高達97.3%;裴悅琨等[4]對櫻桃的缺陷進行檢測和識別,利用CNN對采集的櫻桃圖片進行測試,基于CPU的軟件平臺上識別速度可達25個/s;伍錫如等[5]構建一個多層卷積神經網絡,在英特爾i5平臺上對水果采摘機器人視覺識別系統進行測試,單張水果圖像的識別速度只需0.2 s。這些軟件平臺都是基于通用的處理器,然而CNN具有很高的并行度,通用處理器主要用來控制指令調度、執行和邏輯判斷,并不適合用來大量的并行計算[6]。因此基于軟件方式的CNN在實時性和能耗方面都不能適應實際水果檢測中場外作業的需求。目前大部分對于CNN的研究主要還是采用GPU,但是對于GPU功耗大的問題一直存在,所以在需要電池供電的嵌入式設備中也是很難得到應用。
現場可編程門陣列(field programmable gate array,FPGA)具有強大的并行處理能力、靈活的可配置特性和超低功耗,使其成為CNN實現平臺的理想選擇。王巍等[7]充分利用CNN的并行計算特征,進行了CNN算法的FPGA并行結構設計,提高了資源利用率且計算效率也得到大幅提升;Ma等[8]使用RTL編譯器完成CNN網絡的硬件加速,使用FPGA在100 MHz的工作頻率下得到2倍的性能提升,然而上述基于硬件描述語言(HDL)或者邏輯圖的設計方法難度較大,周期較長并且在數學運算上存在許多弊端,極大地阻礙了FPGA中進行人工智能的快速開發[9]。Danopoulos等[10]的研究充分地展現了FPGA快速開發的優勢,將網絡框架移植到FPGA的ARM(基于Zynq-7000)處理器中,在Xilinx的SDSoC開發環境中設計硬件加速器,并利用硬件加速器顯著提高神經網絡執行速度。
試驗擬采用美國Xilinx公司發布的SDSoC開發環境,通過使用C/C++在目標平臺上完成完整的硬件/軟件系統的編譯、實現、調試執行等全過程[11]。利用卷積網絡并行結構的特點,采用高級語言映射卷積神經網絡模型并進行優化設計,通過處理器系統(Processing System,PS)和可編程邏輯(Programmable Logic,PL)的協同處理實現一個完整的軟硬件系統,為櫻桃的快速、準確地檢測分級提供新的方法和策略。
相比普通的圖像處理算法,卷積神經網絡僅需少量的預處理,識別范圍廣,能容許圖像的畸變,對幾何變形具有很好的魯棒性,其經典網絡模型包含卷積層、池化層、全連接層等結構。其中卷積層即特征提取,針對圖像上存在的特征進行局部感知,緊接著進行多層卷積獲取全局信息。
池化層也叫下采樣層。主要用作降低特征維度,減小過擬合的發生,同時增強系統的容錯性。
全連接層即輸出層,主要對數據進行歸一化處理,避免數據值大的節點對分類造成影響,最終進行正確的圖片分類。
卷積過程如圖1所示:輸入層的圖像首先通過多個卷積層、修正線性單元(rectified linear unit,ReLU)以及最大池化層運算,之后進入全連接層,最后通過輸出層得到最終的分類結果。

圖1 卷積神經網絡結構
針對櫻桃缺陷的特點,設計CNN模型。該模型包括卷積層、修正線性單元、最大池化層以及全連接層。模型設計如表1所示。

表1 CNN模型設計
櫻桃缺陷檢測與識別系統的結構設計如圖2所示。主要包括圖像采集、HDMI接口、SD卡數據讀取、圖像預處理、PL端加速和終端顯示等模塊。其中系統全局控制在ARM處理器完成,主要負責HDMI接口調用、數據傳輸,對圖像進行預處理,并完成加速函數對PL端的寫入工作,最終PS端將分類結果顯示在終端顯示器上。

圖2 系統結構設計框圖
由于卷積模塊和硬件接口模塊計算密集且模塊化較強,因此將其模塊放入FPGA的PL端實現。該系統優點是在Xilinx的SDSoC開發環境中采用軟硬件結合的形式,復用卷積模塊以及使用優化指令對卷積層和數據傳輸進行優化,節省資源,提高識別效率。
整個網絡模型移植到Zynq 7020 SoC以便在ARM內核上運行。為了使網絡在Zynq上運行,必須使用SDSoC環境中包含的ARM交叉編譯器對整個模型進行交叉編譯。SDSoC是Xilinx提供的基于IDE的框架,該框架允許為Zynq平臺開發硬件/軟件嵌入式系統。該平臺提供了定義,集成和驗證硬件加速器的能力,該硬件加速器將加速特定功能,稍后將對其進行描述,生成ARM軟件和FPGA比特流,同時生成SD映像,以便脫機進行SD卡讀取[12]。SDSoC網絡映射開發流程如圖3所示。

圖3 SDSoC網絡映射開發流程
該系統通過HDMI接收、輸出圖片,采用輸入輸出級優化、通用矩陣乘法函數復用優化以及卷積操作并行化設計,實現對輸入輸出級設計和CNN計算密集的卷積層加速。
對于HDMI接收設計,可調用相關IP進行驅動。因此硬件設計的重點即數據傳輸優化、通用矩陣乘法函數復用和卷積操作并行化設計和優化。
2.3.1 數據傳輸優化 數據傳輸優化主要包括PS和PL接口優化和數據傳輸方式優化。如圖4所示,PortA和PortB接口分別為PS端和PL端接口,Data Mover為PS和PL之間進行數據傳輸的方式。因此,數據傳輸優化即對PortA、PortB和Data Mover進行優化設計。

圖4 數據傳輸接口
通常大部分的權重參數和算法模型存在DDR中,PS和PL則通過AXI標準總線接口進行數據的交互,AXI接口包括通用AXI接口(AXI_GP)、加速器一致性接口(AXI_ACP)和高性能接口(AXI_HP)[13]。
鑒于訪問DDR延遲會導致讀寫速度緩慢,在PS端與PL端對數據的傳輸進行優化。傳輸接口及傳輸方式的相關優化指令:
//system port
#pragma SDS datasys_port(input:AXI_HP,output:AXI_HP)
//data mover
#pragma SDS datamem_attribute(input:PHYSICAL_CONTIGUOUS|
NON_CACHEABLE,output: PHYSICAL_CONTIGUOUS|NON_CACHEABLE)
#pragma SDS data copy(input[0:WIDTH*HEIGHT],output[0:WIDTH*HEIGHT])
//accelerator
#pragma SDS dataaccess_pattern(input:SEQUENTIAL,output:SEQUENTIAL)
SDS datasys_port指令用于直接約束PS端總線接口類型,試驗選擇HP類型。AXI_HP接口具有高性能和高帶寬的特性,其內部配置異步FIFO作為高速數據讀寫的緩沖。相反AXI_GP則是沒有配置緩沖的中低速接口,AXI_ACP主要實現PS中cache和PL單元之間的一致性接口,因此都不適合。
SDS data mem_attribute用于約束矩陣數據存放地址的連續性。硬件綜合時,SDSoC平臺會選擇傳輸連續內存更快的AXI_DMA_Simple,而不是AXI_DMA_SG。
SDS data copy指令約束內存大小,意味著SDSoC會將硬件加速器的接口通過AXI總線直接連接到PS的存儲器,對其進行一定內存大小的數據傳輸。
SDS dataaccess_pattern指令約束訪問數據的方式,在CNN中都是按照圖像每行像素的順序進行卷積操作,所以將SEQUENTIAL設置為數據訪問的方式,那么綜合時自動生成順序訪問的接口協議(例如ap_fifo),而不是生成隨機訪問的接口,大大提高了數據訪問速度。
采用綜上4條優化指令,可以在連續的物理空間中按照數據流的方式訪問數據,降低數據傳輸延遲,增大數據吞吐率。試驗中,傳輸圖像及權重偏置信息均采用此方式加載。
2.3.2 通用矩陣乘法函數復用 CNN中最為密集的計算是卷積,每個卷積層都要進行線性矩陣乘法和加法運算即通用矩陣乘法(GEMM)函數,利用FPGA來實現可以有效地提高卷積計算效率,并降低功耗,區別在于特征圖的尺寸不同。對于這一結構上的差異,應將其同構化達到復用的目的。
在不造成卷積運算誤差的前提下,對所要進行卷積操作的特征圖進行補零。如圖5所示,除了輸入特征圖,之后的卷積操作的特征圖的寬和高均小于輸入特征圖尺寸,因此對其進行填補零值,使其尺寸與輸入特征圖尺寸相同。因此,與權重的矩陣乘法操作使每一層的卷積運算具有了同構性。在SDSoC中可以專門定義通用矩陣乘法(GEMM)函數并且每一次卷積都可以調用該函數,卷積運算可以復用相同的控制電路,從而節省硬件資源的開銷。

圖5 特征圖同構化
2.3.3 卷積操作并行化
(1) 矩陣分塊優化:對于卷積層中較大的數組拆分為多個較小的數組,用于增加數據訪問的并行性。通過使用ARRAY _PARTITION指令對數組進行分塊。在文中優化卷積操作使用下述代碼結構。對二維數組進行降維,將二維數組分解為若干個小寄存器,提高并行度。相關指令:
#pragma HLSarray_partition variable=in_Bcomplete dim=2
(2) 流水線優化:流水線優化能夠將一個延時較大的操作切割成多個小操作并行執行,這樣就大大增加了總體的運行速度。采用PIPELINING約束指令來使結構執行流水線操作。為了不消耗太多的硬件資源并且不浪費太多的數據延遲,綜合考慮選擇在第2層循環內添加優化命令,可以使得工作頻率提高將近1倍。流水線優化使用PIPELINING指令:
for(index_a = 0; index_a< A_NROWS; index_a++){
for(index_b = 0; index_b< A_NCOLS; index_b++){
#pragma HLS PIPELINE
//next operations
}}
(3) 循環展開優化:默認情況下,卷積的所有嵌套循環都是按順序執行的。循環展開優化可以提高循環迭代之間的并行性,增加FPGA計算資源的利用率。如圖6所示,將特征圖和權重通過移位寄存器分別展開,并且進行并行乘加運算。

圖6 循環展開優化
在卷積過程中,通過使用UNROLL優化指令對for循環進行展開。展開最內層for循環,每一層權重的乘積作為一個獨立的處理單元(PE),使得PE核最小化。將第3層for循環展開作為PE的并行數量,用來一次獲得多個輸出層的部分和,部分代碼:
//multiply accumulate broken into individual operators
#pragma HLS UNROLL
for(index_d = 0; index_d< B_NCOLS; index_d++){
floatresult + = weights[index_c][index_d]*input_fm[index_c+i][index_d+j];
}
output_fm[i* A_NROWS +j]=result;
(4) 函數內聯優化:此外,試驗還使用了函數內聯優化指令INLINE,去除子函數層次結構,通過減少函數調用開銷來改善延遲。指令:
#pragma HLS INLINE self
在硬件設備上,基于Xilinx Zynq7020開發板實現網絡的加速,開發板為異構芯片,該芯片有2個ARM A9處理器作為處理系統(PS),還有一個可編程邏輯(PL)XC7Z020用于硬件加速,開發板如圖7所示;此外,開發板通過SONY IMX222 CMOS相機對采集的櫻桃圖片進行測試,試驗還配有一臺顯示器用于測試結果的終端顯示,如圖8所示。

1. SONY IMX222 CMOS相機 2. 圓頂光源 3. 櫻桃樣本 4. Xilinx Zynq7020開發板 5. 終端顯示器

圖7 Xilinx Zynq7020開發板結構圖
在硬件模塊化設計上,試驗基于Xilinx Vivado 2016.4軟件,將數據傳輸模塊,通用矩陣乘法模塊以及接口模塊分別生成各個硬件IP,完成硬件模塊化設計。數據的內部傳輸采用AXI Interconnect模塊,即AXI互聯矩陣,能夠實現將主設備和從設備的互聯;外部數據傳輸采用 HDMI模塊實現圖像數據傳輸,并利用異步FIFO模塊作為幀緩沖區,緩存數據。內部PS模塊包含一個Zynq處理器硬核,實現各IP初始化與配置。定義的Mmult模塊實現卷積操作,其內部通用矩陣乘法IP在卷積層進行復用。
分別在PC機、純ARM軟件和試驗加速器3種平臺進行試驗,結果如表2所示。

表2 PC機、純ARM和試驗加速器3種平臺比較
在制作數據集的過程中,在實驗室的環境下對采摘來的櫻桃進行圖像采集。為了能覆蓋每個櫻桃的完整表面,試驗使用Basler acA2000-50gc工業相機對櫻桃的6個不同角度進行采集;利用Matlab對圖像進行裁剪、旋轉、縮放等操作來擴大樣本數據;最后將所有的待訓練圖像統一成32×32規格大小。部分樣本示例如圖9所示。
訓練在Caffe平臺下進行,操作系統為Ubuntu16.04,使用Python搭建CNN模型,采用監督式學習的方法對櫻桃樣本進行訓練。最后的全連接層的輸出通道即分類數,將櫻桃分為3類,分別為:裂口、完好和畸形。用于訓練的櫻桃圖片18 000張,采用人工標記的方法對訓練樣本進行標記。
試驗選取600張櫻桃原圖進行測試,每個分類各200張,將裂口和畸形的櫻桃歸為缺陷櫻桃。試驗先在PC機上利用Python進行測試,再將測試圖片放入FPGA進行測試,如表3所示,可以發現在FPGA上,準確率幾乎沒有下降。
工程編譯完成之后,.BIN文件會自動在release目錄下的sd_card文件夾下生成。將.BIN文件拷貝到SD卡中,設置開發板為SD卡啟動模式。連接好終端顯示器,顯示器左上角為識別出櫻桃結果的黃色標簽,試驗運行結果部分展示如圖10所示。

圖10 試驗運行結果部分展示
Zynq XC7Z020資源包括:18 K大小的Block RAM 140個,查找表(LUT) 53 200個,觸發器(FF)106 400個和數字信號處理器(DSP)220個,文中2個硬件加速函數在硬件中的資源占用使用情況和運行時長如表4所示。

表4 硬件加速函數資源占用和運行時長
輸入同樣尺寸大小的圖片在不同平臺下分別進行測試,如表5所示。結果表明在純ARM軟件中對單張櫻桃圖片檢測處理需要57.89 ms,而在硬件平臺上需26.42 ms,其檢測處理速度是純ARM軟件的2.19 倍。

表5 純ARM軟件與試驗加速器對櫻桃圖片處理時長比較
裴悅琨等[4]選用CPU型號為intel(R)Core(TM) i5-6500 CPU @ 3.20GHzHP LV2011的PC機對櫻桃進行檢測,測試實際圖片時在網絡中將輸入圖片的尺寸縮放為64×64,因此將FPGA中網絡的縮放尺寸改為64×64,并與文獻[4]的處理時間進行比較,如表6所示。

表6 CPU平臺與試驗加速器對櫻桃圖片處理時長比較
由表6可以看出,當輸入圖像尺寸擴大一倍時,一幅圖片的處理時長為42.59 ms,對比原來圖像尺寸延長了16.17 ms,與文獻[4]的CPU平臺處理時長相當,但是試驗系統所使用的時鐘頻率與CPU平臺相差甚遠,若使用性能更好的FPGA,速度應超過CPU平臺。而且試驗系統具有小型化、手持化的特點,與CPU平臺相比具有很強的實際應用價值。
試驗利用SDSoC快速開發平臺,協同處理PS端與PL端,實現一個快速櫻桃檢測的軟硬件系統。通過對系統硬件設計及優化,大大提高了系統的計算性能,與純ARM軟件和CPU實現的算法相比,使用軟硬件協同處理對算法的加速效果明顯,滿足實時性與低成本的要求。試驗系統可以不使用PC機,便攜性大大提高,同時可拓展性好,具有很大的市場空間。
試驗系統還有進一步優化的空間,比如增加學習樣本種類、建立合理的分類分級邏輯和改進神經網絡模型結構等。同時筆者正在嘗試其他水果數據應用于此系統,以使其能檢測更多水果缺陷,最終形成一個實用的快速自動水果缺陷檢測與識別系統。