李玥瑤,周金治,王楊
(西南科技大學 信息工程學院,四川 綿陽 621010)
隨著科學技術(shù)的蓬勃發(fā)展,人臉識別與我們的生產(chǎn)生活關(guān)系越來越密切,被廣泛運用到生活中的方方面面。涉及到了安保、通行、泛娛樂、公安、司法、自助服務(wù)設(shè)備等多個領(lǐng)域,甚至我們隨身攜帶的手機也都開始普遍使用人臉識別進行解鎖、支付等。通過深度學習平臺用Python語言來實現(xiàn)人臉識別是近幾年學習人臉識別較為普遍的方式,且已經(jīng)有許多人研究過基于CNN的人臉識別,但是關(guān)于戴上口罩遮擋面部這種情況的人臉識別還是較少的。在新冠肺炎肆虐的當下,使我們佩戴口罩進出公共場合成為必須,但因為佩戴口罩對于人臉識別的精度有一定的影響,取下口罩進行人臉識別又有可能感染新冠肺炎等問題的存在。因此,設(shè)計了一款能夠高精度識別人臉的戴口罩人臉識別系統(tǒng)。該系統(tǒng)在作者、老師、同學的配合下,已經(jīng)完成了符合基本精度要求的系統(tǒng)。在能夠準確完成所需人臉識別的同時也有效地保證了人民在疫情期間出入公共場所的安全。
在進行圖像處理的CNN模型中,如圖1所示,最左邊的圖片就是CNN的輸入層,一般代表了輸入若干個像素矩陣。接著是卷積層(Convolution Layer),它使用ReLU激活函數(shù),接下來連接著的是池化層(Pooling Layer),它不使用激活函數(shù)。最常見的CNN模型是由卷積層-池化層反復(fù)堆疊,多次組合出現(xiàn)在隱藏層,其出現(xiàn)的次數(shù)根據(jù)模型需要而定,我們在圖1中展示了兩次組合結(jié)構(gòu)。在若干卷積層—池化層后連接著的是全連接層(Fully Connected Layer,FC),使用Softmax激活函數(shù)進行圖像識別的分類。
圖1 卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
1.1.1 卷積層
卷積層的使用能夠提取或檢測出原始圖片的特定特征,通過設(shè)計卷積核進行卷積運算,自動提取圖像特征構(gòu)成特征圖(feature map),既能很好地保留圖像在空間幾何上的特性,又能達到分類的效果。在CNN中的卷積和嚴格數(shù)學意義上的微積分中的卷積稍有不同,我們假設(shè)是對圖像進行卷積,利用卷積核按照設(shè)定的步長,在輸入圖像的矩陣上進行上下左右移動,將輸入圖像的部分矩陣與卷積核矩陣對應(yīng)的位置相乘,然后相加得到的輸出矩陣就是卷積的結(jié)果。
舉個例子如下,我們假設(shè)原始圖片為一張黑白圖片,0表示白色,1表示黑色,(0,1)區(qū)間的值表示灰色,圖片的輸入是一個二維4×4的圖像。設(shè)計兩個不同的2×2的卷積核,滑動步長均為1,卷積核每次向右滑動一個單位進行卷積。以第一個卷積核為例,卷積的計算過程如圖2所示,最終得到了一個3×3的輸出矩陣,因此feature map的尺寸計算公式為:[(原始圖片尺寸-卷積核尺寸)/步長]+1。
圖2 卷積的計算過程
兩個卷積核的卷積結(jié)果如圖3所示,觀察兩個feature map可知,經(jīng)過第一個卷積核的feature map1第三列的絕對值最大,說明在原始圖片上相應(yīng)的位置有垂直方向的特征,經(jīng)過第二個卷積核的feature map2第三列為0,第二行的絕對值最大,說明在原始圖片上相應(yīng)的位置有水平方向的特征。因此,卷積核就類似于圖像特征的提取器,只要設(shè)計好卷積核的尺寸、數(shù)量和滑動步長就可以很好地提取圖像特征完成分類。在通常情況下,靠近輸入層設(shè)計的卷積核數(shù)量較少,這時提取出的一般是圖片的共性特征,越往后,設(shè)計的卷積核數(shù)目會越來越多,是為了更加細致地提取特征,也就能夠越容易地進行分類。
圖3 4×4的圖像與兩個2×2的卷積核操作結(jié)果
對于卷積后的輸出,一般會添加ReLU激活函數(shù),表達式為:
通過ReLU激活函數(shù)將輸出張量中小于0的位置對應(yīng)的數(shù)值都置為0。
1.1.2 池化層
池化層的作用是壓縮矩陣,假如是一個2×2的池化,那么就可以將三維矩陣中每個2×2的元素壓縮為一個元素,假如是一個3×3的池化,那么就可以將三維矩陣中每個3×3的元素壓縮為一個元素,通過這種特征降維的方式使圖片壓縮,參數(shù)減少。常見的池化方式有兩個:最大池化(Max pooling)和平均池化(Average pooling)。
通過上一層2×2的卷積核的卷積操作,我們已經(jīng)將4×4的原始圖像變?yōu)橐粋€3×3的新圖像,假設(shè)現(xiàn)在池化層采用Max pooling,池化大小為2×2,步長為1,取每個2×2的元素窗口中的最大值,就可以組成一個新的2×2的feature map,池化過程如圖4所示。
圖4 Max pooling過程
Average pooling的池化過程相同,只是取的是池化窗口中所有值的平均值。
1.1.3 全連接層
經(jīng)過幾輪的卷積層—池化層之后,在CNN模型中通常會連接1到2個全連接層,給出最后的分類結(jié)果,并且會采用Softmax激活函數(shù),得到當前輸入樣本中屬于不同類的概率分布情況。
CNN經(jīng)過堆疊的卷積層—池化層、全連接層和Softmax層得到分類結(jié)果這一過程,在本質(zhì)上可以看作是輸入到輸出的映射關(guān)系,我們只要利用已知的模式對網(wǎng)絡(luò)進行訓(xùn)練,它就可以大量學習這種輸入和輸出間的映射關(guān)系,而不需要任何復(fù)雜精確的數(shù)學表達式。其訓(xùn)練過程主要分為前向傳播和反向傳播。
1.2.1 前向傳播
前向傳播首先從數(shù)據(jù)集中取出一個作為樣本,輸入網(wǎng)絡(luò),經(jīng)過逐層變換傳到輸出層,得到實際輸出。
從輸入層到卷積層的前向傳播是CNN前向傳播的第一步,采用的是局部連接、參數(shù)共享、卷積操作的方式進行計算。以圖像識別為例,如果樣本輸入的都是二維的黑白圖片,那么輸入層就是一個矩陣,矩陣的值等于圖片各像素位置的值,對應(yīng)的卷積核也是一個矩陣;如果樣本輸入的是一個有RGB的彩色圖片,這時輸入層就是三個矩陣,分別對應(yīng)、、的三個矩陣或者一個張量,次時對應(yīng)的卷積核就是一個張量即三個矩陣。當然,無論維度多大,理論推導(dǎo)公式都可寫為:
其中,表示輸入層,表示卷積核,表示卷積層神經(jīng)元的激活函數(shù),一般為ReLU激活函數(shù),*表示卷積,表示偏倚。
全連接層是普通的深度神經(jīng)網(wǎng)絡(luò)的模型,可以寫為:
1.2.2 反向傳播
在CNN的反向傳播中將輸出向量中的元素與目標向量中的元素進行比較,計算出實際輸出與理想輸出間的誤差,依次計算出各權(quán)值的調(diào)整量和閥值的調(diào)整量,然后調(diào)整權(quán)值和閥值,判斷指標是否滿足精度要求,不斷反復(fù)更新優(yōu)化。
通過網(wǎng)絡(luò)爬取人臉數(shù)據(jù)集或者通過手機來拍攝人臉等方式,生成自制人臉數(shù)據(jù)集,并把自定義的人臉數(shù)據(jù)集分為訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集。
2.1.1 網(wǎng)絡(luò)圖片的爬取
通過瀏覽器采用網(wǎng)絡(luò)爬蟲的方式來爬取所需的人臉數(shù)據(jù)集,網(wǎng)絡(luò)爬蟲是一種按照一定規(guī)則自動抓取互聯(lián)網(wǎng)信息的程序或者腳本。爬蟲的本質(zhì)是模擬瀏覽器打開網(wǎng)頁,獲取網(wǎng)頁中我們想要的那部分數(shù)據(jù)。一共通過網(wǎng)絡(luò)爬蟲爬取了五位明星的圖片,每次爬取完成后都儲存在用關(guān)鍵詞命名的文件夾中,統(tǒng)一格式,方便數(shù)據(jù)集的制作。
2.1.2 自拍人臉數(shù)據(jù)集的獲取
數(shù)據(jù)集中需要自己的人臉數(shù)據(jù),主要通過手機來拍攝自己不同姿態(tài)的人臉照片。這些圖像均是彩色的,在相同背景上以180度之間的各種姿勢拍攝。由于手機自拍出來的照片與網(wǎng)絡(luò)爬取的圖片像素相差太大,所以對自拍照片進行了一定的處理。將所有的自拍照片的像素修改為480×640,格式修改為JPG格式,同樣用關(guān)鍵詞命名放入同一個文件夾內(nèi),這樣方便數(shù)據(jù)集的制作。
2.1.3 數(shù)據(jù)集的統(tǒng)計
數(shù)據(jù)集中包含有五位明星的人臉圖片和自拍的人臉圖片,總計732張圖片,其中帶有口罩的圖像有365張,不戴口罩的圖像有367張。按照9:1的比例進行劃分,90%用于訓(xùn)練,10%用于測試。
在所有的圖像上,我們使用了三個主題手動注釋所有面孔,每個圖像都由兩個主題注釋,由第三個主題進行交叉驗證,如圖5所示。第一個主題是臉部位置,每一個面部的位置都用矩形進行注釋,如果由于模糊、嚴重變形等無法識別眼睛從而很難檢測到面部,或者其邊框的邊長小于32像素的情況,都會被標記為“忽略”,帶有“忽略”標簽的面部一旦被檢測到,就不會被視為真。第二個主題是眼睛,對于每張圖像中的臉,都手動標記了眼中心的坐標,并將眼睛、眉毛區(qū)域用矩形注釋。第三個主題是口罩的位置,圖像中所有被口罩遮擋的位置都用矩形注釋。
圖5 面部屬性的定義
2.3.1 準備PaddlePaddle平臺
打開百度PaddlePaddle平臺,在我的項目列表中找到需要調(diào)試的戴口罩人臉識別系統(tǒng),啟動環(huán)境選擇免費的基礎(chǔ)版。在設(shè)置完運行環(huán)境后,就可以編譯、調(diào)試源程序的代碼,程序的編譯和調(diào)試都可在百度PaddlePaddle平臺線上進行,方便快捷。
完成了代碼的基礎(chǔ)調(diào)試后,壓縮自制數(shù)據(jù)集并上傳至平臺,將制作好的自制數(shù)據(jù)集直接添加進自己的項目中,然后通過代碼解壓到程序當中進行戴口罩人臉識別的訓(xùn)練。
2.3.2 配置CNN網(wǎng)絡(luò)
在程序中我們級聯(lián)了三個卷積層—池化層,尾部級聯(lián)兩個全連接層以及Softmax為激活函數(shù)的層,搭建出一個完整的CNN模型,如圖6所示。
圖6 搭建的CNN模型
通過對自制數(shù)據(jù)集進行20輪訓(xùn)練,將每一次訓(xùn)練的ACC和Cost都直觀地展現(xiàn)出來。訓(xùn)練完后與測試集進行對比不斷的優(yōu)化,最后保存訓(xùn)練模型。
由表1中的數(shù)據(jù)可以看到ACC隨著訓(xùn)練的輪數(shù)增加而不斷的提高,逐漸穩(wěn)定在0.95以上,代表訓(xùn)練出來的模型符合我們的要求。損失值則隨著訓(xùn)練輪數(shù)的增加在不斷的降低,損失值降低到0.25左右,也同時達到了我們期望的數(shù)值??梢缘贸鼋Y(jié)論:訓(xùn)練出來的模型具備了高精度識別戴口罩人臉的要求,因此,識別可以達到理想的效果。
表1 訓(xùn)練20輪的Cost和ACC
預(yù)測主要分為四步:第一步配置好運行環(huán)境,第二步放入準備好的自制數(shù)據(jù)集,第三步通過數(shù)據(jù)顯示ACC和Cost以圖片方式加載出訓(xùn)練出來的模型,把要預(yù)測的圖片放到訓(xùn)練模型里進行預(yù)測,第四步輸出預(yù)測的結(jié)果。
可以從圖6中打印出來的數(shù)據(jù)看到,這些數(shù)據(jù)都經(jīng)過了歸一化、居中等處理。對于佩戴口罩和未佩戴口罩的人臉都在模型預(yù)測中成功預(yù)測出準確的名字,可以證明高精度的戴口罩人臉識別成功。
圖6 模型預(yù)測
本課題選擇支持Python的PaddlePaddle深度學習平臺,設(shè)計了一款基于CNN的戴口罩人臉識別系統(tǒng)。并詳細介紹了CNN,包括CNN的基本結(jié)構(gòu)、CNN的訓(xùn)練過程和戴口罩人臉識別系統(tǒng)的設(shè)計,包括數(shù)據(jù)集的準備和構(gòu)建、運用百度PaddlePaddle平臺進行模型配置和評估等。經(jīng)過測試,本系統(tǒng)對佩戴口罩和未佩戴口罩的人臉都在模型預(yù)測中成功預(yù)測出準確的名字,識別精準度基本穩(wěn)定在0.95以上,實現(xiàn)了設(shè)計目的。