人臉檢測(MTCNN)和人臉特征點檢測(TCDCN)


《Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》論文解讀。

本文來自於中國科學院深圳先進技術研究院,目前發表在arXiv上,是2016年4月份的文章,算是比較新的文章。
論文地址:

https://kpzhang93.github.io/MTCNN_face_detection_alignment/

概述

相比於R-CNN系列通用檢測方法,本文更加針對人臉檢測這一專門的任務,速度和精度都有足夠的提升。R-CNN,Fast R-CNN,FasterR-CNN這一系列的方法不是一篇博客能講清楚的,有興趣可以找相關論文閱讀。類似於TCDCN,本文提出了一種Multi-task的人臉檢測框架,將人臉檢測和人臉特征點檢測同時進行。論文使用3個CNN級聯的方式,和Viola-Jones類似,實現了coarse-to-fine的算法結構。

框架

算法流程

pipeline

當給定一張照片的時候,將其縮放到不同尺度形成圖像金字塔,以達到尺度不變。

Stage 1:使用P-Net是一個全卷積網絡,用來生成候選窗和邊框回歸向量(bounding box regression vectors)。使用Bounding box regression的方法來校正這些候選窗,使用非極大值抑制(NMS)合並重疊的候選框。全卷積網絡和Faster R-CNN中的RPN一脈相承。

Stage 2:使用N-Net改善候選窗。將通過P-Net的候選窗輸入R-Net中,拒絕掉大部分false的窗口,繼續使用Bounding box regression和NMS合並。

Stage 3:最后使用O-Net輸出最終的人臉框和特征點位置。和第二步類似,但是不同的是生成5個特征點位置。

CNN結構

本文使用三個CNN,結構如圖:

CNN

訓練

這個算法需要實現三個任務的學習:人臉非人臉的分類,bounding box regression和人臉特征點定位。

MTCNN特征描述子主要包含3個部分,人臉/非人臉分類器,邊界框回歸,地標定位。

人臉分類:

上式為人臉分類的交叉熵損失函數,其中,pi為是人臉的概率,yidet為背景的真實標簽。

邊界框回歸:

上式為通過歐氏距離計算的回歸損失。其中,帶尖的y為通過網絡預測得到,不帶尖的y為實際的真實的背景坐標。其中,y為一個(左上角x,左上角y,長,寬)組成的四元組。

地標定位:

和邊界回歸一樣,還是計算網絡預測的地標位置和實際真實地標的歐式距離,並最小化該距離。其中,,帶尖的y為通過網絡預測得到,不帶尖的y為實際的真實的地標坐標。由於一共5個點,每個點2個坐標,所以,y屬於十元組。

多個輸入源的訓練:

整個的訓練學習過程就是最小化上面的這個函數,其中,N為訓練樣本數量,aj表示任務的重要性,bj為樣本標簽,Lj為上面的損失函數。

在訓練過程中,為了取得更好的效果,作者每次只后向傳播前70%樣本的梯度,這樣來保證傳遞的都是有效的數字。有點類似latent SVM,只是作者在實現上更加體現了深度學習的端到端。

在訓練過程中,y尖和y的交並集IoU(Intersection-over-Union)比例:

0-0.3:非人臉

0.65-1.00:人臉

0.4-0.65:Part人臉

0.3-0.4:地標

訓練樣本的比例,負樣本:正樣本:part樣本:地標=3:1:1:2

αdet=1,αbox=0.5,αlandmark=1

(5)online hard sample mining

傳統的難例處理方法是檢測過一次以后,手動檢測哪些困難的樣本無法被分類,本文采用online hard sample mining的方法。具體就是在每個mini-batch中,取loss最大的70%進行反向傳播,忽略那些簡單的樣本。

實驗

本文主要使用三個數據集進行訓練:FDDB,Wider Face,AFLW。

A、訓練數據

本文將數據分成4種:

Negative:非人臉
Positive:人臉
Part faces:部分人臉
Landmark face:標記好特征點的人臉

分別用於訓練三種不同的任務。Negative和Positive用於人臉分類,positive和part faces用於bounding box regression,landmark face用於特征點定位。

B、效果

本文的人臉檢測和人臉特征點定位的效果都非常好。關鍵是這個算法速度很快,在2.6GHZ的CPU上達到16fps,在Nvidia Titan達到99fps。

總結

本文使用一種級聯的結構進行人臉檢測和特征點檢測,該方法速度快效果好,可以考慮在移動設備上使用。這種方法也是一種由粗到細的方法,和Viola-Jones的級聯AdaBoost思路相似。

類似於Viola-Jones:1、如何選擇待檢測區域:圖像金字塔+P-Net;2、如何提取目標特征:CNN;3、如何判斷是不是指定目標:級聯判斷。

附錄

在目標檢測論文中,常出現的一些方法有Bounding box regression,IoU,NMS。這里具體介紹一下。

Bounding box regression

這邊有個很好的答案了:

http://www.caffecn.cn/?/question/160

簡單而言就是將預測的框移動到實際的框,輸入特征是候選區域提取的特征,目標是兩個框的變化值。

IoU

重疊度(IOU):

物體檢測需要定位出物體的bounding box,就像下面的圖片一樣,我們不僅要定位出車輛的bounding box 我們還要識別出bounding box 里面的物體就是車輛。

這里寫圖片描述

對於bounding box的定位精度,有一個很重要的概念: 因為我們算法不可能百分百跟人工標注的數據完全匹配,因此就存在一個定位精度評價公式:IOU。 它定義了兩個bounding box的重疊度,如下圖所示

iou

 

IoU=(AB)/AB

就是矩形框A、B的重疊面積占A、B並集的面積比例。

