1. 程式人生 > 實用技巧 >活體檢測(001)

活體檢測(001)

1.活體檢測面臨的問題

  在一些業務需要中,需要識別場景中的使用者是否為"真人",因此需要活體檢測技術,這篇文章將針對當前行業中的活體檢測技術進行總結。
  在人臉檢測中,攻擊者往往會通過PA(Presentation Attacks)對系統進行攻擊,常見的PA操作包括列印照片,虛假錄製視訊,面部偽裝,3D人臉面具等方式,如果沒有活體檢測,系統的安全性會比較低。在2017年之前,行業主要的實現方向是使用傳統的機器視覺方法,在17年之後,較多的使用CNN卷積網路來輔助效能,在2019年CVPR中就有多篇關於活體檢測的Paper,目前已成熱門方向。

2.常見活體檢測方式調研

1.傳統的活體檢測處理方法

  Ⅰ:基於傳統影象處理的活體檢測
  傳統的活體檢測主要的思路是捕捉影象的紋理資訊,從而進行分類。
  這類方法整體的流程大致如下:
  1:影象預處理,對影象進行裁剪,對齊,分割等操作,同時對影象的空間進行變換和疊加,通過從時域到頻域,空域或者改變其顏色空間來進行操作。
  2:使用如SIFT,HOG,LBP,SURF以及各種魔改變種來對影象的特徵進行提取。
  3:使用如降維,編碼,多通道組合的方法進行進一步的特徵提取,進行分類前的預處理
  4:使用SVM/LR等特徵分類器進行二分類
  Ⅱ:傳統方法論文思想總結:
  ①:通過活體和PA攻擊紋理統計特性不一致,基於紋理特徵進行分類
  比較具有代表性的論文:
  1:Face Spoofing Detection Using Colour Texture Analysis
  通過HSV空間人臉多級LBP特徵 + YCbCr空間人臉LPQ特徵
  Link:https://ieeexplore.ieee.org/abstract/document/7454730
  2: Face anti-spoofing based on color texture analysis
  通過觀測在頻域上分佈不同,先區分活體還是照片攻擊 (因為照片中的人臉提取的頻域分佈不同),若判別上述結果是活體,再設計一個紋理LBP分類器,來區分活體還是螢幕攻擊(因為螢幕視訊中人臉頻率分佈與活體相近)
  Link:https://ieeexplore.ieee.org/abstract/document/735128
  在這類論文中,活體和PA紋理不一致,如下圖:

  可以通過LBP(區域性二值)來提取其紋理特徵,再對LBP進行分類:

  使用到的模型架構:

  ②:基於紋理統計特性進行分類
  代表論文:
  1:Chromatic cooccurrence of local binary pattern for face presentation attack detection
  Link:https://ieeexplore.ieee.org/document/8487325
  模型架構:

  ②:On the effectiveness of local binary patterns in face anti-spoofing
  Link:https://ieeexplore.ieee.org/abstract/document/6313548
  模型架構:

  ③:LBP-TOP based countermeasure against face spoofing attacks
  Link:http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=271BCC281BDD5D9B869D3DB92A278BB0?doi=10.1.1.493.6222&rep=rep1&type=pdf
  模型架構:

  ④:Face Liveness Detection with Component Dependent Descriptor
  這篇文章也是用的紋理統計,但是比較有意思的是使用了面部分割的方法
  模型流程:

  1:檢測面部位置,將面部分割為輪廓,面部,左右眼,鼻,嘴,六個區域
  2:提取面部特徵,LBP+HOG,將不同部位進行特徵聯結
  3: SVM分類器進行二分類
  以上為比較傳統的機器學習的活體檢測方法,雖然這些演算法有一些歷史,但大致流程不變,我們仍可以學習其處理的核心精神,下面我們將介紹下現在比較主流的基於深度學習的活體檢測!

