1. 程式人生 > >活體檢測新文by京東金融:利用多幀人臉來預測更精確的深度

活體檢測新文by京東金融:利用多幀人臉來預測更精確的深度

接著上次的《活體檢測Face anti-spoofing綜述》,再來講講arXiv上新掛的文章:

 

京東金融和中科院聯合發表的“Exploiting temporal and depth information for multi-frame face anti-spoofing”[1]

 

它的主要創新和貢獻是:利用了多幀的時空資訊來更精準地預測深度圖,再而進行活體檢測

 

 

Related Work

先把提一下之前的state-of-the-art,就是MSU發表在CVPR2018上的工作 [2]。

 

文中的主要思路是:

1. 通過活體與非活體的單幀人臉圖,來預測其深度圖(因為先驗知識知道 真人圖 與 紙張或螢幕攻擊載體 的深度很不同)

 

2. 通過活體與非活體的多幀人臉圖,來預測其rPPG訊號的頻域分佈(同理先驗知道 真人人臉的rPPG訊號 與 無生命的紙張或螢幕 很不同)

上述共享一個 backbone,後接兩個分支。分支一直接回歸深度圖;分支二用來預測rPPG頻域分佈:即是通過non-rigid registration層來將pose都歸一到正臉同姿態,後接RNN來獲得temporal資訊。這裡就列下共享的主幹網路,因為京東這文章也是用相同的網路:

1.jpg

圖1.主幹網路

 

依據與Motivation

作者認為,MSU上述方法有一定drawback:

1. 因為使用了non-rigid註冊層去除臉部表情和姿態的影響,這樣忽略了重要的線索:非活體臉部不同表情與姿態的不自然變化(unnatural changes)

 

2. 只用了單幀影象來預測深度,忽略了多幀間的空間微變化可以幫助重構環境3D資訊。

基於上面兩點,作者發現可以把該問題看出multi-view的SLAM問題,無論是攝像頭在動,還是人臉在動,它們幀間的動態資訊都可以用來重構3D空間,即用多幀資訊理論上會比單幀更好地重構深度圖

 

作者畫出下面草圖來描述活體與非活體間幀間的微變化,可見在 左邊(a)活體場景,明顯側臉時鼻子與耳朵的角度比正臉時大;而對於右側(b)螢幕攻擊,則反之。

2.jpg

圖2.活體與非活體的多幀視差

 

演算法框架

總框架主要分兩部分(單幀部分和多幀部分),如下圖所示:

3.jpg

圖3.網路總框架圖

 

單幀部分和MSU文章的主幹網路基本一致(唯一的不同就是MSU用了 RGBHSV 6通道作為輸入,本文用的是RGB三通道),就是每幀單獨預測深度圖:

4.jpg

圖4. 單幀網路部分

 

多幀部分主要由 optical flow guided features (OFF) Block 和 ConvGRU Unit 組成,因為OFF Blcok主要構建在相鄰兩幀間,而 ConvGRU 是構建在整個多幀的clips間,故前者用來獲取short-term資訊,後者則獲得Long-term資訊。

 

下圖是OFF Block架構圖,我們來看看都做了什麼:

1. Fl(t)為當前幀特徵經過1x1卷積後降維的特徵

 

2. FlS(t)為當前幀特徵經過Sobel運算元後的空間XY方向梯度

 

3. FlT(t)為當前幀特徵與相鄰後一幀特徵的差異(空間梯度)

 

4. FlS(t+△t)為相鄰後一幀特徵的Sobel運算元後的空間XY方向梯度

 

5. OFFl-1(t)為上個OFF Blcok輸出的特徵 (即多個OFF Block是 stacked)

最後把上述5個特徵都concatenate在一起,3x3卷積再降維~~

5.jpg

圖5. OFF Block的架構

 

至於作者為什麼要這樣設計呢?OFF全稱是optical flow guided features,則作者希望使用相鄰幀間feature-level的光流,這樣比起傳統光流,表徵能力更強且計算消耗更小。傳統光流公式如下:

image.png

通過泰勒分解和變形後,得到:

image.png

這裡的 (vx,vy) 就是光流,而通過上面公式可得正交關係:

image.png

 

是被光流引導的。而通常傳統光流需要通過 Low-level 和 high-level 特徵去匹配得到,故我們將上式的輸入影象 I 換成特徵圖來輸入,則使用多級特徵圖的X方向梯度,Y方向梯度和時間梯度,便可類似地表示光流。所以OFF block裡的5個元素,就是按照這個來的~~

 

PS:文中光流假設有點問題,文中說光流前後(x,y) 與(x+△t,y+△t)的亮度應不變。不過在人臉的應用中,肯定是會換的,即人臉相同位置的pixel,隨著心臟驅動的血液流動,它的亮度值也會週期性地變化,這就是做rPPG的原理~~Whatever, 我們這裡先不談這個,作者開心就好~~

 

最後我們來說說 Loss function,主要由三部分組成:

1. 二值分類誤差(活體or非活體)

 

2. 每幀深度圖的 L1 loss

 

3. 作者自己提出的每幀深度圖的 contrasive depth regression loss:

image.png

目的是更好學到每個 pixel 的拓撲關係,更強約束其與周邊neighbor的對比度。對應的Kernel如下圖所示:

6.jpg

圖6.對比深度損失的Kernel

 

實驗結果

在Oulu-NPU上的結果:

7.jpg

圖7. Oulu-NPU結果

 

FAS-BAS 指的是 MSU文章[2] 的方法,可見京東的方法用單純的Depth,還是要比MSU的 rPPG+Depth 方法效能要好~~

 

接著我們來看看網路裡各個模組及Loss的作用:

9.jpg

可見 OFF-Block 和 Contrastive Depth loss 的作用還是蠻大的~~

 

最後來定性視覺化下出來的深度圖的可判別性如何:

10.jpg

圖8. 深度圖視覺化

 

使用多幀來重構的深度圖,對於Replay螢幕攻擊有明顯的改善。對於Print列印攻擊,好像還更糟糕了一點。

 

總結與展望未來

文章給出了很好的思路和結論來使用多幀,這也是繼MSU使用多幀來預測rPPG頻域後的一大進步,這樣未來face anti-spoofing將更多focus在多幀上;而不是單幀深度,單幀color texture~~

 

未來展望的話,可以看看其他影象預測深度圖的文章如位元組跳動DeepLens[3]等等,來激發靈感用於活體的任務~~另外正如前面綜述所說,探索臉部微變化如rPPG等,和結合人臉檢測,人臉識別,人臉微表情等任務來找關聯性都是值得探索~~

 

Reference:

[1] Zezheng Wang et al. Exploiting temporal and depth information for multi-frame face anti-spoofing, 2018

[2] Yaojie Liu, Amin Jourabloo, Xiaoming Liu, Learning Deep Models for Face Anti-Spoofing: Binary or Auxiliary Supervision ,CVPR2018

[3]LIJUN WANG et al. DeepLens: Shallow Depth Of Field From A Single Image, 2018