鄒振超,劉 瑜
(浙江理工大學機械與自動控制學院,浙江 杭州 310018)
隨著科技的日新月異,人臉識別技術(shù)被應(yīng)用到生產(chǎn)、生活的各個領(lǐng)域,而人臉檢測是人臉識別的一個重要環(huán)節(jié),在進行人臉識別之前,需要檢測出圖像中是否含有人臉,并獲得人臉在圖像中的位置、姿態(tài)等信息。隨著移動設(shè)備不斷智能化,個人隱私問題不斷突出,人們對移動設(shè)備信息安全提出了更高的要求,基于移動設(shè)備的人臉識別在普及過程中遇到了很多問題。比如移動設(shè)備的攝像頭采集到的視頻圖像受到光照、背景、姿態(tài)以及表情等影響,使得移動設(shè)備的人臉識別無法達到較高的準確性和實時性。
傳統(tǒng)的人臉檢測算法有模板匹配方法、統(tǒng)計模型方法及知識規(guī)則方法等,在檢測速度上具有實時檢測的優(yōu)勢,但是在實際使用中,受到光照等環(huán)境因素的影響,魯棒性差。近些年來,基于深度學習的檢測算法已經(jīng)越來越成為人臉檢測的趨勢,如Li 等提出的CascadeCNN 算法、Redmon 等在2015 年提出的YOLO算法以及R-CNN、Fast-R-CNN、Faster-R-CNN 等熟知的目標檢測算法[1-3]。在配置有GPU 的PC 端,由于較強的計算和處理能力,這些深度網(wǎng)絡(luò)模型可以快速地運行,能夠達到對人臉的實時檢測,但是對于一些移動設(shè)備來說,由于GPU 處理器性能的限制,檢測速度只能達到1-2FPS的幀率,達不到實時檢測。
為了提高在移動設(shè)備的運行速度,研究者們提出一些小型化的目標檢測網(wǎng)絡(luò),如Redmon 提出YOLOTiny 模型[4],以達到實時檢測的目的,但是檢測精度也會隨之下降。為了兼顧人臉檢測的快速性和準確性,同時減少模型參數(shù),本文基于YOLOv4 算法提出一種輕量級的人臉檢測算法SG-YOLO(Shuffle Attention AndGhostNet-YOLO),在PC 端訓練好后移植到RK3288 主板的Android 平臺,提升檢測的精度,驗證其工程需求。
YOLO算法是基于深度學習的一種端到端的目標檢測算法,本文主要在YOLOv4的算法基礎(chǔ)上進行改進優(yōu)化。YOLOv4的主干特征提取網(wǎng)絡(luò)為CSPDarkNet53,包含Mish 激活函數(shù)和五個CSPNet,起到下采樣和殘差塊堆疊的作用。第三個和第四個CSP 殘差模塊會經(jīng)過卷積輸入到PANet 結(jié)構(gòu)中,第五個CSP 殘差模塊經(jīng)過卷積后輸入到SPP 結(jié)構(gòu)中,SPP 和PANet 對特征層進行了特征的融合[5]。特征融合后,YOLOHead 利用獲得的特征進行預(yù)測,會輸出三種特征層,尺寸大小分別為輸入尺寸的1/8、1/16、1/32。對于輸入大小為416×416的圖片相當于劃分為52×52,26×26,13×13的三個不同大小的網(wǎng)格圖,每個網(wǎng)格圖生成三個不同的先驗框進行預(yù)測,通過調(diào)整計算獲得預(yù)測框,YOLOv4的結(jié)構(gòu)如圖1所示。
圖1 YOLOv4結(jié)構(gòu)圖
此結(jié)構(gòu)雖然在精度上有很大的提升,但是CSPDark 模塊中的很多卷積層存在相互堆疊的情況,造成YOLOv4 的參數(shù)量和計算量偏大,無法滿足在移動設(shè)備上實時檢測的需求。
本文為了便于在低算力的Android 平臺上完成部署,提出將人臉檢測模型輕量化,首先將主干網(wǎng)絡(luò)CSPDarknet替換成GhostNet網(wǎng)絡(luò)[6-8],具體實現(xiàn)是運用更低計算量的操作生成含有冗余量的特征圖,其中Ghost Module 是該網(wǎng)絡(luò)的最小單元,通過線性運算生成特征圖,Ghost Module通過卷積生成GhostBottleneck,最終構(gòu)建出Ghost Net。Ghost Module 的功能是代替普通的3×3 卷積,首先對輸入進來的特征圖利用1×1 卷積進行通道的縮減,獲得特征濃縮。完成通道縮減之后對每一個通道使用逐層卷積獲得更多的特征圖,獲得特征圖之后將1×1 卷積后的結(jié)果和上述特征圖進行堆疊,獲得輸出特征層,其結(jié)構(gòu)如圖2所示。
圖2 Ghost Module結(jié)構(gòu)圖
接著使用Ghost Module 構(gòu)建瓶頸結(jié)構(gòu),結(jié)構(gòu)圖如圖3 所示,將兩個Ghost Module 組成一個Ghost bottleneck,第一個Ghost Module作為擴展層來增加通道數(shù),第二個Ghost Module 與shortcut 通道相匹配來減少通道數(shù)Ghost bottleneck 分為步長為1 和步長為2兩類,步長為1 的Ghost bottleneck 不對輸入進來的特征層進行寬和高的壓縮,步長為2 的Ghost bottleneck對輸入進來的特征層進行寬和高的壓縮。
圖3 Ghost bottleneck結(jié)構(gòu)圖
同時,為了提升替換主干網(wǎng)絡(luò)后的模型準確度,引入注意力機制模塊SA。這是一個融合了通道注意力機制和空間注意力機制的綜合模塊,全稱為Shuffle Attention。SA 的算法流程如圖4 所示,先在通道維度上將輸入特征按照分組數(shù)G 進行分組,再將分組后的特征平均分為Xk1和Xk2,其中Xk1賦予通道注意力權(quán)重,Xk2賦予空間注意力權(quán)重。
圖4 Shuffle Attention注意力模塊
Xk1經(jīng)過通道注意力機制的處理。首先通過全局平均池化函數(shù)生成通道統(tǒng)計數(shù)據(jù),然后利用Fuse 線性函數(shù)進行特征增強,最后經(jīng)過sigmoid 函數(shù)激活后,與輸入的特征值相乘嵌入到全局信息中,通過以上三個函數(shù)共同組成通道注意力機制。
其中,F(xiàn)c1為線性函數(shù),σ為激活函數(shù),F(xiàn)A為全局平均池化函數(shù),W1和b1為線性函數(shù)的參數(shù),S1為平均池化后的特征。
Xk2經(jīng)過空間注意力機制的處理。首先通過組歸一化函數(shù)生成空間統(tǒng)計數(shù)據(jù),然后利用Fuse 線性函數(shù)進行特征增強,最后經(jīng)過sigmoid函數(shù)激活后與輸入的特征值相乘嵌入到全局信息中,通過以上三個函數(shù)共同組成空間注意力機制。
其中,F(xiàn)c2為線性函數(shù),σ為激活函數(shù),F(xiàn)GN為組歸一化函數(shù),W2和b2為線性函數(shù)的參數(shù),S2為歸一化后的特征。
本文提出將SA 注意力機制融入到步長為1 的Ghost bottleneck 中,在降低運算量的同時保證了查準率和查全率。在對第一個GhostModule 采用ReLU 激活函數(shù)之后添加SA 注意力機制[9],由此對YOLOv4 完成了改進,SG模塊的結(jié)構(gòu)如圖5所示。
圖5 SG模塊結(jié)構(gòu)圖
本文使用SG-YOLO 算法對人臉樣本進行訓練,將得到的模型部署于Android 平臺上,以此來驗證算法的工程實用性[10],但由于SG-YOLO 算法訓練后得到的模型為.pth 格式,因此需要進行模型轉(zhuǎn)換。首先在pytorch 環(huán)境下將.pth 文件轉(zhuǎn)為.onnx 文件,然后借助騰訊推出的NCNN 框架啟動onnx2ncnn 腳本生成.param 和.bi 兩個文件,由此完成了模型轉(zhuǎn)換并進行部署,Android平臺具體配置見表1。
表1 Android平臺配置
本文使用的數(shù)據(jù)集為WIDER FACE 人臉數(shù)據(jù)集,該數(shù)據(jù)集包括的背景復(fù)雜的小尺度人臉圖像對人臉檢測的評估有較大的權(quán)威性。選取16102 張圖片,其中訓練集13041 張,測試集3061 張,利用labelimg 對其中的人臉進行標注。操作系統(tǒng)為64位的windows10,處理器為NVIDIA GeForce RTX 3080,算法通過pytorch 框架來實現(xiàn),訓練過程中使用的參數(shù)如下:迭代次數(shù)為300 輪,每次輸入圖片張數(shù)的batch-size 為16,輸入圖片尺寸縮放到416×416。選擇YOLOv4 原模型和小型化的YOLOv4-Tiny模型作為對比模型,在WIDER FACE數(shù)據(jù)集上對算法進行訓練和測試,獲得最終人臉檢測模型權(quán)重。實驗中由權(quán)重大小、準確率、檢測速度三個參數(shù)作為評價指標。圖6 為三種模型在測試集上對人臉檢測的準確率(測試集中實際檢測出的人臉數(shù)/測試集中預(yù)測出的所有人臉數(shù)),在不同的得分閾值(Score_Threhold)下的變化曲線。取Score_Threhold為0.5時的準確率作為評價值。
圖6 三種不同模型的準確率
如圖6 及表2 可知,與YOLOv4 和YOLOv4-Tiny算法相比,本文提出的網(wǎng)絡(luò)模型SG-YOLO 的準確率分別提高了4.1%、1.2%,模型權(quán)重大小分別下降了82%、31%,速度分別提高了42%和35%。本文算法在檢測的準確度差別不大的情況下,很大程度上減小了模型的權(quán)重大小,提高了檢測速度。
表2 不同模型在WIDERFACE數(shù)據(jù)集上的的測試結(jié)果
在訓練完YOLO 模型之后,將該模型通過NCNN移植到Android 平臺中進行APP 開發(fā),本文使用的Android 設(shè)備是芯片型號為RK3288 的開發(fā)板,調(diào)用攝像頭進行實時檢測時可以達到平均12FPS 的速度,且檢測效果與PC 端相同,滿足人臉檢測在低算力的Android 平臺的部署需求,圖7 是算法部署后進行實時檢測的效果圖。
圖7 算法部署效果圖
本文提出了一種滿足Android 平臺運行的輕量化人臉檢測算法,對網(wǎng)絡(luò)進行壓縮和改進,提高檢測速度的同時,保持了較高的準確率,在模型大小、檢測速度和準確性上都優(yōu)于YOLOv4-Tiny 和YOLOv4 算法,滿足人臉檢測的實時性需求,可為其他深度學習算法部署在低算力的嵌入式設(shè)備[11-15]上提供參考。下一步的工作是在其他不同的低算力平臺上進行對比試驗,來驗證此算法的通用性,同時考慮更多的影響因素來改進此算法,做到以更高的幀率進行實時檢測。