本文來自《\(S^3\)FD: Single Shot Scale-invariant Face Detector》,時間線爲2017年11月.網絡
基於錨的目標檢測方法,是經過分類和迴歸一系列預先設定的錨來檢測目標的。這裏預先設定的錨一般都是一個個基於不一樣尺度和長寬比的框。這些錨一般都是關聯一層(faster rcnn)或者多層(SSD)卷積層。經過不一樣卷積層的空間尺度和stride大小來決定錨的位置和間隔。關聯錨的網絡層一般是爲了用來分類和對齊這些錨。相比於其餘方法,基於錨的檢測方法在複雜場景下更魯棒,並且他們針對不一樣的對象個數也具備速度不變性(即不會由於圖片中目標個數增長而致使總體計算量增長)。然而,正如《Speed/accuracy trade-offs for modern convolutional object detectors》所述,基於錨的檢測器會隨着目標尺寸的變小,其效果會急劇變差。
架構
爲了獲得一個基於錨的尺度不變人臉檢測器,做者綜合分析了背後的緣由:框架
- 有偏框架:基於錨的檢測框架一般會丟失小型和中型的人臉。首先,最低的關聯錨的層的stride太大了(如SSD中8個像素,Faster rcnn中16個像素 ),所以小型人臉和中型人臉在這些層上就被極度壓縮,從而幾乎沒有特徵以供檢測,如圖1(a);其次,小型人臉,錨的尺度,感覺野互相不匹配:錨的尺度首先和感覺野不匹配,而後他們相對小型人臉而言都太大了,如圖1(b)。爲了處理這樣的問題,做者提出了一個尺度等同的人臉檢測框架。做者在一個範圍內的網絡層上平鋪錨(如SSD),其中stride從4個像素到128個像素,從而保證了人臉的各類尺度都有足夠的特徵以供檢測。同時,基於不一樣層上的感覺野大小,設計錨自己的尺度從16個像素到512個像素,並提出一個等比例區間原則,從而確保不一樣層上的錨可以匹配他們對應的感覺野,並且不一樣尺度的錨點均勻分佈在圖像上。
- 錨匹配策略:在基於錨的檢測框架中,錨的尺度都是離散的(即16,32,64,128,256,512),可是人臉的尺度確是連續的。於是,那些人臉的尺度就會嚴重偏離從而無法很好的匹配錨,好比很是小的,和很是大的,如圖1(c),從而致使召回率很低。爲了提高這些被忽略的人臉的尺度,做者提出了一個基於2階段的尺度補償錨匹配策略。第一個階段就是採用當前的錨匹配方法,不過調整到一個更合理的閾值;第二個階段就是經過尺度補償確保每一個尺度的人臉都有足夠的錨去匹配。
- 小錨的背景:爲了很好的檢測小型人臉,須要許多小的錨密集的平鋪在圖片上,如圖1(d),這些小的錨致使背景上負錨的數量急劇上升,從而帶來許多假陽性人臉。例如,在做者的尺度等同框架中,超過75%的負錨都來自最低的conv3_3層,而這一層是用來檢測小型人臉的。本文基於最低檢測網絡層提出了一個max-out背景標籤,從而減小小型人臉帶來的假陽性比率。
本文的貢獻:ide
- 提出了一個尺度等同人臉檢測框架:基於一個較廣的範圍內去創建錨和卷積層關聯,而且加之一系列合理的錨尺度,一塊兒去處理不一樣尺度的人臉;
- 提出一個尺度補償錨匹配策略去提高小型人臉的召回率;
- 引入一個max-out背景標籤方法,去減小小型人臉的假陽性比例;
- 在AFW,PASCAL face,FDDB,WIDER FACE上達到了實時的效果。
這裏的尺度等同架構也是基於錨的檢測框架,如RPN和SSD。而這些網絡的一個缺點就是隨着目標尺度的變小,其檢測性能急速降低。爲了提高人臉尺度的魯棒性,做者提出了一個有着較廣範圍的錨關聯層的網絡結構,這裏stride從4個像素逐步增加到128個像素。所以,這個架構確保不一樣人臉的尺度在對應的錨關聯層上有合適的特徵用來作檢測。在決定錨的位置後,還設計了基於感覺野和等比例間隔的錨尺度,其從16個像素逐步過渡到512個像素。前面的考慮是爲了保證每一個尺度的錨可以匹配對應的感覺野;後面的考慮是爲了讓不一樣尺度的錨在圖片上有相同的平鋪密度。函數
構建的結構:如上圖的圖2所示性能
- 基礎卷積層:保留VGG16的conv1_1到pool5,移除其餘後續的層;
- 額外卷積層:將VGG16的fc6和fc7經過子採樣的方式構建卷積層,而後在後面增長額外的卷積層,這些層能夠逐漸的下降feature map的尺度,並造成多尺度feature map;
- 檢測卷積層:這裏選擇conv3_3,conv4_3,conv5_3,conv_fc7,conv6_2,conv7_2做爲檢測層,它們都關聯不一樣尺度的錨以供檢測;
- 歸一化層:相比於其餘檢測層,conv3_3,conv4_3,conv5_3有不一樣的特徵尺度,這裏使用L2歸一化的方式去將他們的範數縮放到10.8.5,而後在BP中學習該尺度;
- 預測的卷積層:每一個檢測層後面都跟着一個\(p\times 3 \times 3 \times q\)的卷積層,這裏p 和q 是對應的輸入和輸出的通道數,3x3是核尺度。對於每一個錨,這裏都預測其4個座標的偏移量和對應的\(N_s\)個類別的分類得分,對於conv3_3檢測層,\(N_s=N_m+1\),(\(N_m\)就是後面介紹的max-out背景標籤),而其餘檢測層\(N_s=2\)。
- 多任務loss層:使用softmax loss作分類,使用平滑L1 loss作迴歸。
基於錨設計的尺度:
上述介紹的6個檢測層都關聯一個特定尺度的錨(以下表)
學習
- 有效的感覺野:如《Understanding the effective receptive field in deep convolutional neural networks》指出的,CNN中一個單一有2種類型的感覺野:一種是理論上的感覺野,其表示輸入區域能夠理論上影響該單元的值。然而不是每一個理論感覺野上的像素都可以在最終輸出上有相同的貢獻度。一般而言,中心區域的像素會比外圍像素有更多的影響,如圖3(a)
換句話說,只有部分區域會影響到輸出值;另外一種就叫作有效感覺野,根據該理論,錨應該明顯的小於理論感覺野,從而才能匹配有效感覺野(圖3b);- 等比例間隔原則:一個檢測層的stride決定輸入圖像上錨的間隔。例如conv3_3的stride是4個像素,那麼他的錨應該是16x16,表示一個16x16的錨在輸入圖像上每4個像素會平鋪一個。如表1中第2列和第3列,錨的尺度應該是恰好4倍於它的間隔。這裏稱這種叫等比例間隔原則(圖3c),從而保證不一樣尺度的錨在圖像上有相同的密度,因此每一個尺度的人臉都大體有相同數量的錨。
在訓練中,須要決定哪一個錨對應哪一個人臉邊界框。當前的錨匹配策略首先匹配與人臉IOU最高的那個錨,而後匹配那些與人臉高於閾值(一般是0.5)的錨。然而,錨尺度是離散的,而人臉尺度是連續的,從而錨沒有足夠的數量去匹配全部的尺度的人臉,就致使下降了人臉的召回率。如圖1c,做者統計了下不一樣尺度的人臉能匹配的錨的平均數量。發現兩個結論:優化
- 匹配的錨的平均數量是3,這致使無法得到較高召回率;
- 匹配的錨,高度依賴錨的尺度。
那些尺度偏離錨尺度的人臉都容易被忽略。爲了解決這個問題,做者提出了一個尺度補償錨匹配策略,其中包含2個階段:spa
- 階段1:首先遵循當前的錨匹配方法,不過將閾值從0.5下降到0.35,爲了增長匹配的錨的數量。
- 階段2:通過階段1以後,仍有一些人臉還不夠錨,好比,如圖4a中那些灰點標出的尺度極小和極大的人臉(tiny,outer)。
對於這些人臉,首先抓取那些與該人臉的IOU超過0.1的錨,而後將它們進行排序,選擇前N個匹配的錨(這裏的N就是階段1的平均錨個數)。
如圖4a,這裏的錨匹配策略極大的增長了關於極小和極大的人臉匹配的錨,這明顯增長了這些人臉的召回率。設計
基於錨的人臉檢測模型能夠被認爲是一個二分類問題。而做者發現這是一個不平衡的二值分類問題:按照統計的結果,超過99.8%的預設定錨都屬於負錨(即都是背景),只有一小部分是正錨(即人臉)。這極端的不平衡主要是受到檢測小型人臉的問題引發的。特別的,爲了檢測小臉,須要早圖像上平鋪一堆錨,這致使負錨的數量極端增多。例如如表2,
這部分,介紹下訓練數據集,數據加強,loss函數,硬負樣本挖掘和其餘細節。
訓練數據集:是WIDER FACE數據集;
數據加強:
- 顏色失真:採用一些圖像測度的失真方法, 相似《Some improvements on deep convolutional neural network based image classification》;
- 隨機裁剪:由於有太多小型人臉,因此經過放大操做來生成更大的人臉。特別的,每一個圖片都經過如下5種方式中的一種來完成該部分。裁剪最大的正方形,其餘四種方形圖片塊來自原始圖像最短邊的[0.3,1]倍。這些裁剪圖片塊中都保證人臉區域的中心還在裁剪的塊中;
- 水平翻轉:在隨機翻轉中,選擇的平方塊被resize到640x640,而後以0.5的機率水平翻轉。
loss 函數
採用RPN中定義的多任務loss:
\[L({p_i},{t_i})=\frac{\lambda}{N_{cls}}\sum_iL_{cls}(p_i,p_i^*)+\frac{1}{N_{reg}}\sum_ip_i^*L_{reg}(t_i,t_i^*)\]
這裏\(i\)表示第幾個錨,\(p_i\)表示關於第\(i\)個錨預測人臉的機率。這裏ground-truth標籤若是錨爲正,則\(p_i^*\)是1,不然爲0。\(t_i\)是一個向量,表示預測的邊界框的4個參數化的座標,\(t_i^*\)是關聯一個正錨的ground-truth。分類loss\(L_{cls}(p_i,P_i^*)\)是基於2類的softmax loss。迴歸loss\(L_{reg}(t_i,t_i^*)\)是《Fast r-cnn》中定義的平滑L1 loss,\(P_i^*L_{reg}\)意味着迴歸loss只被正錨激活。這兩項分別被\(N_{cls}\)和\(N_{reg}\)所歸一化,並經過平衡參數\(\lambda\)所權重化。在咱們的實現中,\(cls\)項是經過正錨和負錨的數量歸一化,而\(reg\)項是經過正錨的數量歸一化。由於正錨和負錨之間數量不平衡,因此引入\(\lambda\)進行平衡。
硬負樣本挖掘
在錨匹配過程當中,大多數錨都是負的,這引入一個明顯的正負訓練樣本不平衡的問題。對於更快的優化和更穩定的訓練,須要對負樣本進行採樣,那麼就按照loss進行排序,並挑選排序前面的樣本,保持負正樣本比例3:1。在使用硬負樣本挖掘後,咱們將上面的背景標籤\(N_m=3\),且\(\lambda=4\)來平衡分類和迴歸的loss。
其餘細節 好比參數初始化,這裏急促和卷積層與VGG16採用同樣的結構,他們的參數也是《Imagenet large scale visual recognition challenge》進行預訓練的。conv_fc6,conv_fc7經過VGG16的fc6和fc7進行子採樣來初始化,其餘的額外從經過xavier方式初始化。經過帶有0.9動量的SGD來訓練,權重衰減值爲0.0005,batchsize爲32。最大的迭代次數爲120k,前80k次學習率爲0.001,後20k爲0.0001,而後接下來20k爲0.00001。基於caffe實現。 .