▲項目目的:識別真實人臉和照片,實現“識真”而不止“識臉”。
▲使用工具:opencv,python,matlab
首先
1. 構建圖像數據集
2. 實現一個能夠進行活體檢測的卷積神經網絡(我們稱之為「LivenessNet」)
3. 訓練活體檢測網絡
4. 創建一個能夠使用我們訓練好的活體檢測模型並將其應用於實時視頻的 Python+OpenCV 的腳本
(效果圖)
活體檢測的方法有很多,包括:
- 紋理分析,包括在人臉區域上計算局部二值模式(LBP,)和使用支持向量機(SVM)將人臉分類為真實的或偽造的。
- 頻率分析,如查看人臉圖片的傅里葉域(對其進行傅里葉變換)。
- 變量聚焦分析,例如查看兩個連續幀之間像素值的變化。
- 基於啟發式的算法,包括眼球運動、嘴唇運動和眨眼檢測。這類算法試圖跟蹤眼球運動和眨眼,以確保用戶展示的並非另一個人的照片(因為照片不會眨眼或移動嘴唇)。
- 光流算法,即查看由三維物體和二維平面產生的光流的差異和特性。
- 三維人臉形狀,類似於蘋果 iPhone 所使用的人臉識別系統,使人臉識別系統能夠區分真實的人臉和打印出來 / 照片中的 / 圖像中的另一個人的人臉。
- 將上述方法結合起來,使人臉識別系統工程師能夠選擇適合其特定應用程序的活體檢測模型。
活體檢測最終的效果取決於訓練樣本的數量,如果訓練樣本是誰的臉,那監測出此人的臉准確率更高。
將活體檢測看作二分類問題
1.兩組視頻,一組真實的人,一組手機上的視頻錄播。
代碼段
/* gather_examples.py */
1 # import the necessary packages 2 import numpy as np 3 import argparse 4 import cv2 5 import os 6 # construct the argument parse and parse the arguments 7 ap = argparse.ArgumentParser 8 ap.add_argument("-i", "--input", type=str, required=True, 9 help="path to input video") 10 ap.add_argument("-o", "--output", type=str, required=True, 11 help="path to output directory of cropped faces") 12 ap.add_argument("-d", "--detector", type=str, required=True, 13 help="path to OpenCV's deep learning face detector") 14 ap.add_argument("-c", "--confidence", type=float, default=0.5, 15 help="minimum probability to filter weak detections") 16 ap.add_argument("-s", "--skip", type=int, default=16, 17 help="# of frames to skip before applying face detection") 18 args = vars(ap.parse_args)
第 2-5 行引入了我們需要的安裝包。除了內置的 Python 模塊,該腳本僅僅需要用到 OpenCV 和 NumPy 。
第 8-19 行代碼將解析我們的命令行參數:
- 「--input」:我們的輸入視頻文件的路徑。
- 「--output」:儲存每個裁剪出來的人臉圖像的輸出目錄的路徑。
- 「--detector」:人臉檢測器的路徑。我們將使用 OpenCV 的深度學習人臉檢測器(https://www.pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/)。為了方便讀者使用,Caffe 模型可在本文的「下載」部分獲得。
- 「--confidence」:過濾弱人臉檢測結果的最小概率。默認情況下,該值為 50%。
- 「--skip」:我們不需要檢測並存儲每個圖像,因為相鄰的幀是相似的。相反我們會在兩次人臉檢測任務之間跳過 N 個幀。你可以使用此參數修改默認的 N 值(16)。
---未完待續---