《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的算法結構。
架構
算法流程
當給定一張照片的時候,将其縮放到不同尺度形成圖像金字塔,以達到尺度不變。
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,結構如圖:
訓練
這個算法需要實作三個任務的學習:人臉非人臉的分類,bounding box regression和人臉特征點定位。
(1)人臉檢測
這就是一個分類任務,使用交叉熵損失函數即可:
Ldeti=−(ydetilog(pi)+(1−ydeti)(1−log(pi)))
(2)Bounding box regression
這是一個回歸問題,使用平方和損失函數:
Lboxi=∥y^boxi−yboxi∥22
(3)人臉特征點定位
這也是一個回歸問題,目标是5個特征點與标定好的資料的平方和損失:
Llandmarki=∥y^landmarki−ylandmarki∥22
(4)多任務訓練
不是每個sample都要使用這三種損失函數的,比如對于背景隻需要計算 Ldeti ,不需要計算别的損失,這樣就需要引入一個訓示值訓示樣本是否需要計算某一項損失。最終的訓練目标函數是:
min∑i=1N∑j∈{det,box,landmark}αjβjiLji
N是訓練樣本的數量。 αj 表示任務的重要性。在P-Net和R-Net中, αdet=1,αbox=0.5,αlandmark=0.5 ,在O-Net中, α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=(A∩B)/A∪B
就是矩形框A、B的重疊面積占A、B并集的面積比例。
非極大值抑制(NMS):
RCNN會從一張圖檔中找出n個可能是物體的矩形框,然後為每個矩形框為做類别分類機率:
就像上面的圖檔一樣,定位一個車輛,最後算法就找出了一堆的方框,我們需要判别哪些矩形框是沒用的。非極大值抑制的方法是:先假設有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來選取那些鄰域裡分數最高(是行人的機率最大),并且抑制那些分數低的視窗。