活体检测很复杂?仅使用opencv就能实现!(附源码)
什么是活體檢測,為什么需要它?
隨著時代的發(fā)展,人臉識別系統(tǒng)的應(yīng)用也正變得比以往任何時候都更加普遍。從智能手機(jī)上的人臉識別解鎖、到人臉識別打卡、門禁系統(tǒng)等,人臉識別系統(tǒng)正在各行各業(yè)得到應(yīng)用。然而,人臉識別系統(tǒng)很容易被“非真實”的面孔所欺騙。比如將人的照片放在人臉識別相機(jī),就可以騙過人臉識別系統(tǒng),讓其識別為人臉。為了使人臉識別系統(tǒng)更安全,我們不僅要識別出人臉,還需要能夠檢測其是否為真實面部,這就要用到活體檢測了。
圖1:左邊的是真實臉,右邊是假臉
目前有許多活體檢測方法,包括:
紋理分析(Texture analysis),包括計算面部區(qū)域上的局部二進(jìn)制模式(LBP)并使用SVM將面部分類為真臉或假臉;頻率分析(Frequency analysis),例如檢查面部的傅里葉域;可變聚焦分析(ariable focusing analysis),例如檢查兩個連續(xù)幀之間的像素值的變化。基于啟發(fā)式的算法(Heuristic-based algorithms),包括眼球運動、嘴唇運動和眨眼檢測;光流算法(Optical Flow algorithms),即檢查從3D對象和2D平面生成的光流的差異和屬性;3D臉部形狀,類似于Apple的iPhone臉部識別系統(tǒng)所使用的臉部形狀,使臉部識別系統(tǒng)能夠區(qū)分真人臉部和其他人的打印輸出的照片圖像;面部識別系統(tǒng)工程師可以組合上述方法挑選和選擇適合于其特定應(yīng)用的活體檢測模型。但本教程將采用圖像處理中常用方法——卷積神經(jīng)網(wǎng)絡(luò)(CNN)來構(gòu)建一個能夠區(qū)分真實面部和假面部的深度神經(jīng)網(wǎng)絡(luò)(稱之為“LivenessNet”網(wǎng)絡(luò)),將活體檢測視為二元分類問題。首先檢查一下數(shù)據(jù)集。
活動檢測視頻
圖2:收集真實與虛假/欺騙面孔的示例
為了讓例子更加簡單明了,本文構(gòu)建的活體檢測器將側(cè)重于區(qū)分真實面孔與屏幕上的欺騙面孔。且該算法可以很容易地擴(kuò)展到其他類型的欺騙面孔,包括打印輸出、高分辨率打印等。活體檢測數(shù)據(jù)集來源:
iPhone縱向/自拍;錄制了一段約25秒在辦公室里走來走去的視頻;重播了相同的25秒視頻,iPhone重錄視頻;獲得兩個示例視頻,一個用于“真實”面部,另一個用于“假/欺騙”面部。最后,將面部檢測應(yīng)用于兩組視頻,以提取兩個類的單個面部區(qū)域。項目結(jié)構(gòu)
項目中主要有四個目錄:*
dataset /
:數(shù)據(jù)集目錄,包含兩類圖像:在播放臉部視頻時,手機(jī)錄屏得到的假臉;
手機(jī)自拍視頻中真臉;face_detector /:由預(yù)訓(xùn)練Caffe面部檢測器組成,用于定位面部區(qū)域;pyimagesearch /:模塊包含LivenessNet類函數(shù);video/:提供了兩個用于訓(xùn)練了LivenessNet分類器的輸入視頻;另外還有三個Python腳本:
gather_examples.py:此腳本從輸入視頻文件中獲取面部區(qū)域,并創(chuàng)建深度學(xué)習(xí)面部數(shù)據(jù)集;train_liveness.py:此腳本將訓(xùn)練LivenessNet分類器。訓(xùn)練會得到以下幾個文件:1.le .pickle:類別標(biāo)簽編碼器;2.liveness.model:訓(xùn)練好的Keras模型;3.plot.png:訓(xùn)練歷史圖顯示準(zhǔn)確度和損失曲線;liveness_demo.py:該演示腳本將啟動網(wǎng)絡(luò)攝像頭以進(jìn)行面部實時活體檢測;從訓(xùn)練數(shù)據(jù)集中檢測和提取面部區(qū)域
圖3:構(gòu)建活體檢測數(shù)據(jù)集,檢測視頻中的面部區(qū)域;
數(shù)據(jù)目錄:
1.dataset / fake /:包含假.mp4文件中的面部區(qū)域;2.dataset / real /:保存來自真實.mov文件的面部區(qū)域;打開
gather_examples.py
文件并插入以下代碼:
首先導(dǎo)入所需的包:第8-19行解析命令行參數(shù):
input:輸入視頻文件的路徑;output:輸出目錄的路徑;detector:人臉檢測器的路徑;confidence:人臉檢測的最小概率。默認(rèn)值為0.5;skip:檢測時略過的幀數(shù),默認(rèn)值為16;之后加載面部檢測器并初始化視頻流:
此外還初始化了兩個變量,用于讀取的幀數(shù)以及循環(huán)執(zhí)行時保存的幀數(shù)。創(chuàng)建一個循環(huán)來處理幀:
下面進(jìn)行面部檢測:
為了執(zhí)行面部檢測,需要從圖像中創(chuàng)建一個區(qū)域,該區(qū)域有300×300的寬度和高度,以適應(yīng)Caffe面部檢測器。此外腳本假設(shè)視頻的每一幀中只有一個面部,這有助于防止誤報。獲得最高概率的面部檢測指數(shù),并使用索引提取檢測的置信度,之后將低概率的進(jìn)行過濾,并將結(jié)果寫入磁盤:
提取到面部區(qū)域后,就可以得到面部的邊界框坐標(biāo)。然后為面部區(qū)域生成路徑+文件名,并將其寫入磁盤中。
構(gòu)建活體檢測圖像數(shù)據(jù)集
圖4:面部活體檢測數(shù)據(jù)集
打開終端并執(zhí)行以下命令來提取“假/欺騙”類別的面部圖像:
同理也可以執(zhí)行以下命令獲得“真實”類別的面部圖像:
注意,這里要確保數(shù)據(jù)分布均衡。執(zhí)行腳本后,統(tǒng)計圖像數(shù)量:
假:150張圖片真:161張圖片總計:311張圖片實施“LivenessNet”深度學(xué)習(xí)活體檢測模型
圖5:LivenessNet的深度學(xué)習(xí)架構(gòu)
LivenessNet實際上只是一個簡單的卷積神經(jīng)網(wǎng)絡(luò),盡量將這個網(wǎng)絡(luò)設(shè)計的盡可能淺,參數(shù)盡可能少,原因有兩個:
減少過擬合可能性;確保活體檢測器能夠?qū)崟r運行;打開
livenessnet .py
并插入以下代碼:
創(chuàng)建活體檢測器訓(xùn)練腳本
圖6:訓(xùn)練LivenessNet
打開
train_liveness .py
文件并插入以下代碼:
此腳本接受四個命令行參數(shù):
dataset:輸入數(shù)據(jù)集的路徑;model:輸出模型文件保存路徑;le:輸出序列化標(biāo)簽編碼器文件的路徑;plot:訓(xùn)練腳本將生成一個圖;下一個代碼塊將執(zhí)行初始化并構(gòu)建數(shù)據(jù):
之后對標(biāo)簽進(jìn)行獨熱編碼并對將數(shù)據(jù)劃分為訓(xùn)練數(shù)據(jù)(75%)和測試數(shù)據(jù)(25%):
之后對數(shù)據(jù)進(jìn)行擴(kuò)充并對模型進(jìn)行編譯和訓(xùn)練:
模型訓(xùn)練后,可以評估效果并生成仿真曲線圖:
訓(xùn)練活體檢測器
執(zhí)行以下命令開始模型訓(xùn)練:
圖6:使用OpenCV、Keras和深度學(xué)習(xí)訓(xùn)練面部活體模型
從上述結(jié)果來看,在測試集上獲得99%的檢測精度!
合并起來:使用OpenCV進(jìn)行活體檢測
圖7:使用OpenCV和深度學(xué)習(xí)進(jìn)行面部活體檢測
最后一步是將所有部分組合在一起:
訪問網(wǎng)絡(luò)攝像頭/視頻流;對每個幀應(yīng)用面部檢測;對于檢測到的每個臉部,應(yīng)用活體檢測器模型;打開`liveness_demo.py并插入以下代碼:
上述代碼導(dǎo)入必要的包,并加載模型。下面初始化人臉檢測器、LivenessNet模型以及視頻流:
之后開始循環(huán)遍歷視頻的每一幀以檢測面部是否真實:
使用OpenCV blobFromImage函數(shù)生成一個面部數(shù)據(jù),然后將其傳遞到面部檢測器網(wǎng)絡(luò)繼續(xù)進(jìn)行推理。核心代碼如下:
首先過濾掉弱檢測結(jié)果,然后提取面部圖像并對其進(jìn)行預(yù)處理,之后送入到活動檢測器模型來確定面部是“真實的”還是“假的/欺騙的”。最后,在原圖上繪制標(biāo)簽和添加文本以及矩形框,最后進(jìn)行展示和清理。
將活體檢測器應(yīng)用到實時視頻上
打開終端并執(zhí)行以下命令:
可以看到,活體檢測器成功地區(qū)分了真實和偽造的面孔。下面的視頻作為一個更長時間的演示:視頻地址
進(jìn)一步的工作
本文設(shè)計的系統(tǒng)還有一些限制和缺陷,主要限制實際上是數(shù)據(jù)集有限——總共只有311個圖像。這項工作的第一個擴(kuò)展之一是簡單地收集額外的訓(xùn)練數(shù)據(jù),比如其它人,其它膚色或種族的人。此外,活體檢測器只是通過屏幕上的惡搞攻擊進(jìn)行訓(xùn)練,它并沒有經(jīng)過打印出來的圖像或照片的訓(xùn)練。因此,建議添加不同類型的圖像源。最后,我想提一下,活體檢測沒有最好的方法,只有最合適的方法。一些好的活體檢測器包含多種活體檢測方法。
總結(jié)
在本教程中,學(xué)習(xí)了如何使用OpenCV進(jìn)行活動檢測。使用此活體檢測器就可以在自己的人臉識別系統(tǒng)中發(fā)現(xiàn)偽造的假臉并進(jìn)行反面部欺騙。此外,創(chuàng)建活動檢測器使用了OpenCV、Deep Learning和Python等領(lǐng)域的知識。整個過程如下:
第一步是收集真假數(shù)據(jù)集。數(shù)據(jù)來源有:智能手機(jī)錄制自己的視頻(即“真”面);手機(jī)錄播(即“假”面);對兩組視頻應(yīng)用面部檢測以形成最終數(shù)據(jù)集。第二步,獲得數(shù)據(jù)集之后,實現(xiàn)了“LivenessNet”網(wǎng)絡(luò),該網(wǎng)絡(luò)設(shè)計的比較淺層,這是為了確保:減少了過擬合小數(shù)據(jù)集的可能性;該模型本身能夠?qū)崟r運行;總的來說,本文設(shè)計的活體檢測器能夠在驗證集上獲得99%的準(zhǔn)確度。此外,活動檢測器也能夠應(yīng)用于實時視頻流。
來源:https://baijiahao.baidu.com/s?id=1628311480103833239&wfr=spider&for=pc
總結(jié)
以上是生活随笔為你收集整理的活体检测很复杂?仅使用opencv就能实现!(附源码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux grep不包含某些字符串的命
- 下一篇: 三种活体检测方式分析