重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法

CVer發表於2019-05-24


《Accurate Face Detection for High Performance》

重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法


arXiv: https://arxiv.org/abs/1905.01585

github: None

作者團隊:創新奇智

注:2019年05月18日剛出爐的paper

正文

本筆記記錄人臉檢測演算法 AFD_HP,來自AInnovation Technology Ltd, beijing(創新奇智),和PyramidBox++、VIM-FD、Improved SRN有點類似,都是效能小怪獸,在wider face上排名靠前,引入了現有人臉檢測中很優秀的子模組,所有子模組都能對結果有積極影響(不過文中並沒有消融實驗評估各個子模組的貢獻率),最終效能在wider face上就sota了;

反正我是覺得蠻厲害的,現在大家被優質的論文把眼界調高了,希望演算法不僅有足夠的創新性,還要有強悍的效能,但二者能做到其一也是很難的,特別是這種融合多種現有方案的演算法,不僅要靠自己去實現 + 融合,還得各種試錯和調參,以找到最佳的效能點,而且論文裡展示的都是作者嘗試後有積極效果的方案,背後不知道有多少試錯的工作量呢,恩恩,respect~~~

名詞定義

1 AFD_HP:本文提出的人臉檢測演算法Accurate Face Detection for High Performance,基於1-stage RetinaNet + IoU loss的bbox reg + SRN的 2-step bbox cls、reg策略 + PyramidBox訓練階段的 DAS 資料增強策略 + S3FD的max-out label + multi-scale inference;為了筆記記錄的方便,我做了個簡寫:AFD_HP;

Abstract

1 現有人臉檢測演算法在處理小尺度人臉時,所採用的方案如:新的網路結構、新的loss function等;

2 本文提出AFD_HP,基於1-stage RetinaNet + IoU loss的bbox reg + SRN的 2-step bbox cls、reg策略 + PyramidBox訓練階段的 DAS 資料增強策略 + S3FD的max-out label + multi-scale inference,最終在wider face上sota;

1 Introduction

人臉檢測任務:找出影像中所包含的人臉,並給出bbox的位置資訊;為解決自然場景下的人臉檢測問題,CNN-based方案有很多,如cascade-based的Cascade CNN、MTCNN、FaceCraft等,聯合人臉區域附近上下文資訊的HR、SSH、CMS-CNN等,全新網路結構設計的MSCNN、SRN、FANet等,基於通用目標檢測模型,並結合進一步人臉最佳化策略的Face R-CNN、Face-R-FCN、S3FD、ZCC等,訓練階段採用全新資料增強策略的DSFD、Pyramidbox、Improved SRN等,結合feature map上 attention 機制的FAN、VIM-FD等;

2 Related Work

2.1 Traditional Method

傳統的Adaboost方案:Haar-Like features + cascade face / non-face分類器,當然也有更牛逼特徵 + 分類器的改進;然後各種DPM-based方案用於人臉 / 目標檢測,不過速度比較慢,並且訓練階段可能需要引入其他額外的標註資訊;

整體上就是,不夠魯棒的hand-crafted特徵,及效能比較弱雞的分類器,以及無法做到全域性end2end最佳化的問題;

2.2 Deep Learning Method

基本上囊括了現階段所有人臉檢測演算法,篇幅頗大:

Cascade CNN、FaceCraft的cascade CNN-based方案;

MTCNN、PCN做人臉landmarks / angles的multi-task + 進階人臉檢測方案(coarse-to-fine manner + cascade-style structure);

Faceness:將整個人臉分解成多個人臉器官(5個CNN模型:hair、eyes、nose、mouth、beard),在每個器官上分別訓練一個attribute-aware CNN,再融合score map,對遮擋人臉、大姿態變化人臉檢測效果良好;缺點:需要額外標定人臉屬性;

LDCF+:比較老幹部,使用boosted決策樹的分類器來檢測人臉;

UnitBox:介紹了IoU損失函式,來直接最小化pred bbox與gt bbox間的IoU,以期更精準的bbox定位;

