71 行確保我們的面部檢測 ROI 滿足最小閾值,從而減少假陽性。
在 74~76 行提取了面部 ROI 和相應的邊界框。
在 79~81 行為面部 ROI 生成了路徑和檔名,並將它寫在磁碟上。 此時,我們就可以增加保存的面部圖像數量了。
處理完成後,我們將在86和87行執行清理工作。
建立活體檢測圖像數據集
圖 4:OpenCV 面部活體檢測數據集。 我們要用 Keras 和 OpenCV 來訓練並演示活體模型。
現在我們已經實現了 gather_example.py 腳本,接下來要讓它開始工作。
確保你已經用這篇教程的「Downloads」部分獲取了原始程式碼和輸入視頻樣例。
打開終端並執行下面的命令來提取「偽造」類的面部
也可以對「真實」類別的面部執行同樣的操作
因為「真」視頻比「假」視頻長,因此我們得把跳過幀的值設置得更長,來平衡每一類輸出的面部ROI數量。
在執行這個文稿之後,你的圖像數量應該如下:
偽造面部:150 張圖片; 真實面部:161 張圖片; 總數:311 張圖片。
實現「LivenessNet」——我們的深度學習活體檢測器 圖 5:LivenessNet(一個用來檢測圖片和視頻中面部活性的 CNN)的深度學習架構。
下一步就要實現基於深度學習的活體檢測器「LivenessNet」了。
從核心上講,LivenessNet 實際上就是一個簡單的卷積神經網路。
我們要讓這個網路盡可能淺,並用盡可能少的參數,原因如下:
現在來實現 LivenessNet 吧。 開啟 livenessnet.py 並插入下面的代碼:
所有導入(import)的包都來自 Keras(2~10 行)。 要深入了解這些層和函數,請參考《Deep Learning for Computer Vision with Python》。
第 12 行定義了 LivenessNet 的類。 這裡用了一種靜態方法——build(14 行)。 build 方法接受 4 個參數:
在17行初始化模型。
在 18 行定義了 inputShape,在 23~25 行確定了通道順序。
接著給 CNN 新增層:
我們的CNN展現了 VGGNet 特有的品質——只學習了少量的篩檢程式。 在理想情況下,我們不需要能區分真實面部和偽造面部的深度網路。
28~36 行是第一個層的集合——CONV => RELU => CONV => RELU => POOL,這裡還添加了批歸一化和 dropout。
39~46 行添加了另一個層集合——CONV => RELU => CONV => RELU => POOL。 最後,我們還要添加FC =>RELU層:
49~57 行添加了全連接層和帶有 softmax 分類器 head 的 ReLU 啟動層。
模型在 60 行返回到訓練腳本。
創建訓練活體檢測器的腳本
|