非極大值抑制(NMS):

RCNN會從一張圖片中找出n個可能是物體的矩形框,然后為每個矩形框為做類別分類概率:

car

就像上面的圖片一樣,定位一個車輛,最后算法就找出了一堆的方框,我們需要判別哪些矩形框是沒用的。非極大值抑制的方法是:先假設有6個矩形框,根據分類器的類別分類概率做排序,假設從小到大屬於車輛的概率 分別為A、B、C、D、E、F。
(1)從最大概率矩形框F開始,分別判斷A~E與F的重疊度IOU是否大於某個設定的閾值;
(2)假設B、D與F的重疊度超過閾值,那么就扔掉B、D;並標記第一個矩形框F,是我們保留下來的。
(3)從剩下的矩形框A、C、E中,選擇概率最大的E,然后判斷E與A、C的重疊度,重疊度大於一定的閾值,那么就扔掉;並標記E是我們保留下來的第二個矩形框。
就這樣一直重復,找到所有被保留下來的矩形框。
非極大值抑制(NMS)顧名思義就是抑制不是極大值的元素,搜索局部的極大值。這個局部代表的是一個鄰域,鄰域有兩個參數可變,一是鄰域的維數,二是鄰域的大小。這里不討論通用的NMS算法,而是用於在目標檢測中用於提取分數最高的窗口的。例如在行人檢測中,滑動窗口經提取特征,經分類器分類識別后,每個窗口都會得到一個分數。但是滑動窗口會導致很多窗口與其他窗口存在包含或者大部分交叉的情況。這時就需要用到NMS來選取那些鄰域里分數最高(是行人的概率最大),並且抑制那些分數低的窗口。

 

  • TCDCN(Tasks-Constrained Deep Convolutional Network)

文章提出TCDCN(Tasks-Constrained Deep Convolutional Network),使用與人臉相關的屬性共同來學習人臉的特征點位置,通過這種多任務的學習,來提高人臉特征點檢測的魯棒性。具體而言,就是在人臉特征點檢測時候,同時進行多個任務(包括性別、是否戴眼鏡、是否微笑以及臉部姿勢)的學習。使用這些輔助屬性可以幫助更好的定位特征點。

這種多任務學習的困難在於:不同的任務有不同的特點,有不同的收斂速度。針對這兩個問題,作者給出的解決方法分別是tasks-constrained deep model和task-wise early stopping。文章所提出的方法優於當時已存在的方法,特別是能處理有嚴重遮擋和姿勢變化的情況,而且減少了模型的復雜度。

上圖展示了其他輔助屬性的檢測結果,人臉特征點檢測這一任務可以與多個輔助任務同時進行,對比以前的CNN和Cascaded  CNN,文章具有更好的表現性

要點:

(1)對於不同的任務,具有不同的特點,文章給出的解決方法是tasks-constrained deep model

傳統的多任務學習給每個任務都賦予相同的權重:

一般的多任務學習則把主任務(特征點)和其他任務(輔助屬性)分開處理,如下:

而文章采用對主任務(regression)采用最小二乘法作為損失函數,對輔助任務(classification)使用交叉熵損失函數,如下:

從這個式子上可以看到,損失函數的前半部分(f為線性函數)就是特征點檢測,后邊部分(p為softmax函數)是不同分類任務的loss相加,最后一項是正則化項。

在訓練的時候,各個任務使用相同的特征,只有在最后一級的時候才根據任務的不同做不同的處理(線性回歸/分類)。

 

(2)不對於多任務而言,不同的任務有着不同的損失函數,學習難度也不同,因此它們的收斂速度也可能相異。現有的解決這個問題的方法是通過探索這些任務的關系來解決,比如說通過所有任務的權重協方差矩陣,但是這篇文章提出了一個更有依據的方法:task-wise early stopping

當輔助任務達到最好的表現之后,這個任務對主任務就沒有什么幫助了,這個時候就可以停止這個任務。那我們如何判斷這個輔助任務是否起到了它應起的作用呢,我們應該什么時候終止這個任務呢?如下式所示,前一部分表示訓練誤差的趨勢,后一部分表示跟訓練誤差相比的泛化誤差。如果兩式乘積超過了某個閾值,則終止該任務。

 

 

文章所述,使用的是SGD(stochastic gradient descent)來更新任務的權重以及網絡的過濾器,后向傳播計算梯度使用的策略如下:

 

 

TCDCN所用的框架如下,輸入是一個40x40的灰色圖像,特征提取階段包括4個卷積層、3個池化層和1個全連接層,過濾器的權重在空間上不是共享的,這意味着在輸入map中使用的是不同的過濾器集合。選擇絕對值整流的雙曲正切作為激活函數;最大池化在沒有重疊的區域進行,跟在四個卷積層后的全連接層生成一個特征向量,這個特征向量在估計階段的時候被多個任務共享,其中線性回歸(Linear regression)用來得出標記點位置,多個邏輯回歸(logistic regression)用來處理其他多個人任務。

評估准則使用的額是均值誤差和失敗率來衡量,mean error通過計算landmark和the ground truths的距離,然后相對於雙目距離進行標准化得出,Mean error大於10%則認為失敗。

下圖是Facial Landmark Detection(FLD)和用其他輔助屬性進行比較的結果,很明顯可以看出使用輔助屬性進行特征點檢測的誤差和失敗率比沒有使用輔助屬性的要低得多,而且使用的輔助屬性越多,性能及越好。

 

還推薦一篇作者同類型的文章:《Learning Deep Representation  for Face Alignment with Auxiliary Arribute》提出用輔助屬性的臉部對齊的深度表示

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM