點擊我愛計算機視覺標星,更快獲取CVML新技術
前段時間,52CV正式運營子品牌OpenCV中文網公眾號,旨在分享最新的OpenCV實用技術與計算機視覺突破,無意中分享了兩篇活體檢測的代碼:
CVPR 2019 活體檢測比賽第二名、第三名方案開源
OpenCV活體檢測
(強烈推薦大家點擊上述連結關注OpenCV中文網)
不想竟然引起了52CV人臉識別群友們的熱切關注,後來新開了活體檢測群,群內籌劃後續系統性總結相關論文和數據集。
今天的文章來自52CV群友王哲的知乎專欄活體檢測論文分享,原文地址:
https://zhuanlan.zhihu.com/p/60155768
該文解讀了CVPR 2018 活體檢測論文《Learning Deep Models for Face Anti-Spoofing: Binary or Auxiliary Supervision》。
原論文作者來自美國密西根州立大學。
所屬範疇:單目可見光靜默活體
簡介:
作者認為現存大多數活體算法用binary classification監督不夠合理,也不能說明預測結果的依據(模型是否學習到真正的活體與攻擊之間差異),故提出CNN-RNN框架,採用pixel-wise的深度圖監督方式和sequence-wise的rPPG信號監督方式(如下圖),並提出高解析度+豐富PIE的數據集SiW;試驗在cross-test取得了state-of-the-art。
主要貢獻:
提出用深度圖和rPPG信號作為CNN學習的監督信息,提高模型泛化能力;
提出CNN-RNN框架,支持深度圖和rPPG信號的end-to-end訓練;
發布全新數據集,包含多種PIE和其他影響因素,並取得sota。
方法介紹:
首先我們看rPPG是什麼,Remote Photoplethysmography (rPPG)是在不接觸人體皮膚的情況下,跟蹤如心率等重要信號的技術。作者引用了很多文獻來解釋rPPG的發展,然而結論卻是,分析這種信號的解決方案太容易實現了,那麼它一定很容易受到PIE變化的影響!因此,作者用RNN來學習從人臉視頻到rPPG信號的映射,對於PIE變化可能不夠魯棒,但是足夠區分真人和攻擊。
1. Face Anti-Spoofing with Deep Network
如Figure 2所示,先用CNN提取特徵,用深度圖做監督信息,然後把預測的深度圖和最後一層的特徵圖輸入到non-rigid registration layer,獲得aligned後的特徵圖,再用aligned的特徵圖和rPPG監督信息訓練RNN,使其通過視頻序列獲得區分真人和攻擊的能力。
2. 深度圖監督
深度圖是二維圖像的三維信息表達,表示不同區域和相機之間不同距離。這種表達比二維標籤傳達出更多的信息,可以從根本上區分真人與列印、視頻回放的攻擊方式。作者用DeFA估計3D信息(具體的沒太看懂),考慮到絕對深度不方便訓練也沒太大作用,就將深度歸一化到[0, 1],再用z-Buffer算法把歸一化的z值映射回2D圖像,這樣作為CNN部分pixel-wise監督信息的「ground truth」就產生了。
3. rPPG 監督
rPPG信號最近已經被用到活體識別領域了,為face liveness提供時域信息,這類信息與血液流動高度相關。傳統的rPPG信號提取方法有三個弊端:對姿態太敏感,很難跟蹤某個特定的面部區域;對光照敏感,額外的光照會影響皮膚反光的總量;對於活體識別而言,從視頻提取的rPPG信號可能無法與真實視頻區分。
作者認為用RNN去估計rPPG信號可以有效解決上述所有問題,假設,同一subject的視頻在不同PIE條件下的ground truth rPPG信號是相同的。由於同一人的心跳在視頻中(拍攝時間小於5分鐘)是相似的,所以假設有效。作者把某個subject的constrained(PIE 無變化)視頻中提取出的rPPG信號作為這個subject所有rPPG信號的groundtruth。這種可持續的監督信息有助提升CNN和RNN的魯棒性。作者用DeFA提取人臉區域用於計算兩個正交色度信號,然後FFT變換至頻域。
4. CNN網絡
作者用了全卷積網絡,包含三個block,每個block的輸出都resize到64*64再合併。合併後的feature分別輸入到兩個分支,第一個分支用於估計深度圖,目標函數:
D為CNN參數,Nd為訓練集樣本總數。第二個分支輸入到non-rigid registration layer。5. RNN網絡
RNN網絡基於圖像序列估計rPPG信號,然後FFT變換到頻域,目標函數:
R是RNN參數,Fj是frontalized feature map,Ns是圖像序列的總數。作者在FFT之後對FFT求Loss,那麼bp的時候怎麼FFT過乘求導呢?先IFFT麼?既然FFT沒有參數,為什麼不把fc的輸入接入loss呢,不解。
6. 實現
1)ground truth
作者按照2. 中方法生成深度圖的ground truth,並把攻擊樣本的深度設為一個平面,如全部設為「0」;同樣,按照3. 中方法生成rPPG的ground truth,並做L2歸一化,攻擊樣本的rPPG設為「0」
2)訓練策略
作者合併CNN和RNN,做端到端訓練。CNN部分需要的數據需要打亂所有subject的所有樣本,再分成多個batch,以此來維持訓練的穩定性和模型的泛化能力,但是RNN模型需要某個subject的較長視頻序列來利用跨幀的時域信息。這兩方面是互相矛盾的,也對顯存要求很高,為此作者設計了two-stream 策略:第一個stream滿足CNN,輸入為RGB圖片和深度圖「ground truth」;第二個stream滿足RNN,輸入是視頻序列,深度圖「ground truth」,預測的3Dshapes和rPPG 「ground truth」。訓練時,交替訓練兩個stream,訓練CNN時只更新CNN參數,訓練RNN時更新CNN和RNN的參數(很難理解,怎麼通過non-rigid registration反傳回去的)。
3)測試
輸入視頻序列,得到預測的深度圖和rPPG信號,計算最後的
得分:
為常數權重,用來合併兩個輸出。
4)Non-rigid registration 層
作者設計non-rigid registration層,用於RNN輸入數據的預處理。這一層用預測的稠密3Dshape align CNN輸出的feature map的activations,確保RNN跟蹤和學習到不同人臉同一部分的變化。如下圖,該層有三個輸入:CNN輸出的feature map T,估計的深度圖Dhat,3D shape S;首先把Dhat二值化,得到V,然後計算V和T的內積,得到U,相當於把V當成T的mask來使用。
最後,用S frontalize U(不理解):
作者認為該層對整個網絡有三個貢獻:輸入數據被對齊,RNN在學習特徵是不受到面部姿態和表情的影響;減少feature map中背景的影響;對於攻擊樣本,深度圖幾乎接近0,因此和feature做內積時,極大弱化了feature map的activation,有利於RNN學習並輸出的rPPG信號為0,因此,rPPG loss也有助於CNN產生值為0的深度圖。
實驗與結論:
作者在tf框架下進行試驗,學習率為 3e-3,10個epoch,CNN stream batch 為10,CNN-RNN stream batch 為2,視頻序列長度為5,公式(6)中為0.015,公式(7)的閾值為0.1。作者用APCER,BPCER,ACER,HTER作為測試的metric,ablation 測試結果如下:
Model 1: CNN + pooling layer + fc layer + softmax
Model 2: CNN + depth map
Model 3: CNN + RNN + depth map + rPPG(w/o non-rigid registration)
Model 4: 作者提出的框架
作者用SiW數據集中的20個subject進行試驗,顯然本文提出的框架效果最好,作者還研究了不同視頻長度對結果的影響,見下圖,視頻序列越長取得效果越好,對顯存要求也就越高。
其他測試結果如下:
其他
1)可視化
從下圖可以看到,輔助的監督信息是有效的。
CV君在網上找了下,目前還未發現該文有開原始碼,如果各位讀者有推薦的相關代碼,歡迎留言。
加群交流
關注活體檢測相關技術,歡迎加入52CV-活體檢測交流群,下方掃碼CV君拉你入群,驗證信息請務必註明:活體檢測(不然不會通過好友驗證)。
喜歡在QQ交流的童鞋可以加52CV官方QQ群:702781905。
(不會時時在線,如果沒能及時通過還請見諒)
長按關注我愛計算機視覺