ScaleFace:整體上和SSD有點類似,多層預測face bbox,而且相鄰feature map間還做了融合,在不同feature map上預定義了不同大小的anchor尺度(低層小尺度、高層大尺度);但整體上架構還是走frcnn的路子,有rpn、fast rcnn模組;

SAFD:使用CNN處理人臉尺度的變化,預先根據影像利用CNN算出影像要縮放的尺度,也即SAFD根據檢測出的人臉尺度,僅需resize若干尺度影像,在稀疏取樣的影像金字塔上檢測人臉目標即可,相當於SAFD中的SPN提供了影像中人臉尺度的先驗,可以有針對性的對影像做縮放;

HR:在特徵金字塔上為不同尺度人臉獨立地訓練檢測器,對小尺度人臉結合了上下文資訊的輔助,設定了大尺度感受野的模板;

S2AP:融合了SAFD的思想,SAFD做了尺度分支的預測,以加速人臉的檢測速度,S2AP在SAFD上更進一步,做了空間位置分支的預測,更進一步地提升了人臉檢測速度,也即在尺度、空間兩個維度上減少對人臉檢測的搜尋空間,達到提速目的:

ZCC:提出EMO(Expected Max Overlapping score)概念,來評估anchor與gt bbox的匹配質量;ZCC基於frcnn、ssd的anchor機制,作者認為小尺度人臉檢測不到的主要原因是因為anchor bbox與小尺度人臉的IoU過低,現有基於anchor的人臉檢測器處理尺度不變性並不給力;作者提出了EMO得分來解釋IoU低的原因,並提出了ASR、ESA、FSJ、HFC等策略提升人臉檢測效能;

FaceGANs:透過GANs對小尺度、模糊人臉影像生成清晰地超解析度影像,再結合MB-FCN檢測小尺度人臉;

PCN:cascade-style結構,漸進式校準網路來進行旋轉不變的人臉檢測,PCN包含三個階段(in a coarse-to-fine manner),每個階段做三件事:face/non-face分類、人臉bbox迴歸、人臉偏轉角度計算(stage1、2只做離散分類的角度粗估計、stage3做連續迴歸的角度細估計,對人臉方向校準(stage1、2旋轉人臉180°、90°操作等)屬於後操作,不在校準網路裡面做),使之漸進地校準為一個朝上的人臉;

作者也提到,人臉檢測也受到了通目標檢測演算法的啟發,如frcnn、 R-FCN、SSD、FPN、RetinaNet、RefineDet等;

Face RCNN:在frcnn基礎上,從人臉識別引入center loss至人臉檢測、OHEM、多尺度訓練;

Face R-FCN:在R-FCN基礎上,引入OHEM、空洞卷積、小尺度的anchor、多尺度的訓練與測試策略,並在PSRoI Pooling之後新增了一個PSAverage Pooling;

FaceBoxes:基於SSD、透過anchor密集取樣策略,對淺層feature map檢測的小尺度目標,其對應anchor做更加密集的anchor取樣,使得特徵金字塔不同feature map層的anchor有相同的取樣密度,在CPU端實時;

FANet:提出特徵的層次化聚集網路,在層次特徵金字塔上都聯合了Hierarchical Loss;FANet確實是獨立預測結果的,而且還有feature map間的進階學習、;

S3FD:基於SSD,使用等比例間隔策略 + 基於尺度補償的anchor匹配策略、max-in-out label策略檢測小尺度人臉;

SSH:透過context module,使用疊層conv的思路,透過增大感受野以達到增加上下文資訊目的;

FAN:基於RetinaNet,透過anchor-level的attention機制,突出影像中人臉區域的特徵以檢出遮擋人臉;

PyramidBox:基於SSD,提出DAS、LFPN、CPM、PyramidAnchors,聯合人臉、人頭、頭肩的上下文資訊,輔助人臉檢測;

SRN:single-shot人臉檢測演算法,基於RefineDet,在anchor-based人臉檢測器中引入了two-step的cls + reg任務,並引入了RetinaNet中的focal loss;

