仝星 王濤 田青 宛根訓(xùn) 張瑤 崔璐 公安部第一研究所
后疫情時代的到來,使得佩戴口罩出行成為人們生活中的常態(tài)。佩戴口罩在保護(hù)大眾生命安全防線的同時,也給人臉識別算法帶來了新的挑戰(zhàn)。佩戴口罩會嚴(yán)重影響識別精度,但取下口罩進(jìn)行人臉識別會增加感染新冠肺炎的概率。通過Python來實(shí)現(xiàn)生物特征識別是人臉識別較常見的模式,但是關(guān)于口罩遮擋面部這種情況的人臉識別還是相對較少。針對這一問題,本文提出一種基于VGG的模型并通過 PaddlePaddle應(yīng)用平臺實(shí)現(xiàn)人臉識別,提升了在佩戴口罩場景下的人臉識別精度,同時有效保證人們在疫情期間出入公共場所的安全,對疫情防控具有十分重要的意義。
VGG模型是由牛津大學(xué)VGG(Visual Geometry Group)組在2014年ILSVRC提出的。該模型相比以往模型進(jìn)一步加寬和加深了網(wǎng)絡(luò)結(jié)構(gòu),它的核心是五組卷積操作,每兩組之間做Max-Pooling空間降維。同一組內(nèi)采用多次連續(xù)的3×3卷積,卷積核的數(shù)目由較淺組的64增多到最深組的512,同一組內(nèi)的卷積核數(shù)目是一樣的。卷積之后接兩層全連接層,之后是分類層。由于每組內(nèi)卷積層的不同,有11、13、16、19層這幾種模型。VGG模型結(jié)構(gòu)相對簡潔,提出之后也有很多文章基于此模型進(jìn)行研究,如在ImageNet上首次公開超過人眼識別的模型就是借鑒VGG模型的結(jié)構(gòu)。
VGG模型相較傳統(tǒng)模型,是調(diào)用多個小尺寸(2×2或3×3)的卷積層的堆疊替換原有的大卷積核(5×5或7×7),此方案使得模型比較容易形成較深的網(wǎng)絡(luò)結(jié)構(gòu),比單個卷積層擁有更強(qiáng)的非線性映射能力,在同等參數(shù)或參數(shù)量更少的情況下,可以對圖像的特性有著更深的學(xué)習(xí)度,做更復(fù)雜的分類任務(wù)。VGG模型結(jié)構(gòu)如圖1所示。
模型的訓(xùn)練過程實(shí)際就是輸入圖像經(jīng)過網(wǎng)絡(luò)結(jié)構(gòu)到獲取結(jié)果的過程,在實(shí)際工程中,可以通過不同方案對目標(biāo)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,模型會逐漸掌握輸入和輸出間的映射關(guān)系。本方案中主要利用反向傳播算法。
反向傳播算法通過鏈?zhǔn)椒▌t從輸出層一直向前一層遞歸計算,是更新網(wǎng)絡(luò)結(jié)構(gòu)參數(shù)的核心。方案需要優(yōu)先獲得實(shí)際結(jié)果和預(yù)期結(jié)果的差值,隨后將差值從后向前一層一層傳遞,經(jīng)過調(diào)整各層的權(quán)重值來逐漸減小誤差。
假設(shè)用δ表示誤差,δJ(l)表示第l層的第j個節(jié)點(diǎn)激勵值的誤差,δ(l)表 示第l層激勵值的誤差矩陣,xj(l)表示第l層第j個節(jié)點(diǎn)的激勵值,x(l)表示第l層的激勵矩陣,共有L層,即l=1,2,3,...L,y代表輸出標(biāo)簽矩陣,公式如(1)所示。
由于第一層是輸入層,無誤差,可根據(jù)誤差表達(dá)式計算函數(shù)的偏導(dǎo)數(shù)。定義表示λ≠0情況下第l層第i行第j列的權(quán)重誤差,公式如(2)所示。
公式(2)所示是一次反向傳播時對權(quán)重值進(jìn)行更新的過程,在訓(xùn)練過程中會重復(fù)這個過程,直至模型收斂或者達(dá)到預(yù)設(shè)的訓(xùn)練步數(shù)。
在模型訓(xùn)練過程中,由于模型復(fù)雜度過高或訓(xùn)練數(shù)據(jù)集的樣本不充足,會導(dǎo)致過擬合現(xiàn)象的發(fā)生,最終使模型的泛化能力大幅降低。如圖2所示,當(dāng)模型復(fù)雜度超過一定范圍的時候,訓(xùn)練集的準(zhǔn)確率雖然不斷提高,但是測試集的準(zhǔn)確率卻在降低,此時出現(xiàn)了過擬合現(xiàn)象。
當(dāng)神經(jīng)網(wǎng)絡(luò)出現(xiàn)過擬合時,通常的做法有模型正則化、降低模型復(fù)雜度、增加樣本數(shù)量、Dropout等。本方案利用了模型正則化與Dropout方法對模型進(jìn)行了優(yōu)化。
1. 模型正則化
模型正則化有L1正則化和L2正則化。
L1正則化會生成稀疏權(quán)值矩陣,即生成一個稀疏模型,可用于特征選擇;L1正則化是在原來代價函數(shù)的后面加一個L1正則化項,如公式(3)所示,其中c0是原始代價函數(shù),后面一項是L1正則項。
L2正則化具有防止模型過擬合的能力,L2正則化是在原來代價函數(shù)的后面加上一個L2正則化項,如公式(4)所示,其中c0是原始代價函數(shù),后面一項是L2正則項。
在神經(jīng)網(wǎng)絡(luò)中,正則化傾向于更小的權(quán)重值。在權(quán)重值較小的情況下,數(shù)據(jù)的隨機(jī)變化不會對神經(jīng)網(wǎng)絡(luò)模型造成太大的影響,不會對噪聲過于敏感。
2. Dropout
Dropout是通過隨機(jī)斷開神經(jīng)網(wǎng)絡(luò)之間的連接,從而改變神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)來防止過擬合出現(xiàn)的方法。如圖3所示,訓(xùn)練開始時,神經(jīng)網(wǎng)絡(luò)會隨機(jī)剔除中間層一半的神經(jīng)元(假如Dropout的概率為0.5),圖中虛線部分是被剔除神經(jīng)元。隨后在剩下的神經(jīng)元上完成正向和反向傳播,最終更新權(quán)值參數(shù)。這個過程完成后,神經(jīng)網(wǎng)絡(luò)恢復(fù)原來的結(jié)構(gòu),再次剔除中間層一半的神經(jīng)元,繼續(xù)進(jìn)行權(quán)值的更新,一直重復(fù)上述過程。
Dropout通過不斷隨機(jī)刪除隱藏層的神經(jīng)元,來達(dá)到減少神經(jīng)元之間依賴,增加局部數(shù)據(jù)簇差異性,使神經(jīng)網(wǎng)絡(luò)能夠?qū)W習(xí)到更加健壯的特性的同時,提升算法魯棒性能。
實(shí)驗(yàn)數(shù)據(jù)集包括4128張人臉圖像。其中未佩戴口罩的圖片數(shù)量為2188張,佩戴口罩的圖片數(shù)量為1940張。這些人臉圖像來自于不同場景,如火車站、證件照、手機(jī)自拍照等,在光照、角度、遮擋上有明顯區(qū)別。
部分?jǐn)?shù)據(jù)通過人臉關(guān)鍵點(diǎn)檢測方法,在現(xiàn)有人臉數(shù)據(jù)集上對人臉模擬實(shí)現(xiàn)口罩遮擋,本文制作了3種類型的口罩遮擋案例,包括鼻子及以下遮擋、嘴巴及以下遮擋、下巴及以下遮擋,每個類型的口罩遮擋又有各種佩戴狀態(tài),使模型有更好的泛化能力。
PaddlePaddle(Parallel Distributed Deep Learning)是百度公司推出的開源、分布式的深度學(xué)習(xí)使用平臺,其架構(gòu)是基于神經(jīng)網(wǎng)絡(luò)開發(fā)的。它將數(shù)據(jù)讀取、功能層、優(yōu)化方式、訓(xùn)練等操作過程分別構(gòu)建成類,組合構(gòu)成整個網(wǎng)絡(luò)。PaddlePaddle簡化了構(gòu)造神經(jīng)網(wǎng)絡(luò)過程,能夠提供更簡便的使用方式,用戶不需要更改主體文件。PaddlePaddle設(shè)計和定位是“易用、高效、靈活、可擴(kuò)展”,分布式部署也是它的優(yōu)點(diǎn)。相比偏底層的谷歌TensorFlow,PaddlePaddle具有更易用的API、更好的封裝、更快速的業(yè)務(wù)集成,讓開發(fā)者開發(fā)精力放在構(gòu)建深度學(xué)習(xí)模型的高層部分。同時,在自然語言處理上有很多現(xiàn)成的應(yīng)用,比如情感分類、神經(jīng)機(jī)器翻譯、閱讀理解等,使用起來相對簡單。此外PaddlePaddle支持多機(jī)多卡訓(xùn)練,并且本身支持多種集群方式。
本方案搭建的是PaddlePaddle-GPU環(huán)境。首先進(jìn)行顯卡驅(qū)動的安裝,之后下載并安裝CUDA,本方案選用的版本是CUDA10.0,此外還需將CUDA路徑添加到系統(tǒng)環(huán)境變量中。接下來用pip工具安裝cuDNN和PaddlePaddle-GPU。
訓(xùn)練前首先配置好運(yùn)行環(huán)境,導(dǎo)入工程需要加載的基礎(chǔ)庫、第三方庫和深度學(xué)習(xí)框架。隨后需要將數(shù)據(jù)集做預(yù)處理操作,包括解壓用于識別的圖像數(shù)據(jù),獲取所有數(shù)據(jù)圖片的地址并將其保存到指定位置,之后創(chuàng)建數(shù)據(jù)集讀取器,通過數(shù)據(jù)集讀取器讀取訓(xùn)練或測試需要的圖片數(shù)據(jù)。
在平臺內(nèi)定義VGG模型,堆疊卷積池。輸入準(zhǔn)備好的自制數(shù)據(jù)集,通過數(shù)據(jù)顯示訓(xùn)練集準(zhǔn)確率(acc)和訓(xùn)練集損失率(loss)加載出訓(xùn)練出來的模型,把要預(yù)測的數(shù)據(jù)放到訓(xùn)練模型里進(jìn)行預(yù)測,最終輸出預(yù)測的結(jié)果。在實(shí)際調(diào)參過程中,本方法采用了交叉驗(yàn)證的方式來尋找算法的最優(yōu)值。交叉驗(yàn)證用于防止模型過于復(fù)雜而引起的過擬合,是一種統(tǒng)計學(xué)上將數(shù)據(jù)樣本切割成較小子集的實(shí)用方法。先在一個子集上做分析,而其它子集則用來做后續(xù)對此分析的確認(rèn)及驗(yàn)證。一開始的子集被稱為訓(xùn)練集,而其它的子集則被稱為驗(yàn)證集或測試集。交叉驗(yàn)證法在很大程度上保證了模型的穩(wěn)定和可靠性,提高了模型的泛化能力。
通過對數(shù)據(jù)集進(jìn)行20輪訓(xùn)練并將每一輪訓(xùn)練的acc和loss列出來,最終與測試集進(jìn)行比對優(yōu)化,得到訓(xùn)練模型。
?
由表1數(shù)據(jù)可知acc會隨著訓(xùn)練的輪數(shù)增加而增加,最終達(dá)到91.4%;損失值隨著訓(xùn)練的輪數(shù)增加而降低,最終達(dá)到14%。acc和loss數(shù)值均達(dá)到期望。
本方法通過PaddlePaddle深度學(xué)習(xí)平臺,設(shè)計并實(shí)現(xiàn)了一種基于VGG的口罩人臉識別方法。通過測試,方法對佩戴口罩和未佩戴口罩的樣本都在模型中成功預(yù)測,識別精度達(dá)到91.4%,可以在被識別人佩戴口罩的場景下有效提升識別準(zhǔn)確率。
在疫情防控形勢嚴(yán)峻復(fù)雜的當(dāng)前,本方法可用于車站、地鐵、機(jī)場等人員密度大、防疫任務(wù)重的重點(diǎn)防控區(qū)域,可以在佩戴口罩與無口罩并存的復(fù)雜場景下完成精準(zhǔn)識別,為公安部門疫情防控中基于人臉識別的無接觸管控有效賦能。