1. 程式人生 > >人臉檢測深度方法

人臉檢測深度方法

深度學習在計算機視覺的應用中已經十分廣泛,其效果相比於傳統方法也有很大的提高。本文就人臉檢測這個領域,介紹深度學習在人臉檢測領域的發展。

深度學習人臉檢測最早的代表作之一是2015年CVPR的一篇論文《A Convolutional Neural Network Cascade for FaceDetection》,下文簡稱CascadeCNN。這篇文章保留了傳統人臉檢測方法中Cascade的概念,使用3個輸入大小分別為12、24、48的淺層網路,在每個分類網路之後接一個矯正網路用於迴歸人臉框的位置。對比CascadeCNN和傳統人臉檢測方法,本文總結其相同點和不同點。相同點如下:1. 使用了Cascade級聯結構,使用前面的stage快速過濾簡單樣本,後面的stage得到更為準確的分類結果;2. 影象金字塔結構,對於不同scale的人臉大小,通過縮放影象得到影象金字塔再進行處理;3. 滑動視窗加步長的處理模式;4. 最後處理結果根據IOU(intersection over union)大小使用NMS(Non-maximum suppression)方法進行視窗合併。不同點如下:1. 每個stage中CNN的分類器代替了傳統的分類器;2. 每個分類stage之後應用了一個矯正網路使得人臉框的位置更為精確。該論文是當時基於CNN的人臉檢測方法中速度最快的。

CascadeCNN 測試流程

15年另一篇文章關於深度學習人臉檢測比較有代表性的文章是《Multi-view Face Detection Using Deep Convolutional Neural Networks》。這篇文章使用的網路是AlexNet,由於網路的分類能力相對較強,該文沒有采用Cascade結構。是影象金字塔依舊採用,每一層金字塔用AlexNet處理一遍。這篇文章的一個亮點是使用了全卷積網路,將全連線層修改引數排列方式變成卷積層,對輸入影象的大小沒有了限制。金字塔的每一層由AlexNet處理後出來的是一個HeatMap,HeatMap的每個點對應原圖中一個區域。

原圖與HeatMap圖

2016年深度學習人臉檢測相關的文章都流行起來multi-task的概念,將人臉檢測(分類)和人臉框位置矯正(迴歸)以及人臉關鍵點定位、姿態、姿態等屬性的檢測相結合(筆者在實驗中發現,除了人臉框位置迴歸,其他的task對人臉檢測的精度沒有任何提高)。相關文章有:《HyperFace: A Deep Multi-task Learning Framework for Face Detection, Landmark Localization, Pose Estimation, and Gender Recognition》、《Joint Training of Cascaded CNN for Face Detection》(後文簡稱JTCCNN)、《Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》(後文簡稱MTCNN)。HyperFace的網路結構也是基於Alexnet的變形,其特點對每個task有一個512大小的fc層,在對應到不同的任務,具體網路結果參見附圖。

HyperFace網路結構

JTCCNN和MTCNN兩篇文章在思路和網路結構上有很多相同之處。這兩個方法都是基於15年CascadeCNN這篇文章的思路進行延伸的。最大的不同點在於,JTCCNN將低層的特徵連線到了高層,12net的特徵會拼接到24net上,12和24拼接得到的特徵又會進一步拼接到48net上,級聯的概率體現在了網路內部,12net、24net、48net對應有自己的閾值,沒有通過閾值的樣本被判斷為負樣本。MTCNN則保持每個Cascade之間的net互不干涉,它在CascadeCNN的基礎上,改進了網路結構,12net應用了全卷積的網路,應用到了multi-task引用人臉框迴歸和關鍵點,進一步調高了人臉檢測的速度和精度。

JTCCNN網路結構MTCNN網路結構

今年人臉檢測相關的文章更多關注到了人臉的scale,能否不需要這麼多層的影象金字塔就能檢測出不同尺度的人臉呢?《Finding tiny face》給出的答案是減少金字塔的層數,同時增加模板尺度這兩種方式相結合,該文章同時實驗驗證,對於小人臉(影象中人臉大小小於20個畫素),加入人臉周圍的context上下文資訊能極大的提高該人臉的檢測率。《Scale-Aware Face Detection》這篇文章的思路比較奇特,先有一個Scale Proposal Network (SPN)得到影象上所有人臉的尺度大小資訊,然後根據此對影象進行resize(在resize的影象上,所有的人臉大小在同一尺度),然後只需要對該sacle的一個尺度的網路便可檢測出所有人臉。《Face Detection through Scale-Friendly Deep Convolutional Networks》Scale-friendly在提供propose方法的時候從影象中提取各種尺度的anchor,力求覆蓋到各種尺度大小。

Scale-Aware Face Detection 測試流程Scale-friendly 訓練流程

到此很多讀者可能會疑惑,為啥沒有提到RCNN、fastRCNN、fasterRCNN、sppnet、YOLO、SSD、DenseBox等相關物體檢測的文章,也有很多工作是將這些方法應用到人臉檢測的,考慮到其通用性,這裡沒有一一介紹,後續筆者會就物體檢測系列的文章進行詳細描述。

總結來說,全卷積網路代替滑動視窗加步長的方式,利用到時卷積層共享計算的特性;Cascade結構其實和目標檢測的proposal是同一思想,都是想通過一個快速的方法獲取人臉候選位置,排除掉大量的負樣本;影象金字塔、特徵級別金字塔、不同尺度的anchor、不同尺度的模型大小都是為了解決人臉sacle的問題,例如同一個檢測器很難同時檢測出來20*20大小和200*200大小,加入了人臉框迴歸可一定程度的提高尺度的魯棒性。

最後說一下,人臉檢測速度的問題。提到人臉檢測速度,不說影象大小和最小檢測尺度都是耍流氓的行為。最小檢測尺度翻一倍,速度可能要提升不止一倍。上述所有的方法中,結合速度和檢測率,表現最優秀的是MTCNN的方法(但凡涉及到VGG16、Resnet34這種大的網路結構的檢測演算法很難實用起來),後續筆者會詳盡介紹MTCNN的訓練測試流程。