VIM-FD、Improved SRN:效能小鋼炮,各種tricks的融合,可參照專欄裡對應的論文;

3 Method

來看看AFD_HP如何一步一步走向sota巔峰的;

3.1 RetinaNet Baseline

介紹了下RetinaNet:

RetinaNet是1-stage的目標檢測演算法,沒有RPN階段,直接在feature map上做密集的anchor取樣(over a regular, dense sampling of possible object locations),速度快;此外,為了解決SSD等1-stage目標檢測演算法中,訓練階段的正負樣本不均衡問題(畢竟RPN還有過濾海量負樣本的作用呀,雖然frcnn中RPN透過粗暴的控制正負樣本比例為1:3做了負樣本過濾),RetinaNet就透過focal loss進一步控制訓練階段的正負樣本比例,效果好,如公式(1)、(2):

重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法

重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法

y ∈ { +1,-1 }:gt label;

p ∈ [ -1,+1 ]:模型預測的label y = 1情形下樣本的機率(model’s estimated probability for the class with label y = 1);

α_t: balanced factor;

γ:可調節的focusing parameter,可參照論文;

focal loss是對傳統cross entropy loss的改進,在訓練階段降低了well-classified examples的loss權重,使得模型更專注於學習少量的難分樣本,避免模型的訓練被海量的易分樣本給主導了;

重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法

AFD_HP整體結構入fig 1,

(a):ResNet-101主幹網提特徵,生成multi-scale的feature map;

(b):FPN-style生成多尺度特徵金字塔,6層(P2 - P7);

(c):分類子網路,A = 2,結合focal loss;

(d):bbox迴歸子網路,使用IoU loss;


3.2 IoU Regression Loss

常規的bbox就是smooth L1 loss啦,該目標函式用於最小化pred bbox + gt bbox間的差距,一般使用IoU作為二者的評估標準;不過IoU loss中提到了,smooth L1 loss和IoU二者其實是“貌神合離”的,二者的最佳化目標並不一致,smooth L1 loss僅僅是為了讓pred bbox儘量靠近gt bbox,而並非把二者IoU最大作為目標(there is a gap between optimizing the commonly used smooth L1 distance losses for regressing the parameters of a bbox and maximizing this IoU metric value,可以參照G-IoU、IoU-Net),然後一句話很值得玩味:optimal objective for a metric should be the metric itself,很經典,總結就是:做事的目標和行為應該要保持一致,既然最終評估指標是IoU,那我們就直接最佳化pred / gt bbox間的IoU,然後就引入了UnitBox中的IoU reg loss,具體可以看看UnitBox論文:

重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法

B_p = (x1、y1、x2、y2) : pred bbox;

B_gt = (x*1、y*1、x*2、y*2):gt bbox;

3.3 Selective Refinement Network

SRN中提到,直接使用RetinaNet用於人臉檢測,會有兩個問題:

1 low recall efficiency:召回率低,為了保持高召回率,檢準效果又不佳了;

2 low location accuracy:bbox定位不準,IoU閾值太高的話,mAP急劇下降;

SRN就引入了STC + STR的操作:

STC:在淺層feature map上做2-step cls操作,以過濾海量simple negatives,以減少subsequent classifier的搜尋空間;---- subsequent classifier指的是STC中的第二個classifier;

重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法

STR:在高層feature map上做2-step reg,對anchor先做一步調整,使得subsequent regressor能獲得更好的初始化位置資訊;---- subsequent regressorr指的是STR中的第二個regressor;

重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法

i:anchor index;

pi / qi、xi / ti:1 / 2-step中bbox對應的pred cls、reg結果;

l*i、g*i:cls、reg對應的gt label;

N_s1 / N_s2:1 / 2-step中的positive anchors的數量;

Ω / Ψ:1-step中,參與cls / reg的樣本集合;

Φ:2-step中,經過1st-step篩選後,輸入2nd-step的anchor集合;

L_FL:sigmoid focal loss;

[l*i = 1]L_r:指示器,表示IoU regression loss僅在positive anchors上操作;


以下引用自Improved SRN:

2.1. Selective Two-step Classification

RefineDet中引入了2-step分類操作,可以理解為基於cascade的2-step分類結構:

1st-step:透過預定義的objectness閾值過濾大部分易分負樣本,減少2nd-step分類器所需處理的樣本量;---- 使用這個操作的出發點為:anchor-based檢測器為檢出小尺度人臉,都會在特徵金字塔的淺層feature map上做anchor的密集取樣,小尺度人臉是保持高召回了,卻帶來了海量false positives,進一步導致了正負樣本數量不均衡;---- 從這點上看,STC就是作用於淺層feature map上的咯;

作者舉了個栗子:在1024 x 1024 pix輸入的SRN中,如果feature map的每個位置上預定義兩個尺度的anchor,最終生成的anchor數量超過300k,但其中正anchor僅有數十個,因此採用2-step的分類操作就很有必要,1st-step先幹掉大部分易分負樣本,2nd-step再進一步解決剩餘的樣本;

但作者也提到,沒必要在所有檢測分支上都使用2-step分類操作,因為P5、P6、P7等高層feature map上anchor的佔比比較小(佔總anchor數量的11.1%),正負樣本數量不均衡的問題會比較輕,且這些層上的特徵更利於檢測大尺度人臉;但P2、P3、P4等淺層feature map不同,anchor數量特別多(佔總anchor數量的88.9%),且特徵的表達能力本身又比較弱,context資訊也不夠,語義資訊又缺乏,因此在這些淺層feature map上使用2-step的分類操作,就會有很好的效果;

因此SRN選擇在C2、C3、C4(1st-step)、P2、P3、P4(2nd-step)上部署STC;從SRN論文的table 1(a)中也可知,STC提升了正負樣本比例,從1/15441提升至1/404,提升了38倍;

此外,SRN在兩階段中都引入了focal loss操作,可以更全面地利用所有樣本,且STC中,兩階段的分類器共享了大部分引數(僅預測的分類分支引數不一樣),因為二者任務相同:都是從 bg 中判別出前景的人臉區域;最終實驗結果如SRN論文中的table 2,可知STC應用於淺層feature map上的效能優於應用於高層feature map上;

STC的loss包含1st-step、2nd-step兩部分:

1st-step的損失函式,關注輸入1st-step前,生成的所有anchor;2nd-step的損失函式,關注經過1st-step篩選後,輸入2nd-step的anchor;最終STC損失函式如下:

重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法

i:mini-batch內的anchor索引;

pi、qi:1st-step、2nd-step兩階段預測anchor i為人臉的置信度得分;

l*i:anchor i對應的gt label;

N_s1、N_s2:1st-step、2nd-step中對應的正anchor數量;

Ω:輸入1st-step前生成的anchor集合;

Φ:經過1st-step篩選後,輸入2nd-step的anchor集合;

L_FL:基於sigmoid focal loss的二分類損失函式(face vs. bg);


2.2. Selective Two-step Regression

1-stage的目標檢測演算法一般僅對bbox做一次邊框調整,作者認為不夠,但cascade rcnn裡又說了,盲目地迭代做multi-step的bbox reg,並不能進一步提升bbox的定位精準度,SRN論文中的table 4中證實了,在淺層feature map上操作兩次bbox reg,精度竟然還下降了,作者認為原因有二:

1 三個淺層featue map本職工作是透過密集取樣的anchor檢測小尺度人臉,這些feature map上特徵本身的表達能力也不夠,因此要其進一步完成bbox迴歸,精準度就顯得不夠了;

2 訓練階段,若讓淺層feature map也參與其不擅長的bbox迴歸任務中,有點沒發揮其特長,導致模型過於關注其產生的reg loss,忽略了其本職工作的cls loss;

基於以上分析,SRN選擇僅在高層P5、P6、P7上使用STR操作,出發點很簡單:低層feature map專注於分類任務,高層feature map充分利用大尺度人臉的高語義資訊,訓練出更適於bbox精準定位的分支;這種divide-and-conquer策略讓整個模型的效率非常之高;---- 那麼整體上,STC、STR就是RefineDet中ARM、ODM的進一步深入探索,非常有利於小尺度人臉的檢測,並過濾海量負樣本anchors;

STR的損失函式也包含了兩部分:

重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法

g*i:anchor i 對應的gt bbox;

xi:anchor i 經過1st-step操作,refine後得到的bbox座標結果;

ti:xi 經過2nd-step操作,refine後得到的bbox座標結果;

ψ:引數1st-step anchor預測的anchor集合;

l*i、Φ:與STC定義相同,不再贅述;

L_r:Smooth L1 loss,與Fast RCNN一致;

[l*i = 1]:正樣本才參與bbox reg loss,負樣本直接忽略;


思考:

那麼STC、STR的分工是怎麼樣的?

重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法

結合fig 2,簡單點說就是,fig 2上半部分箭頭流程,就是1st-step的操作,流程上和SSD的預測操作是類似的;作者提到了,這種只對bbox做一次調整的1-stage檢測演算法,效能弱於對bbox做兩次調整的2-stage檢測演算法,因此就聯合STC、STR引入了對bbox的第二次調整;---- 這就對應fig 2下半部分箭頭流程,就是2nd-step的操作;

但STC、STR將bbox的cls、reg分開做的,STC是對bbox做了第二次分類調整,但STC僅作用於淺層feature map的anchor上,但其主要作用是為了過濾淺層feature map上的海量易分負樣本,不是為了將分類結果調整地更精準;同理,STR是對bbox做了第二次定位調整,但STC僅作用於高層feature map的anchor上,其主要作用是為了讓高層feature map上的anchor定位更精準;

總結:1st-step操作對應於fig 2上半部分箭頭流程,其中包含了對anchor的第一次cls + reg,2nd-step操作對應於fig 2下半部分箭頭流程,其中包含了對anchor的第二次cls + reg,但這次的cls + reg不是一把梭哈,而是分開梭的:第二次的cls用STC來梭,且只在淺層feature map上梭、第二次的reg用STR來梭,且只在高層feature map上梭;

如果從anchor的角度來觀察,P2、P3、P4上的anchor,其生命週期內,要經歷一次bbox reg(1st-step),兩次bbox cls(1st-step + 2nd-step,也即STC);P5、P6、P7上的anchor,其生命週期內,要經歷一次bbox cls(1st-step),兩次bbox reg(1st-step + 2nd-step,也即STR);

3.4 Data Augmentation

在小尺度人臉的檢測中,資料增強的作用還是很重要的,50%機率如SSD中常規的原始尺度影像的randomly expand + crop + flip + photometric distortion,剩餘50%機率使用PyramidBox中的DAS,來豐富訓練樣本的尺度:

1 從訓練影像中隨機選擇一個尺度S_face的人臉bbox_x,就是下面的step 1,那麼PyramidBox中預定義的anchor尺度分別為:s_i = 2^(4+i),i = 0,1,...,5

2 公式

重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法

表示與bbox_x最匹配的anchor尺度的索引,就是step 2;

3 從目標縮放尺度集中隨機選擇一個尺度的索引 i_target:{0,1,...,max(5,i_anchor + 1)},就是step 3;

4 將尺度S_face的人臉bbox_x resize至:S_target = random(Si_target / 2; Si_target * 2) ---- 其實就是step 3中尺度索引對應的anchor尺度,那麼得到的目標尺度:s* = S_target / S_face,就是step 3的後半部分;

5 透過對原圖img1做scale = s* 的縮放img2(step 4),再從img2隨機選擇包含人臉的600 x 600子區域影像img3,就得到anchor-sampled訓練資料,就是step 5;

舉個例子,一看就懂:

step 1 隨機選擇一個人臉,假設其尺度為140 pix,預定義anchor尺度為{16、32、64、128、256} pixel;

step 2 找到與之最匹配的預定義anchor尺度,128 pix;

