裴悅琨 - 谷 宇 連明月 -
(1. 大連大學遼寧省北斗高精度位置服務技術(shù)工程實驗室,遼寧 大連 116622;2. 大連大學大連市環(huán)境感知與智能控制重點實驗室,遼寧 大連 116622)
卷積神經(jīng)網(wǎng)絡(convolutional neural networks,CNN)是目前性能較好的深度學習算法之一。通過其網(wǎng)絡模型和足夠的訓練數(shù)據(jù)集,CNN可以為某些任務生成復雜的功能,勝過傳統(tǒng)的人工算法。目前,CNN已成功應用于手寫體數(shù)字識別及交通標志識別[1-2]等,并且取得了較好的效果。
基于CNN的水果品質(zhì)檢測大多是在軟件平臺上實現(xiàn)。劉云等[3]基于CNN對蘋果進行分塊缺陷檢測,并且在軟件平臺上進行訓練和測試,檢測速度達到5個/s,且正確率高達97.3%;裴悅琨等[4]對櫻桃的缺陷進行檢測和識別,利用CNN對采集的櫻桃圖片進行測試,基于CPU的軟件平臺上識別速度可達25個/s;伍錫如等[5]構(gòu)建一個多層卷積神經(jīng)網(wǎng)絡,在英特爾i5平臺上對水果采摘機器人視覺識別系統(tǒng)進行測試,單張水果圖像的識別速度只需0.2 s。這些軟件平臺都是基于通用的處理器,然而CNN具有很高的并行度,通用處理器主要用來控制指令調(diào)度、執(zhí)行和邏輯判斷,并不適合用來大量的并行計算[6]。因此基于軟件方式的CNN在實時性和能耗方面都不能適應實際水果檢測中場外作業(yè)的需求。目前大部分對于CNN的研究主要還是采用GPU,但是對于GPU功耗大的問題一直存在,所以在需要電池供電的嵌入式設備中也是很難得到應用。
現(xiàn)場可編程門陣列(field programmable gate array,F(xiàn)PGA)具有強大的并行處理能力、靈活的可配置特性和超低功耗,使其成為CNN實現(xiàn)平臺的理想選擇。王巍等[7]充分利用CNN的并行計算特征,進行了CNN算法的FPGA并行結(jié)構(gòu)設計,提高了資源利用率且計算效率也得到大幅提升;Ma等[8]使用RTL編譯器完成CNN網(wǎng)絡的硬件加速,使用FPGA在100 MHz的工作頻率下得到2倍的性能提升,然而上述基于硬件描述語言(HDL)或者邏輯圖的設計方法難度較大,周期較長并且在數(shù)學運算上存在許多弊端,極大地阻礙了FPGA中進行人工智能的快速開發(fā)[9]。Danopoulos等[10]的研究充分地展現(xiàn)了FPGA快速開發(fā)的優(yōu)勢,將網(wǎng)絡框架移植到FPGA的ARM(基于Zynq-7000)處理器中,在Xilinx的SDSoC開發(fā)環(huán)境中設計硬件加速器,并利用硬件加速器顯著提高神經(jīng)網(wǎng)絡執(zhí)行速度。
試驗擬采用美國Xilinx公司發(fā)布的SDSoC開發(fā)環(huán)境,通過使用C/C++在目標平臺上完成完整的硬件/軟件系統(tǒng)的編譯、實現(xiàn)、調(diào)試執(zhí)行等全過程[11]。利用卷積網(wǎng)絡并行結(jié)構(gòu)的特點,采用高級語言映射卷積神經(jīng)網(wǎng)絡模型并進行優(yōu)化設計,通過處理器系統(tǒng)(Processing System,PS)和可編程邏輯(Programmable Logic,PL)的協(xié)同處理實現(xiàn)一個完整的軟硬件系統(tǒng),為櫻桃的快速、準確地檢測分級提供新的方法和策略。
相比普通的圖像處理算法,卷積神經(jīng)網(wǎng)絡僅需少量的預處理,識別范圍廣,能容許圖像的畸變,對幾何變形具有很好的魯棒性,其經(jīng)典網(wǎng)絡模型包含卷積層、池化層、全連接層等結(jié)構(gòu)。其中卷積層即特征提取,針對圖像上存在的特征進行局部感知,緊接著進行多層卷積獲取全局信息。
池化層也叫下采樣層。主要用作降低特征維度,減小過擬合的發(fā)生,同時增強系統(tǒng)的容錯性。
全連接層即輸出層,主要對數(shù)據(jù)進行歸一化處理,避免數(shù)據(jù)值大的節(jié)點對分類造成影響,最終進行正確的圖片分類。
卷積過程如圖1所示:輸入層的圖像首先通過多個卷積層、修正線性單元(rectified linear unit,ReLU)以及最大池化層運算,之后進入全連接層,最后通過輸出層得到最終的分類結(jié)果。
圖1 卷積神經(jīng)網(wǎng)絡結(jié)構(gòu)
針對櫻桃缺陷的特點,設計CNN模型。該模型包括卷積層、修正線性單元、最大池化層以及全連接層。模型設計如表1所示。
表1 CNN模型設計
櫻桃缺陷檢測與識別系統(tǒng)的結(jié)構(gòu)設計如圖2所示。主要包括圖像采集、HDMI接口、SD卡數(shù)據(jù)讀取、圖像預處理、PL端加速和終端顯示等模塊。其中系統(tǒng)全局控制在ARM處理器完成,主要負責HDMI接口調(diào)用、數(shù)據(jù)傳輸,對圖像進行預處理,并完成加速函數(shù)對PL端的寫入工作,最終PS端將分類結(jié)果顯示在終端顯示器上。
圖2 系統(tǒng)結(jié)構(gòu)設計框圖
由于卷積模塊和硬件接口模塊計算密集且模塊化較強,因此將其模塊放入FPGA的PL端實現(xiàn)。該系統(tǒng)優(yōu)點是在Xilinx的SDSoC開發(fā)環(huán)境中采用軟硬件結(jié)合的形式,復用卷積模塊以及使用優(yōu)化指令對卷積層和數(shù)據(jù)傳輸進行優(yōu)化,節(jié)省資源,提高識別效率。
整個網(wǎng)絡模型移植到Zynq 7020 SoC以便在ARM內(nèi)核上運行。為了使網(wǎng)絡在Zynq上運行,必須使用SDSoC環(huán)境中包含的ARM交叉編譯器對整個模型進行交叉編譯。SDSoC是Xilinx提供的基于IDE的框架,該框架允許為Zynq平臺開發(fā)硬件/軟件嵌入式系統(tǒng)。該平臺提供了定義,集成和驗證硬件加速器的能力,該硬件加速器將加速特定功能,稍后將對其進行描述,生成ARM軟件和FPGA比特流,同時生成SD映像,以便脫機進行SD卡讀取[12]。SDSoC網(wǎng)絡映射開發(fā)流程如圖3所示。
圖3 SDSoC網(wǎng)絡映射開發(fā)流程
該系統(tǒng)通過HDMI接收、輸出圖片,采用輸入輸出級優(yōu)化、通用矩陣乘法函數(shù)復用優(yōu)化以及卷積操作并行化設計,實現(xiàn)對輸入輸出級設計和CNN計算密集的卷積層加速。
對于HDMI接收設計,可調(diào)用相關IP進行驅(qū)動。因此硬件設計的重點即數(shù)據(jù)傳輸優(yōu)化、通用矩陣乘法函數(shù)復用和卷積操作并行化設計和優(yōu)化。
2.3.1 數(shù)據(jù)傳輸優(yōu)化 數(shù)據(jù)傳輸優(yōu)化主要包括PS和PL接口優(yōu)化和數(shù)據(jù)傳輸方式優(yōu)化。如圖4所示,PortA和PortB接口分別為PS端和PL端接口,Data Mover為PS和PL之間進行數(shù)據(jù)傳輸?shù)姆绞健R虼?,?shù)據(jù)傳輸優(yōu)化即對PortA、PortB和Data Mover進行優(yōu)化設計。
圖4 數(shù)據(jù)傳輸接口
通常大部分的權(quán)重參數(shù)和算法模型存在DDR中,PS和PL則通過AXI標準總線接口進行數(shù)據(jù)的交互,AXI接口包括通用AXI接口(AXI_GP)、加速器一致性接口(AXI_ACP)和高性能接口(AXI_HP)[13]。
鑒于訪問DDR延遲會導致讀寫速度緩慢,在PS端與PL端對數(shù)據(jù)的傳輸進行優(yōu)化。傳輸接口及傳輸方式的相關優(yōu)化指令:
//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接口具有高性能和高帶寬的特性,其內(nèi)部配置異步FIFO作為高速數(shù)據(jù)讀寫的緩沖。相反AXI_GP則是沒有配置緩沖的中低速接口,AXI_ACP主要實現(xiàn)PS中cache和PL單元之間的一致性接口,因此都不適合。
SDS data mem_attribute用于約束矩陣數(shù)據(jù)存放地址的連續(xù)性。硬件綜合時,SDSoC平臺會選擇傳輸連續(xù)內(nèi)存更快的AXI_DMA_Simple,而不是AXI_DMA_SG。
SDS data copy指令約束內(nèi)存大小,意味著SDSoC會將硬件加速器的接口通過AXI總線直接連接到PS的存儲器,對其進行一定內(nèi)存大小的數(shù)據(jù)傳輸。
SDS dataaccess_pattern指令約束訪問數(shù)據(jù)的方式,在CNN中都是按照圖像每行像素的順序進行卷積操作,所以將SEQUENTIAL設置為數(shù)據(jù)訪問的方式,那么綜合時自動生成順序訪問的接口協(xié)議(例如ap_fifo),而不是生成隨機訪問的接口,大大提高了數(shù)據(jù)訪問速度。
采用綜上4條優(yōu)化指令,可以在連續(xù)的物理空間中按照數(shù)據(jù)流的方式訪問數(shù)據(jù),降低數(shù)據(jù)傳輸延遲,增大數(shù)據(jù)吞吐率。試驗中,傳輸圖像及權(quán)重偏置信息均采用此方式加載。
2.3.2 通用矩陣乘法函數(shù)復用 CNN中最為密集的計算是卷積,每個卷積層都要進行線性矩陣乘法和加法運算即通用矩陣乘法(GEMM)函數(shù),利用FPGA來實現(xiàn)可以有效地提高卷積計算效率,并降低功耗,區(qū)別在于特征圖的尺寸不同。對于這一結(jié)構(gòu)上的差異,應將其同構(gòu)化達到復用的目的。
在不造成卷積運算誤差的前提下,對所要進行卷積操作的特征圖進行補零。如圖5所示,除了輸入特征圖,之后的卷積操作的特征圖的寬和高均小于輸入特征圖尺寸,因此對其進行填補零值,使其尺寸與輸入特征圖尺寸相同。因此,與權(quán)重的矩陣乘法操作使每一層的卷積運算具有了同構(gòu)性。在SDSoC中可以專門定義通用矩陣乘法(GEMM)函數(shù)并且每一次卷積都可以調(diào)用該函數(shù),卷積運算可以復用相同的控制電路,從而節(jié)省硬件資源的開銷。
圖5 特征圖同構(gòu)化
2.3.3 卷積操作并行化
(1) 矩陣分塊優(yōu)化:對于卷積層中較大的數(shù)組拆分為多個較小的數(shù)組,用于增加數(shù)據(jù)訪問的并行性。通過使用ARRAY _PARTITION指令對數(shù)組進行分塊。在文中優(yōu)化卷積操作使用下述代碼結(jié)構(gòu)。對二維數(shù)組進行降維,將二維數(shù)組分解為若干個小寄存器,提高并行度。相關指令:
#pragma HLSarray_partition variable=in_Bcomplete dim=2
(2) 流水線優(yōu)化:流水線優(yōu)化能夠?qū)⒁粋€延時較大的操作切割成多個小操作并行執(zhí)行,這樣就大大增加了總體的運行速度。采用PIPELINING約束指令來使結(jié)構(gòu)執(zhí)行流水線操作。為了不消耗太多的硬件資源并且不浪費太多的數(shù)據(jù)延遲,綜合考慮選擇在第2層循環(huán)內(nèi)添加優(yōu)化命令,可以使得工作頻率提高將近1倍。流水線優(yōu)化使用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) 循環(huán)展開優(yōu)化:默認情況下,卷積的所有嵌套循環(huán)都是按順序執(zhí)行的。循環(huán)展開優(yōu)化可以提高循環(huán)迭代之間的并行性,增加FPGA計算資源的利用率。如圖6所示,將特征圖和權(quán)重通過移位寄存器分別展開,并且進行并行乘加運算。
圖6 循環(huán)展開優(yōu)化
在卷積過程中,通過使用UNROLL優(yōu)化指令對for循環(huán)進行展開。展開最內(nèi)層for循環(huán),每一層權(quán)重的乘積作為一個獨立的處理單元(PE),使得PE核最小化。將第3層for循環(huán)展開作為PE的并行數(shù)量,用來一次獲得多個輸出層的部分和,部分代碼:
//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) 函數(shù)內(nèi)聯(lián)優(yōu)化:此外,試驗還使用了函數(shù)內(nèi)聯(lián)優(yōu)化指令INLINE,去除子函數(shù)層次結(jié)構(gòu),通過減少函數(shù)調(diào)用開銷來改善延遲。指令:
#pragma HLS INLINE self
在硬件設備上,基于Xilinx Zynq7020開發(fā)板實現(xiàn)網(wǎng)絡的加速,開發(fā)板為異構(gòu)芯片,該芯片有2個ARM A9處理器作為處理系統(tǒng)(PS),還有一個可編程邏輯(PL)XC7Z020用于硬件加速,開發(fā)板如圖7所示;此外,開發(fā)板通過SONY IMX222 CMOS相機對采集的櫻桃圖片進行測試,試驗還配有一臺顯示器用于測試結(jié)果的終端顯示,如圖8所示。
1. SONY IMX222 CMOS相機 2. 圓頂光源 3. 櫻桃樣本 4. Xilinx Zynq7020開發(fā)板 5. 終端顯示器
圖7 Xilinx Zynq7020開發(fā)板結(jié)構(gòu)圖
在硬件模塊化設計上,試驗基于Xilinx Vivado 2016.4軟件,將數(shù)據(jù)傳輸模塊,通用矩陣乘法模塊以及接口模塊分別生成各個硬件IP,完成硬件模塊化設計。數(shù)據(jù)的內(nèi)部傳輸采用AXI Interconnect模塊,即AXI互聯(lián)矩陣,能夠?qū)崿F(xiàn)將主設備和從設備的互聯(lián);外部數(shù)據(jù)傳輸采用 HDMI模塊實現(xiàn)圖像數(shù)據(jù)傳輸,并利用異步FIFO模塊作為幀緩沖區(qū),緩存數(shù)據(jù)。內(nèi)部PS模塊包含一個Zynq處理器硬核,實現(xiàn)各IP初始化與配置。定義的Mmult模塊實現(xiàn)卷積操作,其內(nèi)部通用矩陣乘法IP在卷積層進行復用。
分別在PC機、純ARM軟件和試驗加速器3種平臺進行試驗,結(jié)果如表2所示。
表2 PC機、純ARM和試驗加速器3種平臺比較
在制作數(shù)據(jù)集的過程中,在實驗室的環(huán)境下對采摘來的櫻桃進行圖像采集。為了能覆蓋每個櫻桃的完整表面,試驗使用Basler acA2000-50gc工業(yè)相機對櫻桃的6個不同角度進行采集;利用Matlab對圖像進行裁剪、旋轉(zhuǎn)、縮放等操作來擴大樣本數(shù)據(jù);最后將所有的待訓練圖像統(tǒng)一成32×32規(guī)格大小。部分樣本示例如圖9所示。
訓練在Caffe平臺下進行,操作系統(tǒng)為Ubuntu16.04,使用Python搭建CNN模型,采用監(jiān)督式學習的方法對櫻桃樣本進行訓練。最后的全連接層的輸出通道即分類數(shù),將櫻桃分為3類,分別為:裂口、完好和畸形。用于訓練的櫻桃圖片18 000張,采用人工標記的方法對訓練樣本進行標記。
試驗選取600張櫻桃原圖進行測試,每個分類各200張,將裂口和畸形的櫻桃歸為缺陷櫻桃。試驗先在PC機上利用Python進行測試,再將測試圖片放入FPGA進行測試,如表3所示,可以發(fā)現(xiàn)在FPGA上,準確率幾乎沒有下降。
工程編譯完成之后,.BIN文件會自動在release目錄下的sd_card文件夾下生成。將.BIN文件拷貝到SD卡中,設置開發(fā)板為SD卡啟動模式。連接好終端顯示器,顯示器左上角為識別出櫻桃結(jié)果的黃色標簽,試驗運行結(jié)果部分展示如圖10所示。
圖10 試驗運行結(jié)果部分展示
Zynq XC7Z020資源包括:18 K大小的Block RAM 140個,查找表(LUT) 53 200個,觸發(fā)器(FF)106 400個和數(shù)字信號處理器(DSP)220個,文中2個硬件加速函數(shù)在硬件中的資源占用使用情況和運行時長如表4所示。
表4 硬件加速函數(shù)資源占用和運行時長
輸入同樣尺寸大小的圖片在不同平臺下分別進行測試,如表5所示。結(jié)果表明在純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機對櫻桃進行檢測,測試實際圖片時在網(wǎng)絡中將輸入圖片的尺寸縮放為64×64,因此將FPGA中網(wǎng)絡的縮放尺寸改為64×64,并與文獻[4]的處理時間進行比較,如表6所示。
表6 CPU平臺與試驗加速器對櫻桃圖片處理時長比較
由表6可以看出,當輸入圖像尺寸擴大一倍時,一幅圖片的處理時長為42.59 ms,對比原來圖像尺寸延長了16.17 ms,與文獻[4]的CPU平臺處理時長相當,但是試驗系統(tǒng)所使用的時鐘頻率與CPU平臺相差甚遠,若使用性能更好的FPGA,速度應超過CPU平臺。而且試驗系統(tǒng)具有小型化、手持化的特點,與CPU平臺相比具有很強的實際應用價值。
試驗利用SDSoC快速開發(fā)平臺,協(xié)同處理PS端與PL端,實現(xiàn)一個快速櫻桃檢測的軟硬件系統(tǒng)。通過對系統(tǒng)硬件設計及優(yōu)化,大大提高了系統(tǒng)的計算性能,與純ARM軟件和CPU實現(xiàn)的算法相比,使用軟硬件協(xié)同處理對算法的加速效果明顯,滿足實時性與低成本的要求。試驗系統(tǒng)可以不使用PC機,便攜性大大提高,同時可拓展性好,具有很大的市場空間。
試驗系統(tǒng)還有進一步優(yōu)化的空間,比如增加學習樣本種類、建立合理的分類分級邏輯和改進神經(jīng)網(wǎng)絡模型結(jié)構(gòu)等。同時筆者正在嘗試其他水果數(shù)據(jù)應用于此系統(tǒng),以使其能檢測更多水果缺陷,最終形成一個實用的快速自動水果缺陷檢測與識別系統(tǒng)。