鐘姝嫻 姜宇 余沁峰
(中國礦業(yè)大學(北京)機電與信息工程學院 北京市 100083)
隨著人工智能和互聯(lián)網(wǎng)技術的蓬勃發(fā)展,人臉識別技術得到了廣泛的應用,在交通運輸、公安刑偵和信息安全等方面極大地節(jié)省了人力成本和用戶的時間成本,并且憑借著其非接觸性、易采集性、方便性、穩(wěn)定性和獨特性等優(yōu)點在眾多生物識別技術中脫穎而出。然而傳統(tǒng)的人臉識別技術只能捕捉到人臉的身份,卻無法辨別出攝像頭采集的人臉究竟來自打印出來的照片、錄制好的視頻還是真人,這導致了很多關于人臉識別的欺詐犯罪行為。因此提高活體檢測的準確度對于維護公民的生命和財產(chǎn)安全具有重大意義。本文旨在基于先進的人臉檢測方法,給出活體檢測的方法,進一步提高活體檢測的準確度。目前已有的活體檢測技術根據(jù)使用的線索不同主要可以分為四類:基于微紋理的方法,基于多光譜的方法,基于運動信息的方法、基于三維場景檢測方法以及幾種方法的融合。
第一種思路即為本文介紹的思路。經(jīng)過上述步驟,將人臉特征量化為坐標值。我們通過數(shù)值上的變化來進行活體判斷。我們認為能做出一些動作的人臉即識別為活體。那么在我們的臉部,比較明顯的與特征點有關的活動有眼睛的開關和嘴巴的開關。當我們的眼睛睜開時的垂直距離一定大于閉上的垂直距離,嘴巴同理。所以我們可以通過計算讀取視頻中連續(xù)靜態(tài)幀圖像眼部或嘴部的坐標縱橫比與設計的閾值進行比較來判斷是否進行活動。
第二種思路為基于深度計算的方法。人臉是三維的而假臉即圖片是二維的,所以在真臉和假臉的不同點位的深度一定是不同的,即使是有折疊的照片,其深度也與真臉有區(qū)別。所以基于這樣的原理,設法對臉部點位的深度進行研究比較。
第三種思路為基于熱紅外成像的方法。欺騙人臉即假臉沒有穩(wěn)定的熱信號,其熱紅外圖像較為黯淡,一般與真實人臉的紅外圖像有很大差別?;跓峒t外圖像分析的方法具有較高的檢測效率,對于光照有較強的魯棒性,但是對設備有一定要求。
Li 等人(2004)提出了基于傅里葉譜分析的方法,主要假設為真實人臉圖像比打印照片圖像包含的高頻成分多。該方法主要建立在設備采集制作偽造的人臉時,偽造的人臉與真實的人臉相比在肌膚紋理方面存在丟失或差異,這些細節(jié)上的差異引起了檢測系統(tǒng)接受到的圖像上微紋理的差異。真實人臉具有多樣性的運動特征,如眨眼、張嘴、表情的變化等,而欺騙人臉很難模擬這樣的運動,因此可以通過分析人臉區(qū)域是否存在這樣的運動來判斷真假。Singh 等人利用眨眼和嘴部動作來進行活體判斷。依靠運動信息的人臉活體檢測方法通過觀察人臉某一部位特定的運動狀況,比如眨眼、張嘴等面部運動,搖頭、點頭等頭部運動,主要依靠從視頻中提取人臉某區(qū)域運動的狀態(tài)來達到判定是否為真實的人臉。Kim 等人首先選取685nm 和850nm 這兩個近紅外波段光譜采集人臉圖像,然后將這兩個波段下的人臉皮膚反射數(shù)據(jù)投影到二維空間,以此來判斷真假人臉。該方法存在的不足是需要采集目標與采集設備之間保持一定的距離,且人臉的額頭區(qū)域要被拍攝到。基于多光譜成像的方法從可見光波段之外找到更加有效的波段或其組合,使真實人臉和偽造人臉在人工識別系統(tǒng)接受的畫面響應上的差異變大,從而達到區(qū)分兩者的目的。在此方法下,人臉識別模塊的精準度得到很大的提高,但是由于需要特殊的多光譜成像設備,造價昂貴,因此在日常生活中不太普及。二維人臉識別技術使用人臉的三維信息識別的一種技術。根據(jù)不同的三維成像原理,存儲人臉的三維數(shù)據(jù)文件擁有不同的數(shù)據(jù)格式,常用的有三維點云、深度圖像、三維網(wǎng)格和幾何圖像。較于二維人臉畫面,三維人臉識別提供了更多的信息,減少了因太陽光照射、化妝、姿態(tài)等方面帶來的干擾,但由于三維圖像采集設備的速度與精度有待發(fā)展,三維圖像采集時間較長且被采集的對象需要保持靜止,微小的移動都會帶來采集數(shù)據(jù)的不準確,因此難以滿足日常的需求。
基于上述研究現(xiàn)狀,本文將基于視頻圖像處理技術,通過從視頻中提取圖像,并利用dlib 庫對人臉進行識別。通過對面部特征點進行提取,研究基于面部運動的活體檢測方法,旨在提高活體檢測的準確度。
LBP(Local Binary Pattern)指局部二值模式,是一種用來描述圖像局部特征的算子,LBP 特征具有灰度不變性和旋轉不變性等顯著優(yōu)點。在1994 年首先由T.Ojala,M.Pietik?inen,和D.Harwood 提出。由于LBP 特征計算簡單、效果較好,因此在人臉識別和目標檢測等計算機視覺的許多領域都得到了廣泛的應用。
原始的LBP 算子定義為:將灰度圖像劃分為3*3 的小格子,把最中間小格子的像素作為閾值,將相鄰8 個小格子的像素與中心小格子的像素值進行比較,若周圍灰度大于中心像素值,則該像素點的位置被標記為1,否則為0。這樣,這個3*3 的灰度圖像就能表示為一個八位二進制數(shù),這個二進制數(shù)專為十進制后的數(shù)值就是中心像素的LBP 值。其中對這八位二進制數(shù)的排列順序并無硬性要求,只要在同一研究過程中的排列順序相同即可。
由于用LBP 算子采集的區(qū)域是固定的,當圖像的尺度發(fā)生變化時,識別就會發(fā)生錯誤。于是將原始LBP 算法進行優(yōu)化,將最初的矩形區(qū)域改為圓形區(qū)域,這樣通過比較圓上任意點的像素與圓心處的像素,得到準確的特征值。LBP特征值的計算公式如下:
因此,通過將需要識別的彩色圖像轉化為灰度圖像并分成許多小圖像,然后用LBP 算子處理這些小圖像得到一系列特征值并處理為直方圖,與系統(tǒng)訓練好的人臉模型直方圖進行比對從而進行人臉識別。
本文基于pycharm 深度學習框架,采用python 進行編程。Python 標準庫和第三庫眾多,其中OpenCV、dlib 庫由輕量級而且高效的C 函數(shù)和少量C++類構成,同時也提供了包括Python 在內的以及Ruby、MATLAB 等語言的接口,可以幫助我們實現(xiàn)圖像處理和計算機視覺方面的很多通用算法。在硬件配置方面,目前日常生活中最常用的電子設備如手機、筆記本電腦的攝像頭已完全滿足要求。本實驗采用了筆記本常見的720p 分辨率的設置,硬件配置包括Intel(R)Core(TM)i5-8300H@2.30GHz,GPU 為 NVDIA GeForce 1066,RAM為16 GB。
2.2.1 從視頻中提取圖片
從視頻中提取圖片的思路為按一定頻率取一出幀影像保存下來。將現(xiàn)場錄制的視頻或者是提前下載好的視頻文件保存在Project 中。由于直接從連續(xù)變化的視頻來進行人臉特征點的計算進而做活體判斷不易實現(xiàn),應先將問題進行適當簡化。由數(shù)學思想可知,從視頻中按頻率取圖相當于將視頻即連續(xù)的圖像拆成了離散的圖像,當頻率足夠大時這些離散的圖片對于反應面部真實運動情況有很高的精確性。因此我們只需要設置合理閾值計算短時間內連續(xù)數(shù)幀圖片的特征點點位的縱橫比并比較其變化。在測試過程中,采用的攝像頭為720P,將其截取時間間隔設置為十二分之一秒。實際操作過程中,猜測由于幀數(shù)限制,如果眨眼過快則攝像頭來不及捕捉眨眼畫面,導致眨眼信息丟失。這種情況在刻意放慢眨眼速度后得到很大程度地改善。同時,檢測眨眼時必須正視攝像頭,如果低頭,系統(tǒng)可能會判斷發(fā)生了眨眼。
2.2.2 人臉識別
在安裝完與Python 相對應的OpenCV 第三方庫和dlib庫之后,我們識別活體之前的首要工作便是要確定圖片里面是否存在人臉。本系統(tǒng)使用了dlib 庫來檢測圖像。dlib 庫中的get frontal face 能夠有效地檢測到人臉輪廓,并將其標識出來。如果圖像中識別到了人臉,那么進行下一個步驟。識別出圖片中的人臉數(shù)并標出人臉上的68 個點,若沒有檢測到人臉,數(shù)量顯示為0,且不會有68 個特征點出現(xiàn)。識別效果如圖1 所示。
圖1: 標記出了人臉數(shù)量和68 特征點
2.2.3 提取特征點
要進行這一步工作,需要用到68 face landmarks 數(shù)據(jù)集,該數(shù)據(jù)集為已經(jīng)訓練好的人臉識別模型,其68 個二維坐標點基本涵蓋了人體面部的主要特征點(如圖2)。定位出臉部的區(qū)域包括眉毛、眼睛、耳朵、嘴巴。人臉特征點檢測自身的算法實現(xiàn)起來比較困難,而我們研究的目的是基于已有的人臉識別技術,去研究已識別出的是否為活體,因而我們應先調用現(xiàn)成的人臉識別檢測器提取出人臉。檢測到人臉之后,便是面部特征點的識別與標識。經(jīng)反復研究,我們適度延長圖片提取間隔,壓縮視頻大小,提高了檢測效率。圖3我們直接調用攝像頭錄制了一段視頻,對人臉面部特征點數(shù)據(jù)進行提取和簡化,獲取人臉上重要的68 個特征點數(shù)據(jù)。
圖2: 人臉68 個特征點
圖3: 獲取視頻中人臉和特征點
要最終達到活體檢測的目的,我們需要通過向用戶實現(xiàn)一些簡單的動作的指令。讓我們通過攝像頭提取的圖片中人臉特征點的點位發(fā)生變化。從圖 2.2 我們可以看到,左眼以及右眼分別包含 6 個特征點,為此,我們可以引入眼睛縱橫比的概念。眼睛縱橫比(EAR)是構造的一個檢測是否眨眼的模型指標。較于傳統(tǒng)的眨眼檢測手段,這種方式更為簡單,因為只需要計算6 個眼睛特征點之中距離的比例?;谶@一思想,我們對提取的視頻或圖片進行數(shù)據(jù)處理,得到68 個特征點中眼、嘴的點位坐標變化,計算其點位縱橫比,比較其是否符合一般人張嘴、眨眼時的變化,最終實現(xiàn)較準確的活體檢測。在計算過程中,我們利用到SciPy 庫。它是Python 的一個開源科學計算庫,建立在dumpy 之上,增加了眾多數(shù)學、科學以及工程計算中常用的庫函數(shù),如線性代數(shù)、常微分方程數(shù)值求解、圖像處理等,應用此庫中的函數(shù)可以輕松準確地實現(xiàn)最小二乘法的擬合過程。此外,我們還利用OpenCv 庫的畫圖功能,分別只標記出雙眼的12 個特征點和嘴部的6 個特征點并連線眨眼時,眼部閉合曲線近似為一條線段;張嘴時,嘴部閉合曲線近似為一個圓。這幫助我們直觀觀察實驗結果。綜上,將從視頻中按一定幀數(shù)取圖、人臉識別、標記特征點與計算雙眼或嘴部特征點坐標縱橫比整合到一起,最終得到判斷眨眼次數(shù)和張嘴次數(shù)的兩個代碼,進行試驗。
首先錄入兩段視頻,第一段視頻中做出眨眼和張嘴的動作,第二段視頻中不做面部動作。分別用兩段視頻進行試驗,第二個視頻的判斷結果總是正確,因為眼部或嘴部縱橫比沒有發(fā)生改變,不管閾值如何設置,檢測結果顯示眨眼次數(shù)或張嘴次數(shù)均為零。第一段視頻的判斷結果與實際情況有一些出入,于是我們不斷嘗試改變閾值大小,最終將眨眼閾值設定為0.3,張嘴閾值設定為0.85,連續(xù)三幀超過閾值便判定為一次眨眼或張嘴。在設定好閾值后我們還用了更多的動態(tài)臉視頻進行大量的試驗。檢測結果如圖4 和圖5 所示。實驗結果均能正確地判斷出視頻中的人臉是否進行眨眼或張嘴的動作從而判斷出是否為活體。試驗結果穩(wěn)定,方法成功。
圖4: 眨眼判斷結果
圖5: 張嘴判斷結果
本文基于人臉識別技術標記出視頻圖像中的68 個人臉面部特征點,根據(jù)前后幀圖片中相應坐標變化來識別眼和嘴的張合,給出活體檢測的方法。基于Dlib 庫編寫的程序,驗證了所提出方法的有效性。然而,由于色彩、環(huán)境光的種種限制,在操作過程中有時也出現(xiàn)無法準確識別出人臉的情況。因此我們將不斷修改完善,使其能夠應對更加復雜的環(huán)境,做出更加智能的自主應對。