step 3 從{16、32、64、128、256} pixel中隨機選擇一個目標尺度,如32 pix;

step 4 將包含140 pix人臉的原圖img1,做scale = 32 / 140 = 0.2285的resize,得到img2;---- 這裡我是拿了32 pixel作為目標縮放尺度的基準,但其實不一定,結合步驟4,可以發現其實是random(Si_target / 2; Si_target * 2)中隨機挑選的一個尺度;

step 5 從img2中crop出包含該人臉的640 x 640子影像(上面寫的600 x 600,PyramidBox論文中自我矛盾。。。),即為所求的重取樣訓練影像;

3.5 Max-out Label

max-out label策略起源於ICCV2017_S3FD,作用於S3FD的淺層feature map,以降低為召回小尺度人臉,所做的anchor密集取樣造成的海量負樣本的誤檢(reduce the tiny false positives from bg regions, max-out operation for the bg class),pyramidbox更進一步,將max-out ops操作應用於fg + bg上;AFD_HP也在分類子網路中引入了max-out ops,不僅可以召回更多小尺度人臉,也用於減少false positives;具體地,分類子網路為每個anchor輸出cp + cn維scores,再選擇max{cp}、max{cn}作為正、負人臉的最終score輸出,文中設定cp = cn = 3;---- 可能是多增加了一層線性分類器,能提升模型的分類效能吧;

3.6 Multi-scale Testing

multi-scale testing操作的出發點很直觀:影像中小尺度人臉很多,單個尺度可能無法cover所有情況;

操作細節可以查閱github上S3FD_caffe、pyramidbox_pytorch程式碼,講得蠻清楚的,將多尺度影像依次過模型,得到detected bbox後,再做bbox vote得到最終結果;

4 Experiment

4.1 Experimental Dataset

WIDER FACE:32203張影像,393703個標註人臉bbox,小尺度人臉、遮擋、大尺度表情變化等情況特別多;train / val / test:40% / 10% / 50%的比例,並根據檢測難度將 val / test 劃分為easy、medium、hard三個子集(基於EdgeBox的檢測結果劃分的),三個子集逐步包含(後面子集包含前面子集的所有影像),train / val 提供 gt 標籤,test未提供;

AFD_HP在train上訓練,並在val / test上評估效能;wider face展示如fig 2:

重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法

4.2 Anchor Detail

與SRN一致,預定義的anchor,一個長寬比:1:1.25,兩個尺度:2S + 2√ 2S(S為對應feature map的下采樣尺度),最終feature map上每個位置兩個anchor(A = 2),覆蓋8 - 362 pixels的人臉(1024 × 1024 pixel影像輸入);

正樣本:IoU > θp = 0.7 / 0.5;---- 分別對應SRN中的STC / STR;

負樣本:IoU < θn = 0.3 / 0.4;---- 不在此區間段的anchor直接忽略;

4.3 Optimization Detail

pytorch實現,主幹網ResNet-101在ImageNet上預訓練一波,新增conv層xavier初始化,SGD + momentum,流行的lr warmup strategy,可參照pyramidbox_pytorch程式碼;

4.4 Evaluation Result

重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法


重新整理WIDER Face多項記錄!創新奇智提出高效能精確人臉檢測演算法

wider face上的結果如fig 3,AFD_HP有點厲害的啦,除了test:hard上稍弱於PyramidBox++,其他的都是sota;

消融實驗沒做的啦,沒能評估各個子模組的貢獻率;

5 Conclusion

1 本文提出了人臉檢測演算法AFD_HP,融合了 1-stage的RetinaNet + IoU loss的bbox reg + SRN的 2-step bbox cls、reg策略 + PyramidBox訓練階段的 DAS 資料增強策略 + S3FD的max-out label + multi-scale inference 等優秀的設計,在wider face上 sota;

論文參考

arxiv2019_AFD_HP_Accurate Face Detection for High Performance

https://arxiv.org/abs/1905.01585

程式碼:

暫未公佈(until 2019-05-20);

相關文章