朱明 李志國



摘 要:對智慧社區建設中占重要地位的安防體系建設進行了深入研究,給出了一種基于Neon指令技術的人臉比對算法優化方法。利用Neon指令集的并行處理優勢,在嵌入式ARM平臺下,對人臉比對算法進行了效率優化,實現了前端攝像機中人臉識別過程的實時性。采用海思平臺Hi3519進行測試驗證,結果表明該方法是一種行之有效的方法,有效地提升了人臉比對算法的性能。
關鍵詞:人臉識別;NEON;神經網絡
中圖分類號:TP391 文獻標識碼:A 文章編號:1671-2064(2020)06-0055-02
0 引言
智慧社區作為智慧城市建設的一部分,近年來日益受到市場和行業的關注。在智慧社區建設中,安防體系建設又是重中之重。門禁作為社區安防第一線,其重要性不言而喻。回顧門禁系統的發展歷程中,比門禁卡更便利的是指紋識別,而比指紋識別更智能的當屬刷臉門禁了。而且人臉識別具有唯一性和不易復制性,相比門禁卡和指紋識別,它的造假成本要高出許多,具有更好的安全性。人臉識別就是將待識別的人臉特征與已得到的人臉特征模板進行比較,根據相似程度對人臉的身份信息進行判斷。這一過程又分為兩類:一類是確認,是一對一進行圖像比較的過程,另一類是辨認,是一對多進行圖像匹配對比的過程。人臉識別門禁系統就屬于辨認過程,比如社區3000人進行了注冊,則刷臉過程就是1∶3000的圖片匹配對比的辨認過程。因此想要在應用中注冊的人臉身份更多,必須保證單次匹配對比過程的速度足夠快。然而嵌入式ARM平臺下的硬件資源一般有限,提升單次匹配對比過程的效率也就顯得十分重要。因此針對嵌入式ARM平臺進行圖像算法優化研究非常有意義。本文就給出了一種基于Neon指令技術的人臉比對算法優化方法[1]。
1人臉比對算法
“人臉比對(Face Compare)”是衡量兩個人臉之間相似度的算法。人臉比對算法的輸入是兩個人臉特征,即通過算法對人臉圖像進行的特征提取,一般是轉化的一串固定長度的數值。人臉比對算法的輸出是兩個特征之間的相似度,一般為余弦距離或歐氏距離的相似度。通過相似度值與設定閾值的比較就可以實現人臉識別,包括一對一的人臉驗證和一對多人臉識別[2]。
1.1余弦相似度
余弦相似度用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小。余弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫“余弦相似性”。我們知道,對于兩個向量,如果他們之間的夾角越小,那么我們認為這兩個向量是越相似的。余弦相似性就是利用了這個理論思想。它通過計算兩個向量的夾角的余弦值來衡量向量之間的相似度值。余弦相似度計算公式如下:
分子為向量A與向量B的點乘,分母為所有向量維度值的平方相加后開方的叉乘。余弦相似度的取值為[0,1],值越大表示越相似。如果再將分母進行歸一化處理為1,則余弦相似度就可以認為是向量A與向量B的點乘結果。
1.2余弦相似度的函數實現
在實際項目中,利用余弦相似度的分值即可進行人臉識別比對,其函數主要實現如下:
for(inti=0;i { fcos_dist+=pf1[i]*pf2[i]; } 其中fcos_dist變量即為計算得到的余弦相似度分值,pf1和pf2是指向兩個特征向量的指針,N為特征向量的長度,在實際項目應用中,一般取N=512。 2 ARM NEON技術 圖1 Q寄存器與D寄存器映射關系 ARM NEON就是一種基于SIMD思想的ARM技術,從ARMv7開始被采用,相比于ARMv6或之前的架構,NEON結合了64-bit和128-bit的SIMD指令集,提供128-bit寬的向量運算(vector operations)。NEON的寄存器與VFP是共享的,而且還具有自己獨立的執行流水線。 2.1 NEON寄存器 NEON寄存器共有16個128位的向量寄存器構成。而32個雙精度浮點寄存器共享了這16個寄存器,32個單精度浮點寄存器共享了前8個寄存器。其中,單精度寄存器用S0~S31表示,雙精度寄存器用D0~D31來表示,而128位的SIMD寄存器則用Q0~Q15來表示。圖1列舉了Q寄存器與D寄存器的映射關系。 2.2 NEON指令集 NEON指令按照操作數類型可以分為正常指令、寬指令、窄指令、飽和指令、長指令。 正常指令:生成大小相同且類型通常與操作數向量相同的結果向量,如VADD指令。 長指令:對雙字向量操作數執行運算,生產四字向量結果。L標記,如VMOVL。 寬指令:一個雙字向量操作數和一個四字向量操作數執行運算,生成四字向量結果。W標記,如VADDW。 窄指令:四字向量操作數執行運算,并生成雙字向量結果。N標記,如VMOVN。 飽和指令:當超過數據類型指定到范圍則自動限制在該范圍內。Q標記,如VQSHRUN。 NEON指令按照作用可以分為:加載數據、存儲數據、加減乘除運算、邏輯AND/OR/XOR運算、比較大小運算等。 2.3 NEON編程基礎 在NEON硬件寄存器及其指令集基礎上,通過NEON編程的熟練應用,能夠對算法代碼進行性能優化,從而實現性能的大幅提升,通常使用NEON主要有四種方法:NEON優化庫、向量化編譯器、NEON內聯函數、NEON匯編指令。 根據優化程度需求不同,第4種最為底層,若熟練掌握效果最佳,一般也會配合第3種一起使用。分別簡單介紹如下: 第1種方法NEON優化庫可以在程序中直接使用,一般OpenMax DL和Ne10優化庫中包含很多算法函數的優化實現,供優化人員選用。 第2種方法主要是編譯器的向量優化選項,通常在GCC編譯器選項中加入向量化表示,有利于C代碼生成NEON代碼,如-ftree-vectorize。 第3種方法提供了一個連接NEON操作的C函數接口,編譯器會自動生成相關的NEON指令。 第4種方法包括兩種寫法,如純匯編文件(assembly文件,后綴為“.s”或“.S”)和內聯匯編(即在C代碼中嵌入匯編,調用簡單,無需手動存儲寄存器)。 本文針對人臉比對算法的優化,主要采用第3種方法。 2.4 NEON優化技巧 掌握ARM NEON寄存器及其指令集以后,就可以進行算法代碼的性能優化了,一般情況下,通過細致的優化,能夠獲得幾倍甚至十幾倍以上的性能提升。當然這也需要一定的經驗積累,下面簡單介紹幾點技巧[3]。 (1)要去除數據依賴,不要將當前指令的目的寄存器作為下一條指令的源寄存器。因為ARM架構采用的是多級流水線技術,如果下一條指令的源寄存器是當前指令的目的寄存器,就需要當前指令執行完之后,下一條指令才能取指執行,這樣會產生很大的延遲,影響性能。 (2)要減少分支跳轉,ARM處理器中廣泛使用分支預測技術。但是一旦分支預測失敗,性能就會損失很大。 (3)要盡量使用預載指令PLD,它允許處理器告知內存系統在不久的將來會從指定地址讀取數據,若數據提取加載到cache中,將會提高cache命中率,從而提升性能。 (4)要關注指令周期延遲,比如對于乘法指令,指令周期比較長,盡量不要立即使用指令計算結果,否則會等待耗時。 (5)要保證數據運算盡量在NEON寄存器中,避免在ARM寄存器和NEON寄存器之間的運算。 2.5 人臉比對函數的NEON優化 本文主要涉及ARM NEON技術的優化內容是人臉識別算法中的人臉比對函數,由前面介紹內容可知,我們所使用的人臉比對函數的核心實現為余弦相似度計算,主要為乘加求和計算[4]。根據余弦相似的函數實現,可以進行打包存取和打包計算,同時利用ARM NEON并行指令,實現算法并行加速,主要代碼如下: for(inti=0;i { float32x4_t? pf1_t=vld1q_f32(pf1); float32x4_t? pf2_t=vld1q_f32(pf2); float32x4_t? pf1n_t=vld1q_f32(pf1+4); float32x4_t? pf2n_t=vld1q_f32(pf2+4); fcos_dist_t=vmlaq_f32(fcos_dist_t,pf1_t,pf2_t); fcos_dist_t=vmlaq_f32(fcos_dist_t,pf1n_t,pf2n_t); pf1+=8; pf2+=8; } float32x2_t sum_t=vpadd_f32(vget_low_f32(fcos_dist_t),vget_high_f32(fcos_dist_t)); sum_t=vpadd_f32(sum_t,sum_t); fcos_dist+=vget_lane_f32(sum_t,0); 其中,float32x4_t數據類型是一個包含四條向量線的向量,每條向量線包含一個32位浮點數。 vld1q_f32指令(float32x4_t vld1q_f32(_transfersize(4) float32_t const*ptr))是加載并存儲4個32位浮點數元素的單個向量。 vmlaq_f32指令(float32x4_t vmlaq_f32(float32x4_t a, float32x4_t b,float32x4_t c))是兩個向量元素相乘并將結果進行累加(即Vres[i]=Va[i]+Vb[i]*Vc[i] )。 vget_low_f32指令和vget_high_f32指令是將一個128 位向量拆分為2個64位向量。 vpadd_f32指令是兩個向量元素分別按對相加運算。 vget_lane_f32指令(float32_t vget_lane_f32(float32x2_t vec,_constrange(0,1) int lane))是從向量中提取單個元素。 綜合上述指令并按上述函數流程,可以實現人臉比對函數的并行優化,大幅提升了算法效率,提升人臉識別相關產品的性能指標及客戶體驗。 3 測試結果分析 本文算法優化評測的嵌入式ARM平臺是海思Hi3519V100,該芯片處理器內核包括A7@800MHz和A17@1.2GHz,支持NEON加速引擎,集成FPU處理單元。 本文在算法優化評測中,所用的特征向量長度為512維,主要驗證人臉比對函數在嵌入式ARM平臺下優化前后的效率情況,其單位為毫秒(ms)。具體測試數據如表1所示。 結果表明,應用該方法可以有效的提升ARM平臺下人臉比對函數的效率,即近3倍左右的提升。此方法適用于各種維度的人臉特征向量的人臉比對過程,特征向量越長,其優越性表現的越明顯。 4 結論 本文針對人臉識別算法在嵌入式ARM平臺的應用,研究了基于NEON指令的人臉比對函數的優化方法,利用NEON技術進行并行存取及并行計算,對人臉比對函數的計算過程進行了深入優化,并以海思平臺Hi3519為例進行驗證,測試結果表明該方法是一種行之有效的方法,較好地解決了人臉識別算法在嵌入式ARM平臺中遇到的性能困難,有效地提升了人臉比對函數的性能,及時完成人臉對比功能,特別是注冊人臉數N較大的時候,即需要進行N次人臉比對時,效果更加明顯,從而實現了人臉識別算法在嵌入式ARM平臺應用的實時性。 參考文獻 [1] 詹森,D.巴克斯.ARM嵌入式系統編程與優化[M].北京:機械工業出版社,2017. [2] 王文峰.人臉識別原理與實踐[M].北京:電子工業出版社,2018. [3] 王天慶.Python人臉識別:從入門到工程實踐[M].北京:機械工業出版社,2019. [4] 周立功.ARM嵌入式系統基礎教程(第2版)[M].北京:北京航空航天大學出版社,2019.