活體檢測很複雜?僅使用opencv就能實現!(附源碼)

2021-01-07 阿里云云棲號

什麼是活體檢測,為什麼需要它?

隨著時代的發展,人臉識別系統的應用也正變得比以往任何時候都更加普遍。從智慧型手機上的人臉識別解鎖、到人臉識別打卡、門禁系統等,人臉識別系統正在各行各業得到應用。然而,人臉識別系統很容易被「非真實」的面孔所欺騙。比如將人的照片放在人臉識別相機,就可以騙過人臉識別系統,讓其識別為人臉。為了使人臉識別系統更安全,我們不僅要識別出人臉,還需要能夠檢測其是否為真實面部,這就要用到活體檢測了。

圖1:左邊的是真實臉,右邊是假臉

目前有許多活體檢測方法,包括:

紋理分析(Texture analysis),包括計算面部區域上的局部二進位模式(LBP)並使用SVM將面部分類為真臉或假臉;頻率分析(Frequency analysis),例如檢查面部的傅立葉域;可變聚焦分析(ariable focusing analysis),例如檢查兩個連續幀之間的像素值的變化。基於啟發式的算法(Heuristic-based algorithms),包括眼球運動、嘴唇運動和眨眼檢測;光流算法(Optical Flow algorithms),即檢查從3D對象和2D平面生成的光流的差異和屬性;3D臉部形狀,類似於Apple的iPhone臉部識別系統所使用的臉部形狀,使臉部識別系統能夠區分真人臉部和其他人的列印輸出的照片圖像;面部識別系統工程師可以組合上述方法挑選和選擇適合於其特定應用的活體檢測模型。但本教程將採用圖像處理中常用方法——卷積神經網絡(CNN)來構建一個能夠區分真實面部和假面部的深度神經網絡(稱之為「LivenessNet」網絡),將活體檢測視為二元分類問題。首先檢查一下數據集。

活動檢測視頻

圖2:收集真實與虛假/欺騙面孔的示例

為了讓例子更加簡單明了,本文構建的活體檢測器將側重於區分真實面孔與屏幕上的欺騙面孔。且該算法可以很容易地擴展到其他類型的欺騙面孔,包括列印輸出、高解析度列印等。活體檢測數據集來源:

iPhone縱向/自拍;錄製了一段約25秒在辦公室裡走來走去的視頻;重播了相同的25秒視頻,iPhone重錄視頻;獲得兩個示例視頻,一個用於「真實」面部,另一個用於「假/欺騙」面部。最後,將面部檢測應用於兩組視頻,以提取兩個類的單個面部區域。項目結構

項目中主要有四個目錄:*

dataset /

:數據集目錄,包含兩類圖像:在播放臉部視頻時,手機錄屏得到的假臉;

手機自拍視頻中真臉;face_detector /:由預訓練Caffe面部檢測器組成,用於定位面部區域;pyimagesearch /:模塊包含LivenessNet類函數;video/:提供了兩個用於訓練了LivenessNet分類器的輸入視頻;另外還有三個Python腳本:

gather_examples.py:此腳本從輸入視頻文件中獲取面部區域,並創建深度學習面部數據集;train_liveness.py:此腳本將訓練LivenessNet分類器。訓練會得到以下幾個文件:1.le .pickle:類別標籤編碼器;2.liveness.model:訓練好的Keras模型;3.plot.png:訓練歷史圖顯示準確度和損失曲線;liveness_demo.py:該演示腳本將啟動網絡攝像頭以進行面部實時活體檢測;從訓練數據集中檢測和提取面部區域

圖3:構建活體檢測數據集,檢測視頻中的面部區域;

數據目錄:

1.dataset / fake /:包含假.mp4文件中的面部區域;2.dataset / real /:保存來自真實.mov文件的面部區域;打開

gather_examples.py

文件並插入以下代碼:

首先導入所需的包:第8-19行解析命令行參數:

input:輸入視頻文件的路徑;output:輸出目錄的路徑;detector:人臉檢測器的路徑;confidence:人臉檢測的最小概率。默認值為0.5;skip:檢測時略過的幀數,默認值為16;之後加載面部檢測器並初始化視頻流:

此外還初始化了兩個變量,用於讀取的幀數以及循環執行時保存的幀數。創建一個循環來處理幀:

下面進行面部檢測:

為了執行面部檢測,需要從圖像中創建一個區域,該區域有300×300的寬度和高度,以適應Caffe面部檢測器。此外腳本假設視頻的每一幀中只有一個面部,這有助於防止誤報。獲得最高概率的面部檢測指數,並使用索引提取檢測的置信度,之後將低概率的進行過濾,並將結果寫入磁碟:

提取到面部區域後,就可以得到面部的邊界框坐標。然後為面部區域生成路徑+文件名,並將其寫入磁碟中。

構建活體檢測圖像數據集

圖4:面部活體檢測數據集

打開終端並執行以下命令來提取「假/欺騙」類別的面部圖像:

同理也可以執行以下命令獲得「真實」類別的面部圖像:

注意,這裡要確保數據分布均衡。執行腳本後,統計圖像數量:

假:150張圖片真:161張圖片總計:311張圖片實施「LivenessNet」深度學習活體檢測模型

圖5:LivenessNet的深度學習架構

LivenessNet實際上只是一個簡單的卷積神經網絡,儘量將這個網絡設計的儘可能淺,參數儘可能少,原因有兩個:

減少過擬合可能性;確保活體檢測器能夠實時運行;打開

livenessnet .py

並插入以下代碼:

創建活體檢測器訓練腳本

圖6:訓練LivenessNet

打開

train_liveness .py

文件並插入以下代碼:

此腳本接受四個命令行參數:

dataset:輸入數據集的路徑;model:輸出模型文件保存路徑;le:輸出序列化標籤編碼器文件的路徑;plot:訓練腳本將生成一個圖;下一個代碼塊將執行初始化並構建數據:

之後對標籤進行獨熱編碼並對將數據劃分為訓練數據(75%)和測試數據(25%):

之後對數據進行擴充並對模型進行編譯和訓練:

模型訓練後,可以評估效果並生成仿真曲線圖:

訓練活體檢測器

執行以下命令開始模型訓練:

圖6:使用OpenCV、Keras和深度學習訓練面部活體模型

從上述結果來看,在測試集上獲得99%的檢測精度!

合併起來:使用OpenCV進行活體檢測

圖7:使用OpenCV和深度學習進行面部活體檢測

最後一步是將所有部分組合在一起:

訪問網絡攝像頭/視頻流;對每個幀應用面部檢測;對於檢測到的每個臉部,應用活體檢測器模型;打開`liveness_demo.py並插入以下代碼:

上述代碼導入必要的包,並加載模型。下面初始化人臉檢測器、LivenessNet模型以及視頻流:

之後開始循環遍歷視頻的每一幀以檢測面部是否真實:

使用OpenCV blobFromImage函數生成一個面部數據,然後將其傳遞到面部檢測器網絡繼續進行推理。核心代碼如下:

首先過濾掉弱檢測結果,然後提取面部圖像並對其進行預處理,之後送入到活動檢測器模型來確定面部是「真實的」還是「假的/欺騙的」。最後,在原圖上繪製標籤和添加文本以及矩形框,最後進行展示和清理。

將活體檢測器應用到實時視頻上

打開終端並執行以下命令:

可以看到,活體檢測器成功地區分了真實和偽造的面孔。下面的視頻作為一個更長時間的演示:視頻地址

進一步的工作

本文設計的系統還有一些限制和缺陷,主要限制實際上是數據集有限——總共只有311個圖像。這項工作的第一個擴展之一是簡單地收集額外的訓練數據,比如其它人,其它膚色或種族的人。此外,活體檢測器只是通過屏幕上的惡搞攻擊進行訓練,它並沒有經過列印出來的圖像或照片的訓練。因此,建議添加不同類型的圖像源。最後,我想提一下,活體檢測沒有最好的方法,只有最合適的方法。一些好的活體檢測器包含多種活體檢測方法。

總結

在本教程中,學習了如何使用OpenCV進行活動檢測。使用此活體檢測器就可以在自己的人臉識別系統中發現偽造的假臉並進行反面部欺騙。此外,創建活動檢測器使用了OpenCV、Deep Learning和Python等領域的知識。整個過程如下:

第一步是收集真假數據集。數據來源有:智慧型手機錄製自己的視頻(即「真」面);手機錄播(即「假」面);對兩組視頻應用面部檢測以形成最終數據集。第二步,獲得數據集之後,實現了「LivenessNet」網絡,該網絡設計的比較淺層,這是為了確保:減少了過擬合小數據集的可能性;該模型本身能夠實時運行;總的來說,本文設計的活體檢測器能夠在驗證集上獲得99%的準確度。此外,活動檢測器也能夠應用於實時視頻流。

相關焦點

  • 史上最全 OpenCV 活體檢測教程!
    答案是使用 OpenCV 進行活體檢測,這正是本文要討論的內容。那麼,如何將基於 OpenCV 的活體檢測功能結合到你自己的人臉識別系統中呢?本文接下來將給出答案。基於 OpenCV 的活體檢測在本教程的第一部分,我們將對活體檢測進行討論,包括「活體檢測是什麼?」以及「為什麼我們需要活體檢測來改進人臉識別系統?」
  • 僅用CPU就能跑到1000FPS,這是開源的C+跨平臺人臉檢測項目
    在眾多人臉檢測方法中,使用卷積神經網絡進行檢測是目前較為流行的方法之一。然而在我們使用別人開源的項目時經常需要安裝各種各樣的依賴環境,不同的依賴環境在不同硬體平臺或作業系統中支持程度不一樣,增加了項目跨平臺遷移的難度。 本文介紹的是一個使用卷積神經網絡進行人臉檢測的開源項目,它最大的亮點是能夠在所有支持 C/C++的平臺上編譯運行。
  • 僅用CPU就能跑到1000FPS,這是開源的C++跨平臺人臉檢測項目
    在眾多人臉檢測方法中,使用卷積神經網絡進行檢測是目前較為流行的方法之一。然而在我們使用別人開源的項目時經常需要安裝各種各樣的依賴環境,不同的依賴環境在不同硬體平臺或作業系統中支持程度不一樣,增加了項目跨平臺遷移的難度。本文介紹的是一個使用卷積神經網絡進行人臉檢測的開源項目,它最大的亮點是能夠在所有支持 C/C++的平臺上編譯運行。
  • 使用Python,Keras和OpenCV進行實時面部活體檢測
    這些方法在檢測和識別來自網絡攝像頭的圖像、視頻和視頻流中的人臉方面非常有效。然而,他們不能區分活人的臉和照片上的臉。這是因為這些算法適用於2D frames。現在讓我們想像一下,我們想要實現一個面部識別開門器。該系統能夠很好地區分已知面孔和未知面孔;以一種只對授權人開放的方式。儘管如此,對於一個懷有惡意的人來說,只展示授權人的照片是很容易的。
  • 使用OpenCv和Dlib進行打哈欠檢測
    打哈欠檢測與應用打哈欠檢測就是使用OpenCV和Dlib來檢測打哈欠(由於疲勞或無聊而張大嘴巴深吸氣)。可廣泛應用於自駕車、駕駛員疲勞檢測、駕駛員睡意檢測、駕駛員意識檢測等領域。安裝OpenCv和Dlib庫OpenCv的安裝如下:pip install opencv-pythonDlib的安裝如下:pip install cmakepip install dlib導入Opencv,Dlib和Numpy庫設置dat文件我們將.dat文件放置到工作目錄中,它是一個可以識別面部特徵並提供信息的模型
  • YOLOV4視頻對象檢測,python+opencv輕鬆實現
    上期文章,我們介紹了YOLOV4對象檢測算法的模型以及基本知識,哪裡還進行了圖片的對象檢測,如何使用YOLOV4進行視頻檢測與實時視頻檢測呢?,採用不同的顏色邊框進行標註cv2.dnn.readNetFromDarknet(configPath, weightsPath)來加載YOLOV4的預訓練模型,這裡需要注意:opencv的版本需要時4.4版本opencv4.4
  • 使用OpenCV和Python構建自己的車輛檢測模型
    我們人類可以很容易地在一瞬間從複雜的場景中檢測和識別出物體。然而,將這種思維過程轉化為機器的思維,需要我們學習使用計算機視覺算法進行目標檢測。因此在本文中,我們將建立一個自動車輛檢測器和計數器模型。以下視頻是你可以期待的體驗:https://youtu.be/C_iZ2yivskE注意:還不懂深度學習和計算機視覺的新概念?
  • 使用OpenCV和Python構建自己的車輛檢測模型
    我們人類可以很容易地在一瞬間從複雜的場景中檢測和識別出物體。然而,將這種思維過程轉化為機器的思維,需要我們學習使用計算機視覺算法進行目標檢測。因此在本文中,我們將建立一個自動車輛檢測器和計數器模型。utm_source=blog&utm_medium=vehicle-detection-opencv-python)讓我們看看一些令人興奮的現實世界中的目標檢測用例。視頻中目標檢測的真實世界用例如今,視頻目標檢測正被廣泛應用於各個行業。使用案例從視頻監控到體育廣播,再到機器人導航。
  • 使用Python+OpenCV+Dlib實現人臉檢測與人臉特徵關鍵點識別
    今天,我們將學習如何檢測圖像中的人臉並提取面部特徵,如眼睛、鼻子、嘴巴等。我們可以將這些信息作為一個預處理步驟來完成,例如捕捉照片中人物的人臉(手動或通過機器學習),創建效果來「增強」我們的圖像(類似於Snapchat等應用程式中的效果),對人臉進行情感分析等等。
  • 基於OpenCV 的人臉檢測系統設計與實現
    另外, 還可以通過訪問http://www.yahoogroups.com/group/OpenCV, 對於OpenCV使用中的一些問題與經驗進行討論。  相對於其它圖像函數庫, OpenCV 是一種源碼開放式的函數庫, 開發者可以自由地調用函數庫中的相關處理函數。
  • python3.7和opencv4.1來實現人臉識別和人臉特徵比對以及模型訓練
    OpenCV4.1已經發布將近一年了,其人臉識別速度和性能有了一定的提高,這裡我們使用opencv來做一個實時活體面部識別的demo 首先安裝一些依賴的庫pip install opencv-pythonpip install opencv-contrib-pythonpip install numpypip install pillow
  • OpenCV組織結構框圖
    http://opencv.org大量的文檔以及wiki上提供的文檔,分為以下幾個主要部分:Reference本節包含功能,參數以及如何使用它們的一些信息。Tutorials有大量的教程集合; 這些告訴你如何完成各種事情。
  • 這裡有個開源靜默活體檢測算法
    機器之心發布機器之心編輯部小視科技團隊開源的基於 RGB 圖像的活體檢測模型,是專門面向工業落地場景,兼容各種複雜場景下的模型。該自研的剪枝輕量級模型,運算量為 0.081G,在麒麟 990 5G 晶片上僅需 9ms。
  • OpenCV無神經網絡對象檢測模型,如何進行目標的檢測與追蹤
    前面的文章,小編分享了很多關於目標檢測與目標追蹤的文章,且使用python方面的目標檢測算法打造了自己的目標追蹤專欄文章,小夥伴們可以參考由於目標檢測算法太大,需要大量的計算機的計算能力,在小型的應用場景中,使用YOLO系列,或者SSD對象檢測(雖然SSD算法簡單,模型較小),Fast-RCNN 等等對象檢測算法,需要配備高計算能力的計算機,有沒有簡單的適合小型應用場景的目標檢測與追蹤算法
  • 寬動態活體檢測功能,是觸控一體機實現自動測溫的前提!
    紅外感應技術應用普及目前紅外熱釋感應器主要應用於人體感應控制方面,並實現紅外防盜和紅外控制一體化,擴大了人體紅外熱釋感應器的應用範圍,其特徵在於:所述透鏡和感光元件安置在機械部分上。而其最廣泛的應用莫過於在各類住宅小區中的過道樓梯、公共走廊等自動照明應用,或用於防盜報警器中。
  • 2 OpenCV組織結構框圖
    http://opencv.org大量的文檔以及wiki上提供的文檔,分為以下幾個主要部分:Reference本節包含功能,參數以及如何使用它們的一些信息。Tutorials有大量的教程集合; 這些告訴你如何完成各種事情。
  • 教你用OpenCV做活體檢測 | 有代碼
    活體檢測沒做好。公交車身廣告上的董明珠頭像,被寧波交警系統拍了照,判定成「違法闖紅燈」。活體檢測沒做好。所以,活體檢測要怎麼做?名叫Adrian Rosebrock的程序猿,寫了份事無巨細的教程,從構建數據集開始,一步步教大家用AI分辨真人和照片,精細到每行代碼的用途。
  • 這個開源靜默活體檢測算法,超低運算量工業可用
    機器之心發布機器之心編輯部小視科技團隊開源的基於 RGB 圖像的活體檢測模型,是專門面向工業落地場景,兼容各種複雜場景下的模型。該自研的剪枝輕量級模型,運算量為 0.081G,在麒麟 990 5G 晶片上僅需 9ms。
  • 這裡有個開源靜默活體檢測算法,超低運算量...
    來源:機器之心 小視科技團隊開源的基於 RGB 圖像的活體檢測模型,是專門面向工業落地場景,兼容各種複雜場景下的模型。 圖片來源:Forbes 為了抵禦這種假臉攻擊,小視科技團隊開源了一個靜默活體檢測算法和可適用於安卓平臺的部署源碼,可兼容各種工業級複雜場景的活體檢測
  • 計算機視覺,opencv 圓形檢測
    今天我們介紹一個opencv 函數cv2.HoughCircles(),此函數主要用於檢測圖像中的圓形,我們知道3點可以畫一個圓,學習CAD的同學肯定知道,opencv使用霍夫梯度的方法進行圓的檢測首先對圖像進行canny邊緣檢測,對邊緣中的每一個非0點,通過Sobel算法計算局部梯度。那麼計算得到的梯度方向,實際上就是圓切線的法線。