2.深度學習活體檢測方法

  An original face anti-spoofing approach using partial convolutional neural network
  Link:ieeexplore.ieee.org/doc
  模型架構:

  和傳統的方法結構類似,只是使用了VGG進行特徵提取,通過CNN網路端到端學習anti-spoofing的表示空間
  Face anti-spoofing using patch and depth-based cnns
  Link:cvlab.cse.msu.edu/pdfs/
  基本思想:基於紋理的特徵提取
  主要表現為:區域性特徵+整體深度圖
  人臉活體和PA的區域性區域提取出來的特徵不同,因此得到的統計特徵不同。同時採用圖片等攻擊方法的PA模型往往呈現為扁平,缺少面部深度特徵,如下圖,人臉活體會有深度圖狀。
  模型框架:

  模型主要使用了兩個CNN框架:
  patch-based CNN:
  端到端訓練的,併為每個從人臉影象中隨機抽取的patch打一個分數,取平均分。
  使用patch的好處:    
  1. 增加訓練資料。
  2. 不用resize整張臉,保持原本的解析度。
  3. 在區域性檢測可用於活體檢測的特徵時,設定更具挑戰性的約束條件,加強特徵提取的效能。
  輸入:相同大小的不同patches的RGB, HSV, YCbCr特徵圖等。
  輸出:pacth spoof scores。
  depth-based CNN:
  完全卷積網路(FCN),對人臉影象的深度圖進行估計,並提供一個真實度評分。
  研究表明高頻部分對anti-spoofing非常重要,為避免對原圖進行resize而損失圖片的高頻部分,因此使用FCN以無視輸入特徵圖的size。

  並且還用到了兩個監督訊號:
  1:patch spoof scores
  從人臉影象中挑選某些區域性區域patches,根據patch內的文理統計特徵計算一個patch spoof scores,用於監督patch-based CNN部分。
  2:深度圖Depth Map
  面部深度圖顯示了面部不同位置的深度資訊,據此計算深損失,用於監督depth-based CNN部分。
  整個模型的架構:

  但是這個模型效能一般,甚至比不上一些傳統的演算法。
  Deep Convolutional Dynamic Texture Learning with Adaptive Channel-discriminability for 3D Mask Face Anti-spoofing
  *這篇文章值得讀一下,這篇文章主要是針對3D面具的攻擊。3D面具的攻擊和其他的PA攻擊不同,由於面具覆蓋了臉部,面具是無法呈現出人臉的臉部運動的,真實的人臉的面部運動更加的細膩,精細,比如蘋果肌,皺紋,眨眼,臉部肌肉的微動等等,我們可以認為是動態紋理的不同。
  這套演算法基本流程與之前平面處理的不太一致:
  1:首先需要對視訊進行預處理,這裡用到了CLNF模型,來檢測面部,對面部的68個特徵點進行檢測,並對面部進行align對齊。
  CLNF模型論文地址:cl.cam.ac.uk/research/r
  CLNK模型的介紹:

  2:通過VGG網路提取特徵
  從視訊流中連續的5幀選擇其中的一幀來作為VGG網路的輸入,3*3卷積網路輸出的特徵圖作為光流提取的輸入。
  3:分類
  使用SVM進行分類
  模型結構:

  網路結構:

  結果:
  ①:Intra-dataset

  ②:Cross-dataset

  Learning Deep Models for Face Anti-Spoofing: Binary or Auxiliary Supervision
  這篇文章還是很有意思的,效能超過了傳統方法。整篇文章的亮點在於Non-rigid Registration部分來對齊各幀人臉的非剛性運動,然後再去讓RNN學習。
  模型的基本思想:
  ①:基於紋理:活體和PA攻擊的面部深部圖不一致
  ②:基於生物訊號:可以通過面部資訊來測量相關的RRPG(心率)

  模型的結構:

  網路結構:
  CNN
  若干block串聯,每個block包括三個conv+exponential linear+bn和一個pooling。
  每個block輸出特徵圖經過resize layer將其resize為64×64,並將其通道維聯結。
  聯結後的特徵圖經過兩個branches,一個估計深度圖depth map,另一個估計特徵圖feature map。

  RNN

  Non-rigid Registration部分*
  根據估計的3D面部形狀圖S對特徵圖feature map進行對齊,保證RNN跟蹤並學習面部同一個區域的特徵隨時間和物體的變化。RNN不用考慮表情、姿態、背景的影響。

  這裡最有價值的就是為什麼設計這個對齊網路:
  結合做運動識別的任務進行思考,做運動識別時只需簡單把連續幀 合併起來喂進網路就行了,是假定相機是不動的,物件在運動
  而文中需要對連續人臉幀進行pulse特徵提取,主要物件是人臉上對應ROI在 temporal 上的 Intensity 變化,所以就需要把人臉當成是相機固定不動。
  實驗結果:但是沒有找到開原始碼,比較遺憾。

  Face De-Spoofing: Anti-Spoofing via Noise Modeling
  *這篇論文比較抽象,程式碼雖然開源但質量一般,約等於沒有開源~
  實際部署起來也比較難,主要針對print, replay, make-up類別的PA
  以往的Anti-Spoofing在基於深度學習方法做的時候通常當做一個二分類,輸出是Real/Spoof,內部模型是一個黑箱。這個方法將De-Spoofing的模型的內部機理考慮了進去。
  文章中假設:對於照片、視訊播放來進行的Spoof會引入噪聲,而這個噪聲普遍存在且可重複,因此,設公式為:

  其中的x是原圖,是一個與原始圖片N(x)有關的噪聲函式,這個公式就是演算法的核心。通過估計x^,N(x^)並去除spoof noise、以重建x^。若給定x=x^,則其spoof noise = 0。

  退化影象的頻譜分析:

  造成影象退化的幾個原因:
  1:色域:spoof介質色域更窄,顏色空間會出現錯誤
  2: 顯示干擾:相機本身在輸出影象的時候,會出現顏色近似,下采樣的過程,這樣會導致畫素擾動,模糊等問題。
  3:介質:存放影象的介質會產生比如反射,表面透明度等變化
  4::CMOS和CCD的感測器陣列的成像矩陣會有光干涉,某些情況下會產生失真和摩爾紋。
  以上這些噪聲干擾往往都是可加性的,因此也是可以消除,重建的。
  模型結構:

  模型分為三個部分:
  輸入:256*256*6,RGB+HSV的顏色空間
  1:DS Net

  2:DQ Net

  3:VQ Net

  效果:

  Exploiting Temporal and Depth Information for Multi-frame face Anti-Spoofing
  基本思想:在視訊流中,物體的運動有利於提取人臉深度資訊,可將面部運動和麵部深度資訊結合,用於活體檢測。
  文章給出了很好的思路和結論來使用多幀,這也是繼MSU使用多幀來預測rPPG頻域後的一大進步,這樣未來face anti-spoofing將更多focus在多幀上;而不是單幀深度,單幀color texture,這些方向上。
  具體的文章解讀在後續會單獨拿出一篇文章瞭解.
  總結: