黃燦
(上海交通大學微納電子學系,上海200240)
近兩年來,計算機視覺技術飛速發(fā)展,當前的人臉識別項目已經(jīng)從傳統(tǒng)的識別方法,如PCA特征臉法[1]、Viola-Jones算法、局部二進制模式(LBP)等,轉(zhuǎn)為更加優(yōu)異的基于卷積神經(jīng)網(wǎng)絡(CNN)的方法。應用卷積神經(jīng)網(wǎng)絡的識別率已接近100%,但在嵌入式平臺上如何提高人臉識別速度仍然存在不小的挑戰(zhàn)。由于人臉識別步驟中的圖像預處理存在細粒度像素級的計算,如何加速圖像預處理成為整個人臉識別系統(tǒng)重要的一環(huán)。隨著GPU通用計算的發(fā)展,利用GPU計算平臺實現(xiàn)對應用程序的加速已成為提高程序性能的主要模式。當前操作GPU的方式有很多,與諸如OpenCL之類的計算框架相比,OpenVX為通過用戶自定義節(jié)點和圖(graph)模型的使用能實現(xiàn)系統(tǒng)級優(yōu)化和內(nèi)核級優(yōu)化[2]。
傳統(tǒng)的人臉識別的并行解決方案已有大量的工作,文獻[3-5]基于CUDA、OpenCL在GPU上實現(xiàn)傳統(tǒng)人臉檢測系統(tǒng)。當前基于深度學習的人臉識別的優(yōu)化工作,多是網(wǎng)絡結構的改進,如文獻[6]。國內(nèi)外鮮有人針對網(wǎng)絡之前的圖像預處理步驟結合OpenVX進行并行優(yōu)化。本文基于OpenVX框架,將前處理算法在GPU平臺上實現(xiàn)和優(yōu)化的關鍵技術和方法進行研究。本文的主要貢獻如下:①基于VIP8000 GPU對人臉識別系統(tǒng)的圖像處理步驟提出并行化框架及算法改進;②以OpenVX框架進行處理,將前處理算法設計成一個核函數(shù),并以節(jié)點的方式鏈接人臉識別網(wǎng)絡,以此增進與網(wǎng)絡的數(shù)據(jù)聯(lián)系,減少內(nèi)存總線的數(shù)據(jù)傳輸。
在第1節(jié)中首先介紹前處理算法步驟,在第2節(jié)中分析并行性介紹算法的并行設計方案和其他2種加速方案,第3節(jié)討論實驗結果,第4節(jié)是總結與后期研究。
由于輸入的圖像不可避免地存在諸如圖像光照不均、與網(wǎng)絡前端尺寸不匹配等問題,在對圖像輸入網(wǎng)絡之前需要先對圖像進行預處理。其步驟如圖1所示。
圖1 人臉識別系統(tǒng)步驟
步驟1:縮放。根據(jù)OpenCV,通過縮放比例系數(shù)計算目標像素在源圖像中的坐標。
或者人臉對齊。利用仿射變換矩陣逆矩陣計算出目標像素映射到原形變圖像中的坐標。
步驟2:插值。像素值的計算通過插值獲得,這里采用雙線性插值,經(jīng)過變形后的插值表達式如下[7],其中fx,fy是坐標的小數(shù)部分:
步驟3:z-score標準化。對原圖像進行歸一化處理,以消除光照影響。這里采用z-score標準化,能很好地處理異常值經(jīng)過處理的數(shù)據(jù)符合標準正態(tài)分布。
步驟4:uint8量化。在人臉識別網(wǎng)絡中,層內(nèi)操作是float 32類型,層間的數(shù)據(jù)傳遞是uint8。我們將圖像前處理層傳遞數(shù)據(jù)的也設計為uint8,將標準化后的數(shù)據(jù)重新量化到0-255像素值范圍[8],如圖2所示。
圖2 8bit量化
經(jīng)分析,我們發(fā)現(xiàn)預處理步驟1、2存在較高的并行性,主要體現(xiàn)在:
(1)步驟1中坐標計算的并行性:縮放和仿射變換都屬于圖像幾何變換,它們不更改圖像內(nèi)容,所有像素坐標計算并不存在數(shù)據(jù)依賴關系,具有很好的并行度。
(2)步驟2中像素值插值的并行性:雙線性插值過程中,映射坐標周圍四個像素間涉及一個插值運算,并且四個像素值在存儲中兩兩連續(xù)。在設計核函數(shù)時,由于VIP8000寄存器寬度為128bits,相比于CUDA更寬,減少插值過程中寄存器數(shù)據(jù)轉(zhuǎn)移是并行設計的一大挑戰(zhàn)。
(1)數(shù)據(jù)并行設計
首先對圖像像素進行分塊。本文基于是芯原的VIP8000 GPU架構處理器,VIP8000有兩個Shader Core,即并行處理計算核心,每個Shader包含128位的4組寄存器文件和一個ALU執(zhí)行單元。因此線程并發(fā)度為8。由于其寄存器長度為128bits,可以處理4個float類型數(shù)據(jù),因此本文設計一個線程處理4個目標像素,其由16個原圖像像素插值得到,如圖3所示。
圖3 像素分塊示意
接著,以單指令多數(shù)據(jù)(SIMD)的方式對像素向量進行操作。由于VIP8000中寄存器很長,寄存器里兩兩像素間存在數(shù)據(jù)關聯(lián),基于VIP8000的EVIS指令集,本文提出一個解決方法,以R像素點為例,將雙線性插值公式變形成如下所示:
可以看到公式(2)中的三個方括號里包括了形式相同的公式。因此在數(shù)據(jù)處理過程中,4個R0、R1在同一個寄存器,同樣4個R2、R3放在另一個寄存器,計算出方括號內(nèi)的形式的向量,方便插值計算。
此外,本文通過對坐標進行移位操作,將浮點運算變成整數(shù)運算,加速計算過程。
(2)系統(tǒng)級并行
OpenVX指定了基于圖模型(graph)的計算方法,圖由節(jié)點(node)連接,每一個節(jié)點都是計算機視覺核函數(shù)(kernel)的實例。以圖模型運行前處理算法有以下好處:①利用節(jié)點執(zhí)行的獨立性,為不同設備上運行的節(jié)點提供并行性;②圖的模式中系統(tǒng)了解多個節(jié)點之間的數(shù)據(jù)關系,并且可以在系統(tǒng)和cache上有效地操作,能夠減少不必要的刷新和失效[2]。
另外,本文設計的核函數(shù)是一個聚合函數(shù),如圖4所示,將多個前處理操作節(jié)點融合成為一個節(jié)點,節(jié)點融合可以消除相關的內(nèi)存緩沖區(qū),同時不需要訪問中間數(shù)據(jù)對象,可以將其創(chuàng)建為虛擬圖像。虛擬圖像還允許進行進一步的優(yōu)化,例如過濾器堆棧,以最大程度地減少通過內(nèi)存總線的數(shù)據(jù)傳輸[9]。
圖4 具有自定義節(jié)點的graph
本實驗基于芯原的VIP8000 GPU(頻率886MHz);CPU采用的是ARM v7(頻率996MHz)。人臉檢測、識別網(wǎng)絡分布基于MobileNet v1和ResNet50,測試兩個網(wǎng)絡之前的前處理算法在不同優(yōu)化下的時間。本文將CPU上的常用的幾種優(yōu)化方法應用于預處理算法中進行了對比,選取的對比算法如下:
(1)查表法:將0-255像素值經(jīng)過標準化和量化處理后制成三張表,輸入圖像經(jīng)過定點化處理之后,通過查表法替換像素值。
(2)NEON優(yōu)化:本文基于Intrinsics指令,將像素點打包成向量,并行處理像素。
(1)人臉檢測網(wǎng)絡預處理時間
這里將預處理算法在OpenCV庫中高度優(yōu)化的CPU版本在ARM-v7上的執(zhí)行時間記錄為基本CPU時間。其中,尺寸為224×224×3的圖片輸入網(wǎng)絡中不需要縮放步驟,另外設計分支核函數(shù)以加速運算。
如表1所示,實驗結果表明,與OpenCV庫的CPU版本相比,NEON優(yōu)化性能卻下降,這主要是由于①in?trinsics指令不能一次性從uint8轉(zhuǎn)換成float,中間涉及u16、u32、f32、f64的類型轉(zhuǎn)換浪費很多cycle;②需要對離散的像素進行打包操作。查表法因為計算量的減少能達到1.34倍的加速比,可以計算出分辨率為224×224×3的圖像計算量能夠變?yōu)橹暗?.0051?;贠penVX的并行優(yōu)化由于其SIMD向量化、以及graph的處理能得到12.65倍的加速比。另外,準確率不會因為優(yōu)化方式的不同而改變,因為算法步驟是相同的。
表1 人臉檢測網(wǎng)絡預處理時間對比
(2)人臉識別網(wǎng)絡預處理
人臉識別網(wǎng)絡預處理時間如表2所示。同樣設計了基本CPU時間和查表法作為對比。實驗結果表明,與OpenCV庫的CPU版本相比,查表法涉及的計算量減少能得到約1.58倍的加速比,基于OpenVX的并行程序經(jīng)過數(shù)據(jù)向量級并行,以及graph執(zhí)行圖處理,能得到5.25倍的加速比。
表2 人臉識別網(wǎng)絡預處理時間對比
本文設計了三種圖像預處理加速方案。實驗結果表明,基于OpenVX的圖像預處理算法基于數(shù)據(jù)并行以及graph處理能達到約12倍的加速效果,明顯優(yōu)于查表法和NEON優(yōu)化。綜上,本文基于OpenVX為預處理算法設計核函數(shù),為基于VIP8000 GPU的人臉網(wǎng)絡圖像預處理領域并行化的運用提供新的方案。下一步工作會實現(xiàn)跨平臺的算法部署;針對預處理算法的其他專用場景如夜晚下的處理步驟進行并行優(yōu)化。