天天看點

人臉檢測算法

https://handong1587.github.io/deep_learning/2015/10/09/object-detection.html

人臉識别各論文參考

知乎一個欄目:

https://zhuanlan.zhihu.com/p/25025596

首先介紹一下常用人臉檢測的常用資料庫:

FDDB和WIDER FACE

FDDB總共2845張圖像,5171張,人臉非限制環境,人臉的難度較大,有面部表情,雙下巴,光照變化,穿戴,誇張發型,遮擋等難點,是目标最常用的資料庫。有以下特點:

  • 圖像分辨率較小,所有圖像的較長邊縮放到450,也就是說所有圖像都小于450*450,最小标注人臉20*20,包括彩色和灰階兩類圖像;
  • 每張圖像的人臉數量偏少,平均1.8人臉/圖,絕大多數圖像都隻有一人臉;
  • 資料集完全公開,published methods通常都有論文,大部分都開源代碼且可以複現,可靠性高;unpublished methods沒有論文沒有代碼,無法确認它們的訓練集是否完全隔離,持懷疑态度最好,通常不做比較。(扔幾張FDDB的圖像到訓練集,VJ也可以訓練出很高的召回率。。需要考慮人品能不能抵擋住利益的誘惑)
  • 有其他隔離資料集無限制訓練再FDDB測試,和FDDB十折交叉驗證兩種,鑒于FDDB圖像數量較少,近幾年論文送出結果也都是無限制訓練再FDDB測試方式,是以,如果要和published methods送出結果比較,請照做。山世光老師也說十折交叉驗證通常會高1~3%。
  • 結果有離散分數discROC和連續分數contROC兩種,discROC僅關心IoU是不是大于0.5,contROC是IoU越大越好。鑒于大家都采用無限制訓練加FDDB測試的方式,detector會繼承訓練資料集的标注風格,繼而影響contROC,是以discROC比較重要,contROC看看就行了,不用太在意。

WIDER FACE:

WIDER FACE總共32203圖像,393703标注人臉,目前難度最大,各種難點比較全面:尺度,姿态,遮擋,表情,化妝,光照等。有以下特點有:

  • 圖像分辨率普遍偏高,所有圖像的寬都縮放到1024,最小标注人臉10*10,都是彩色圖像;
  • 每張圖像的人臉資料偏多,平均12.2人臉/圖,密集小人臉非常多;
  • 分訓練集train/驗證集val/測試集test,分别占40%/10%/50%,而且測試集的标注結果(ground truth)沒有公開,需要送出結果給官方比較,更加公平公正,而且測試集非常大,結果可靠性極高;
  • 根據EdgeBox的檢測率情況劃分為三個難度等級:Easy, Medium, Hard。

有關人臉識别,主要分為兩個步驟算法,人臉檢測算法和人臉識别算法。本文總結介紹最近幾年常用的人臉檢測算法,友善自己以後參考。

1.SSD

這篇博文介紹了SSD跑自己資料的做法

https://blog.csdn.net/wfei101/article/details/78821575

SSD關鍵點分為兩類:模型結構和訓練方法。模型結構包括:多尺度特征圖檢測網絡結構和anchor boxes生成;訓練方法包括:ground truth預處理和損失函數。

文章的核心之一是作者同時采用lower和upper的feature map做檢測。假定有8×8和4×4兩種不同的feature map。第一個概念是feature map cell,feature map cell 是指feature map中每一個小格子,假設分别有64和16個cell。另外有一個概念:default box,是指在feature map的每個小格(cell)上都有一系列固定大小的box,如下圖有4個(下圖中的虛線框,仔細看格子的中間有比格子還小的一個box)。假設每個feature map cell有k個default box,那麼對于每個default box都需要預測c個類别score和4個offset,那麼如果一個feature map的大小是m×n,也就是有m*n個feature map cell,那麼這個feature map就一共有(c+4)*k * m*n 個輸出。這些輸出個數的含義是:采用3×3的卷積核對該層的feature map卷積時卷積核的個數,包含兩部分(實際code是分别用不同數量的3*3卷積核對該層feature map進行卷積):數量ckmn是confidence輸出,表示每個default box的confidence,也就是類别的機率;數量4kmn是localization輸出,表示每個default box回歸後的坐标)。訓練中還有一個東西:prior box,是指實際中選擇的default box(每一個feature map cell 不是k個default box都取)。也就是說default box是一種概念,prior box則是實際的選取。訓練中一張完整的圖檔送進網絡獲得各個feature map,對于正樣本訓練來說,需要先将prior box與ground truth box做比對,比對成功說明這個prior box所包含的是個目标,但離完整目标的ground truth box還有段距離,訓練的目的是保證default box的分類confidence的同時将prior box盡可能回歸到ground truth box。 舉個列子:假設一個訓練樣本中有2個ground truth box,所有的feature map中擷取的prior box一共有8732個。那個可能分别有10、20個prior box能分别與這2個ground truth box比對上。訓練的損失包含定位損失和回歸損失兩部分。

SSD算法的缺點:優勢是速度快,在GPU上能實時,缺點是對密集小目标的檢測比較差,而人臉剛好是密集小目标,這類方法的研究重點是提高密集小目标的檢測性能,同時速度也需要盡可能快,GPU實時算法在應用中依然受限。

2.S3FD

github代碼:

https://github.com/sfzhang15/SFD

這篇文章對anchor對小人臉檢測率低的問題進行了分析和改進。

基于anchor方法的缺點:

Anchor-based方法沒有scale-invariant(尺度不變性).對大物體檢測的好,對小物體不行。

沒有尺度不變性的原因:

  • 不适當的網絡結構:後面的步長會變很大,會忽略掉一部分小的物體
  • anchor合适問題:因為anchor設計的問題,導緻有些小臉沒有足夠多的anchor與其相比對,故而降低了檢測率。
  • anchor尺寸問題:若降低anchor的尺度(如在conv3_3加入小尺度的anchor),會大大增加負樣本數量。

改進:

  • 作者重新設定了anchor的尺度。并且作者認為stride決定了anchor的間隔。是以設定每層stride的大小為每層anchor尺度的1/4.作者稱其為equal-proportion interval principle。
  • 為了使某些小物體有足夠多的anchor與其相比對,是以适當降低了門檻值。

速度比較慢。

3.MTCNN

該算法直接實作了人臉檢測和人臉對其。其結構是是三個CNN級聯:

​ P-net R-net O-net

​ 主要是人臉landmark檢測

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個特征點位置。

人臉檢測算法

該代碼實作了mtcnn人臉檢測部分:(最終結果為畫框)

https://github.com/DuinoDu/mtcnn

該代碼實作了mtcnn python版本:(還沒跑過)

https://github.com/dlunion/mtcnn

繼續閱讀