黃燦
(上海交通大學微納電子學系,上海200240)
近兩年來,計算機視覺技術飛速發展,當前的人臉識別項目已經從傳統的識別方法,如PCA特征臉法[1]、Viola-Jones算法、局部二進制模式(LBP)等,轉為更加優異的基于卷積神經網絡(CNN)的方法。應用卷積神經網絡的識別率已接近100%,但在嵌入式平臺上如何提高人臉識別速度仍然存在不小的挑戰。由于人臉識別步驟中的圖像預處理存在細粒度像素級的計算,如何加速圖像預處理成為整個人臉識別系統重要的一環。隨著GPU通用計算的發展,利用GPU計算平臺實現對應用程序的加速已成為提高程序性能的主要模式。當前操作GPU的方式有很多,與諸如OpenCL之類的計算框架相比,OpenVX為通過用戶自定義節點和圖(graph)模型的使用能實現系統級優化和內核級優化[2]。
傳統的人臉識別的并行解決方案已有大量的工作,文獻[3-5]基于CUDA、OpenCL在GPU上實現傳統人臉檢測系統。當前基于深度學習的人臉識別的優化工作,多是網絡結構的改進,如文獻[6]。國內外鮮有人針對網絡之前的圖像預處理步驟結合OpenVX進行并行優化。本文基于OpenVX框架,將前處理算法在GPU平臺上實現和優化的關鍵技術和方法進行研究。本文的主要貢獻如下:①基于VIP8000 GPU對人臉識別系統的圖像處理步驟提出并行化框架及算法改進;②以OpenVX框架進行處理,將前處理算法設計成一個核函數,并以節點的方式鏈接人臉識別網絡,以此增進與網絡的數據聯系,減少內存總線的數據傳輸。
在第1節中首先介紹前處理算法步驟,在第2節中分析并行性介紹算法的并行設計方案和其他2種加速方案,第3節討論實驗結果,第4節是總結與后期研究。
由于輸入的圖像不可避免地存在諸如圖像光照不均、與網絡前端尺寸不匹配等問題,在對圖像輸入網絡之前需要先對圖像進行預處理。其步驟如圖1所示。

圖1 人臉識別系統步驟
步驟1:縮放。根據OpenCV,通過縮放比例系數計算目標像素在源圖像中的坐標。
或者人臉對齊。利用仿射變換矩陣逆矩陣計算出目標像素映射到原形變圖像中的坐標。
步驟2:插值。像素值的計算通過插值獲得,這里采用雙線性插值,經過變形后的插值表達式如下[7],其中fx,fy是坐標的小數部分:

步驟3:z-score標準化。對原圖像進行歸一化處理,以消除光照影響。這里采用z-score標準化,能很好地處理異常值經過處理的數據符合標準正態分布。
步驟4:uint8量化。在人臉識別網絡中,層內操作是float 32類型,層間的數據傳遞是uint8。我們將圖像前處理層傳遞數據的也設計為uint8,將標準化后的數據重新量化到0-255像素值范圍[8],如圖2所示。

圖2 8bit量化
經分析,我們發現預處理步驟1、2存在較高的并行性,主要體現在:
(1)步驟1中坐標計算的并行性:縮放和仿射變換都屬于圖像幾何變換,它們不更改圖像內容,所有像素坐標計算并不存在數據依賴關系,具有很好的并行度。
(2)步驟2中像素值插值的并行性:雙線性插值過程中,映射坐標周圍四個像素間涉及一個插值運算,并且四個像素值在存儲中兩兩連續。在設計核函數時,由于VIP8000寄存器寬度為128bits,相比于CUDA更寬,減少插值過程中寄存器數據轉移是并行設計的一大挑戰。
(1)數據并行設計
首先對圖像像素進行分塊。本文基于是芯原的VIP8000 GPU架構處理器,VIP8000有兩個Shader Core,即并行處理計算核心,每個Shader包含128位的4組寄存器文件和一個ALU執行單元。因此線程并發度為8。由于其寄存器長度為128bits,可以處理4個float類型數據,因此本文設計一個線程處理4個目標像素,其由16個原圖像像素插值得到,如圖3所示。

