人臉檢測算法

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章