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

2020-12-06 阿里云云棲號

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

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

圖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 活體檢測教程!
    在開始訓練我們的活體檢測模型前, 我們先查看一下使用的數據集。如結果所示,我們在驗證集上實現 99% 的活體檢測準確率。整合一下:通過 OpenCV 實現活體檢測 圖 7:使用 OpenCV 和深度學習技術實現人臉活體檢測
  • 使用OpenCV和Python構建自己的車輛檢測模型
    我們人類可以很容易地在一瞬間從複雜的場景中檢測和識別出物體。然而,將這種思維過程轉化為機器的思維,需要我們學習使用計算機視覺算法進行目標檢測。因此在本文中,我們將建立一個自動車輛檢測器和計數器模型。以下視頻是你可以期待的體驗:https://youtu.be/C_iZ2yivskE注意:還不懂深度學習和計算機視覺的新概念?
  • OpenCV中的快速直線檢測
    該函數是LineSegmentDetector因版權問題從OpenCV中移除後最易用的直線檢測小能手,沒有之一。本文介紹該功能的使用方法其輸出結果剖析。在python的opencv相關的安裝包中,opencv-python 包含主要模塊,opencv-contrib-python 包含主要模塊以及一些擴展模塊。但這兩個模塊並不兼容,如果已經安裝過opencv-python,需要先卸載,再安裝opencv-contrib-python。
  • OpenCV(四)邊緣檢測
    點擊「藍字」關注我們上一章節,我們在使用圖像輪廓發現的時候使用了圖像邊緣檢測,一次來提高圖像輪廓發現的準確率。事實上在計算機的各個領域都有圖像邊緣檢測的身影。邊緣檢測一大優點就在於可以大幅度減少數據量,並且提出可以認為不相關的信息,保留了圖像的結構屬性。
  • 使用Python,Keras和OpenCV進行實時面部活體檢測
    這些方法在檢測和識別來自網絡攝像頭的圖像、視頻和視頻流中的人臉方面非常有效。然而,他們不能區分活人的臉和照片上的臉。這是因為這些算法適用於2D frames。現在讓我們想像一下,我們想要實現一個面部識別開門器。該系統能夠很好地區分已知面孔和未知面孔;以一種只對授權人開放的方式。儘管如此,對於一個懷有惡意的人來說,只展示授權人的照片是很容易的。
  • 基於TensorFlow 、OpenCV 和 Docker 的實時視頻目標檢測
    動機我們從 Dat Tran 這篇文章開始挑戰實時目標檢測。此外,在次項目我還添加了一個視頻後處理功能,同樣使用 multiprocessing 庫來減少處理時間(使用 Tensorflow 原始目標檢測 API 處理時間會非常長)。實時和視頻目標識別都可以在我的個人筆記本電腦上以高性能運行,僅使用 8GB CPU。
  • 世界上最好的語言PHP:OpenCV與計算機視覺已在我掌控之下
    本文從實踐的角度介紹了如何使用 PHP 與 OpenCV 構建人臉檢測、人臉識別、超解析度與目標檢測等系統,因此 PHP 的各位擁躉們,可以盡情使用 OpenCV 探索計算機視覺了。本文首發於公眾號機器之心(ID:almosthuman2014),部分代碼格式有誤可參閱原文章。
  • 基於opencv 的圖像處理入門教程
    實現代碼:7. 邊緣檢測邊緣檢測主要是通過 Canny() 方法,它實現了 Canny 邊緣檢測器,這也是目前最優的邊緣檢測器。顏色檢測在本次例子中實現檢測圖片中的綠色區域,使用的圖片:首先是讀取圖片後,轉換到 HSV 空間:接著需要通過 Numpy 設置綠色像素值的上下範圍區間:lower_green = np.array([34, 177,
  • 基於OpenCV來實現對圖像中目標對象檢測識別 以土地為例
    https://docs.opencv.org/master/d9/df8/tutorial_root.html   https://docs.opencv.org/   https://www.zhihu.com/question/26881367我們今天的內容主要是想基於OpenCV來實現對圖像中我們關注的一些目標對象進行檢測識別或者說是對其存在的區域位置進行挖掘,在開始這篇文章之前,我曾經看到了有人基於
  • OpenCV特徵點檢測——ORB特徵
    ORB的描述在下面文章中:Ethan Rublee and Vincent Rabaud and Kurt Konolige and Gary Bradski, ORB: an efcient alternative to SIFT or SURF, ICCV 2011沒有加上連結是因為作者確實還沒有放出論文,不過OpenCV2.3RC中已經有了實現,WillowGarage
  • 基於OpenCv 和 Python 的手指識別及追蹤
    翻譯 | 餘杭 Lamaric 校對 | 吳曉曼 審核 | 餘杭詳細代碼參考:https://github.com/amarlearning/opencv手指追蹤是許多計算機視覺應用的重要特徵。在該應用中,使用基於直方圖的方法將手與背景幀分離。
  • 目標檢測必須要OpenCV?10行Python代碼也能實現,親測好用!
    無人超市、人臉識別、無人駕駛,眾多的使用場景及案例,使得【目標檢測】正成為計算機視覺最有前景的方向。聽起來似乎是個很難實現的技術,需要大量訓練數據和算法才能完成。事實上,本文作者開發了一個基於Python的函數庫,可以用十行代碼高效實現目標檢測。還不熟悉的讀者,我們先來看看,目標檢測到底是什麼,以及軟體開發人員面臨的挑戰。
  • OpenCV 之 霍夫變換
    因此, 霍夫變換的目的是將平面坐標內的直線檢測, 轉換為極坐標內的交點檢測, 顯然尋找一個交點要比尋找直線(實際上是尋找許多點)容易得多了。 2  OpenCV中的函數1)  HoughLines
  • 身份識別之人臉活體檢測
    隨著科技的不斷發展,人臉識別技術越發的成熟,在金融、門禁、考勤、人證合一等領域中廣泛應用,而活體檢測是人臉識別中的重要環節,在近年來也得到了越來越多的關注。  一、活體檢測的常用方法  1、普通攝像頭活體檢測  二、雖然沒有配合指令的動作響應,但真實的人臉也不是絕對靜止的,總有一些微表情的存在,比如眼皮和眼球的律動、眨眼、嘴唇及其周邊面頰的伸縮等。
  • 如何快速簡單的安裝opencv-python
    >pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python這樣就會從清華鏡像安裝opencv-contrib-python庫。
  • 人臉識別有什麼漏洞,活體檢測又是怎麼防偽?
    隨著人臉識別技術日益成熟,商業化應用越來越廣泛,人臉登錄、人臉支付、人臉乘梯、人臉閘機等等,在安防、金融、教育、醫療等領域廣泛應用,人臉識別技術的智能快捷在國內得到迅速發展,但人臉識別極其容易被照片、視頻、仿真模具等方式矇混過關,網上也頻頻傳出各種破解方法,因此人臉識別系統具備活體檢測功能成為必然
  • 以SVM和HOG特性實現實時人臉檢測和識別
    在這樣的系統中有兩個階段:人臉檢測;然後是人臉識別。一開始,臉部的檢測是在影像上使用Haar級聯分類器(Haar Cascade Classifier),結合臉部主要的裁剪部份。EFTEETC-電子工程專輯使用Haar級聯分級器進行眼睛檢測,形成幾何臉部模型;而鼻子的檢測則被用作眼睛檢測的再確認機制。
  • opencv-python獲取圖像:面向對象與面向過程
    這裡需要注意以下,opencv讀取圖片默認通道為BGR的格式,當在其他UI用戶界面顯示圖像時注意轉換一下通道順序,例如BGR轉換成RGB:Image1=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)下面讀取一張圖片並顯示
  • 人臉識別雙目模組自助機應用活體檢測
    我們來講一下關於人臉識別雙目模組自助機應用活體檢測的問題。人臉識別是基於人的臉部特徵信息系統進行身份識別的一種生物識別技術,傳統的面部識別技術具有基於可見光圖像的人臉識別,現在使用的是基於主動近紅外圖像的多光源人臉識別技術。
  • OpenCV-Python 直方圖-2:直方圖均衡|二十七
    理論考慮這樣一個圖像,它的像素值僅局限於某個特定的值範圍。例如,較亮的圖像將把所有像素限制在高值上。但是一幅好的圖像會有來自圖像所有區域的像素。因此,您需要將這個直方圖拉伸到兩端(如下圖所示,來自wikipedia),這就是直方圖均衡化的作用(簡單來說)。這通常會提高圖像的對比度。