圖3 像素分塊示意
接著,以單指令多數據(SIMD)的方式對像素向量進行操作。由于VIP8000中寄存器很長,寄存器里兩兩像素間存在數據關聯,基于VIP8000的EVIS指令集,本文提出一個解決方法,以R像素點為例,將雙線性插值公式變形成如下所示:

可以看到公式(2)中的三個方括號里包括了形式相同的公式。因此在數據處理過程中,4個R0、R1在同一個寄存器,同樣4個R2、R3放在另一個寄存器,計算出方括號內的形式的向量,方便插值計算。
此外,本文通過對坐標進行移位操作,將浮點運算變成整數運算,加速計算過程。
(2)系統級并行
OpenVX指定了基于圖模型(graph)的計算方法,圖由節點(node)連接,每一個節點都是計算機視覺核函數(kernel)的實例。以圖模型運行前處理算法有以下好處:①利用節點執行的獨立性,為不同設備上運行的節點提供并行性;②圖的模式中系統了解多個節點之間的數據關系,并且可以在系統和cache上有效地操作,能夠減少不必要的刷新和失效[2]。
另外,本文設計的核函數是一個聚合函數,如圖4所示,將多個前處理操作節點融合成為一個節點,節點融合可以消除相關的內存緩沖區,同時不需要訪問中間數據對象,可以將其創建為虛擬圖像。虛擬圖像還允許進行進一步的優化,例如過濾器堆棧,以最大程度地減少通過內存總線的數據傳輸[9]。

圖4 具有自定義節點的graph
本實驗基于芯原的VIP8000 GPU(頻率886MHz);CPU采用的是ARM v7(頻率996MHz)。人臉檢測、識別網絡分布基于MobileNet v1和ResNet50,測試兩個網絡之前的前處理算法在不同優化下的時間。本文將CPU上的常用的幾種優化方法應用于預處理算法中進行了對比,選取的對比算法如下:
(1)查表法:將0-255像素值經過標準化和量化處理后制成三張表,輸入圖像經過定點化處理之后,通過查表法替換像素值。
(2)NEON優化:本文基于Intrinsics指令,將像素點打包成向量,并行處理像素。
(1)人臉檢測網絡預處理時間
這里將預處理算法在OpenCV庫中高度優化的CPU版本在ARM-v7上的執行時間記錄為基本CPU時間。其中,尺寸為224×224×3的圖片輸入網絡中不需要縮放步驟,另外設計分支核函數以加速運算。
如表1所示,實驗結果表明,與OpenCV庫的CPU版本相比,NEON優化性能卻下降,這主要是由于①in?trinsics指令不能一次性從uint8轉換成float,中間涉及u16、u32、f32、f64的類型轉換浪費很多cycle;②需要對離散的像素進行打包操作。查表法因為計算量的減少能達到1.34倍的加速比,可以計算出分辨率為224×224×3的圖像計算量能夠變為之前的0.0051。基于OpenVX的并行優化由于其SIMD向量化、以及graph的處理能得到12.65倍的加速比。另外,準確率不會因為優化方式的不同而改變,因為算法步驟是相同的。

表1 人臉檢測網絡預處理時間對比
(2)人臉識別網絡預處理
人臉識別網絡預處理時間如表2所示。同樣設計了基本CPU時間和查表法作為對比。實驗結果表明,與OpenCV庫的CPU版本相比,查表法涉及的計算量減少能得到約1.58倍的加速比,基于OpenVX的并行程序經過數據向量級并行,以及graph執行圖處理,能得到5.25倍的加速比。

表2 人臉識別網絡預處理時間對比
本文設計了三種圖像預處理加速方案。實驗結果表明,基于OpenVX的圖像預處理算法基于數據并行以及graph處理能達到約12倍的加速效果,明顯優于查表法和NEON優化。綜上,本文基于OpenVX為預處理算法設計核函數,為基于VIP8000 GPU的人臉網絡圖像預處理領域并行化的運用提供新的方案。下一步工作會實現跨平臺的算法部署;針對預處理算法的其他專用場景如夜晚下的處理步驟進行并行優化。