face detection[PyramidBox]



本文來自《PyramidBox: A Context-assisted Single Shot Face Detector》,是來自百度的作品,時間線為2018年8月。

0 引言

最近基於錨的檢測框架都是為了檢測無約束條件下難檢測的人臉,比如WIDER FACE,SSH,\(S^3FD\)等等都提出了尺度不變網絡的單一網絡結構,從不同的網絡層獲取不同的size來檢測人臉。Face R-FCN重新權重化得分map上的響應值,並通過一個位置敏感平均池化消除不同人臉位置帶來的非均勻分布影響。FAN提出一個錨級別的注意力機制,高亮人臉區域並檢測遮擋的人臉。

雖然這些網絡都提出一個設計錨的方法和對應網絡去檢測不同尺度的人臉,可是如何使用上下文信息去做人臉檢測還是未被得到足夠的重視,而這對於檢測難檢測的人臉而言卻十分有幫助。如圖1.

可以發現人臉從來都不是孤立存在於真實世界,通常會伴隨肩膀或者身體,這在因為低分辨率,模糊和遮擋等場景下,人臉紋理不足以做判斷的時候可提供豐富的上下文關聯信息。這里作者通過引入一個上下文關聯網絡去使用上下文信息:

  • 首先,網絡應該學習不止人臉的特征,而且還有包含頭和身體的上下文部分。為了達到這個目的,需要額外的標簽,並且也需要設計對應的錨。本文中,作者使用了半監督方法去生成人臉上下文部分的相似標簽和一系列錨,這里稱其為Pyramid Anchors,且該錨也很容易加入到普通基於錨的結構中。
  • 然后,high-level的上下文特征應該與low-level的特征適當結合起來。難檢測和易檢測的人臉外觀通常是不同的,這意味着不是所有的high-level語義特征都對更小目標的檢測有幫助。作者調研了特征金字塔網絡(feature pyramid network)並將其修改為low-level特征金字塔網絡(low-level feature pyramid network),以將相互有作用的特征聚合在一起。
  • 預測的分支網絡應該充分使用聯合的特征。這里引入上下文敏感預測模塊(context-sensitive prediction module,CPM)並與一個更寬更深的網絡相結合,從而能夠合並目標人臉周圍的上下文信息。同時,在預測模塊上提出一個max-in-out層,以此提升分類網絡的能力。
  • 提出一個訓練策略叫data-anchor-sampling,調整了訓練數據集上的分布。並通過數據增強的方式來增加難檢測樣本的多樣性,以此獲取更具表征的特征。

本文貢獻:

  • 提出一個基於錨的上下文輔助方法,PyramidAnchors,在為了檢測小型,模糊和遮擋人臉上引入有監督信息去學習上下文特征;
  • 設計一個low-level的特征金字塔網絡,更好的融合上下文特征和人臉特征。同時提出的方法可以在單次前向傳播中很好的處理不同尺度的人臉;
  • 引入一個上下文敏感預測模塊,由一個混合網絡結構和max-in-out層組成,以從融合的特征中學習准確的位置和類別;
  • 提出一個尺度敏感數據-錨-采樣策略,改變訓練樣本的分布,更注重小型人臉;
  • 在FDDB和WIDER FACE數據集上獲得最好的效果。

1 結構

1.1 網絡結構

基於錨的目標檢測架構往往伴隨着精妙的錨設計。同時大量的工作證明可以通過在不同層級的feature map上預測多尺度人臉。同時FPN結構着重將high-level特征與low-level特征相融合。如圖2


PyramidBox的結構也使用VGG16作為基底骨干網絡,如\(S^3FD\)一樣的錨尺度設計,即在不同層級上生成feature map和等比例間隔的錨。低層級FPN加在該基底骨干網絡上,然后上下文敏感預測模塊作為每個金字塔檢測層的一個分支網絡,從而得到最終的輸出。關鍵在於作者設計了一個新穎的金字塔錨方法,能夠在不同level的每個人臉上生成一系列錨。

尺度等同的基底網絡層(Scale-equitable Backbone Layers)
這里使用\(S^3FD\)中的基底網絡和額外卷積層作為本文中模型的基底層,保留了VGG的conv1_1到pool5,然后將fc6和fc7變成conv_fc層,然后增加額外的卷積層讓整個網絡變得更深。

低層級特征金字塔層(Low-level Feature Pyramid Layers)
為了提升人臉檢測關於不同size人臉的效果,高分辨率的low-level特征扮演着十分重要的角色。因此別人的工作都在同一個網絡結構中構建不同的子結構去檢測不同尺度的人臉。其中high-level的特征被設計成檢測大人臉,而low-level的特征可以檢測小人臉。為了將high-level的語義特征融入高分辨率的low-level網絡層中,FPN提出了一個自上而下結構,在所有的尺度(scale)上使用high-level語義feature map。近來,FPN類型的框架在目標檢測和人臉檢測上都獲得了很好的反響。
幾乎所有這種構建FPN的工作都開始於最頂層。當然不是所有high-level特征都有助於小型人臉的檢測。

  • 首先,人臉都是很小的,模糊的,遮擋的,不同於那些大的,清晰的,完整的人臉紋理。所以簡單的直接將所有high-level特征拿去做小型人臉檢測的輔助增強是不可取的;
  • 其次,high-level特征部分基本沒有了人臉紋理信息,同時還會引入噪音信息。例如,在本文的PyramidBox的基底層中,頂層兩層conv7_2和conv6_2的感受野分別是724和468。注意到輸入的訓練圖片大小是640,這意味着頂層兩層包含太多噪音上下文特征,所以對於檢測中型和小型人臉就沒多大幫助。

作者建立了個低層級特征金字塔網絡,從一個中間層開始構建一個自上而下的結構,其中感受野應該接近一半輸入圖片的size,而不是接近頂層的size。LFPN的每個塊結構(和FPN中一樣),如圖3a。



金字塔檢測層(Pyramid Detection Layers)
這里選擇lfpn_2,lfpn_1,lfpn_0,conv_fc7,conv6_2,conv7_2作為檢測層,其中錨的size分別為16,32,64,128,256,512.這里lfpn_2,lfpn_1,lfpn_0都是LFPN基於conv3_3,conv4_3,conv5_3的輸出層。相似於SSD結構,這里使用L2歸一化縮放LFPN層的范數。

預測層(Predict Layers.)
每個檢測層后面跟一個上下文敏感預測模塊(context-sensitive predict module,CPM),注意到CPM的輸出是用來做監督金字塔錨(supervising pyramid anchors)的,而這近似覆蓋一個人臉,頭,身體區域。第\(l_{th}\)個CPM的輸出尺寸是\(w_l\times h_l \times c_l\),這里\(w_l=h_l=640/2^{2+l}\)是對應的特征size,通道size\(c_l\)等於20(\(l=0,1,...5\))。每個通道的特征用來做人臉,頭,身體的分類和回歸,其中人臉的分類需要4(\(=cp_l+cn_l\))個通道,\(cp_l\)\(cn_l\)是前景和背景的max-in-out,即:

\[cp_l=\begin{cases} 1, & \text{if } l=0, \\ 3, & otherwise \end{cases}\]

而頭和身體的分類需要2個通道(二分類),每個人臉,頭,身體需要4個通道去定位(4個坐標)。

PyramidBox loss層
對於每個目標人臉,一系列金字塔錨同時去監督分類任務和回歸任務。作者設計了一個金字塔loss,其中softmax loss做分類,平滑L1 loss做回歸。

1.2 上下文敏感預測模塊

預測模塊
在最開始的基於錨的檢測器中,如SSD和YOLO,其中的目標函數是直接基於選擇的feature map上計算的,而如MS-CNN中所述,增強每個任務中的子網絡可以提升准確度。近來的SSH通過在頂層放置一個不同stride的更寬卷積預測模塊增大感受野。DSSD在每個預測模塊上增加殘差塊。的確,SSH和DSSD可以讓預測模塊變得更深和更寬,所以預測模塊在分類和定位上能得到更好的效果。
受到Inception-ResNet可以獲得更深更寬的模型啟發,因此設計上下文敏感預測模塊,如圖3b,其中將SSH中的上下文模塊中的卷積層替換成DSSD中的residual-free預測模塊。這可以讓CPM獲得所有DSSD模塊的好處,同時保留SSH上下文模塊中的上下文信息。

max-in-out
Maxout的概念首次是被GoodFellow提出的,\(S^3FD\)應用max-out背景標簽去減少小的負樣本的假陽性比例。在本文中,作者在正樣本和負樣本上都采用了該方法,稱其為max-in-out,如圖3c。首先對每個預測模型預測\(c_p+c_n\)得分,然后選擇\(\max c_p\)作為正得分。相似的,選擇\(\max c_n\)作為負得分。本實驗中,因為小型人臉有更多完整的背景,第一個預測模塊中\(c_p=1\),\(c_n=3\),而對於其他預測模塊為了召回更多人臉,\(c_p=3\),\(c_n=1\)

1.3 金字塔錨 PyramidAnchors

最近基於錨的目標檢測和人臉檢測獲得了巨大成功,這證明了每個尺度上平衡的錨有助於檢測小型人臉,但是在每個尺度上仍然忽略了上下文特征,因為所有的錨都設計用於人臉區域。為了解決該問題,作者提出了一個新的錨方法,叫做PyramidAnchors。
對於每個目標人臉,PyramidAnchros基於人臉周邊(如頭,肩膀和身體)包含上下文信息的區域生成一系列錨。作者在選定的網絡層上設定一系列錨去匹配這些區域,其會監督higher-level網絡層學習對lower-level尺度人臉具有更表征的特征。給定額外的頭,肩膀和身體的標簽,可以加速匹配ground-truth的錨生成loss。可是添加額外的標簽也是很麻煩的,所以通過半監督的方式去實現。其中有個前提假設是:同樣長寬比和偏移量的人臉區域擁有相似的上下文特征。
也就是說,我們可以使用一組統一的框來近似頭部,肩部和身體的實際區域,只要這些框中的特征在不同的人臉之間是相似的。對於在原圖中\(region_{target}\)區域上定位的目標人臉,考慮第\(i\)個特征層上第\(j\)個錨\(anchor_{i,j}\),其stride為\(s_i\),我們定義第\(k\)個金字塔錨的標簽為:

\[label_k(anchor_{i,j})=\begin{cases} 1, & \text{if iou($anchor_{i,j}\cdot s_i/s_{pa}^k$, $region_{target}$)>threshold}, \\ 0, & \text{otherwise} \end{cases}\]

這里\(k=0,1,...,K\),其中\(s_{pa}\)是金字塔錨的stride。\(anchor_{i,j}\cdot s_i\)表示錨\(anchor_{i,j}\)對應原圖上的區域,\(anchor_{i,j}\cdot s_i/s_{pa}^k\)表示通過\(s_{pa}^k\)下采樣的區域,其中threshold與其他基於錨的檢測器值一樣。同時下面會介紹PyramidBox的loss。
在本實驗中,因為毗鄰的預測模塊的stride是2 所以\(s_{pa}=2\).且\(threshold=0.35,K=2\)\(label_0\)\(label_1\)\(label_2\)分別是人臉,頭和身體的標簽。可以發現一個人臉會在三個連續的預測模塊中生成3個目標,分別表示人臉本身,人臉對應的頭和身體。圖4 就是個例子

得益於PyramidBox,這里的人臉檢測器可以更好的處理小的,模糊的,遮擋的人臉。而且這的金字塔錨是沒有額外label的情況下自動生成的,這種半監督學習方法有助於PyramindAnchors提取近似的紋理特征。在預測階段,只使用人臉分支網絡的結果,所以也沒有額外的計算代價。

1.4 訓練

這里介紹下訓練的數據集,數據增強,loss函數和其他細節
訓練數據集
WIDER FACE,包含了顏色失真,隨機裁剪,和水平翻轉

data-anchor-sampling
數據采樣是個經典的統計,機器學習,模式識別中的話題,近些年該方法也得到了廣泛的關注。對於目標檢測任務,Focus Loss通過reshap標准的交叉熵loss來解決類別不平衡的問題。
這里作者采用了一個數據增強采樣方法叫做data-anchor-sampling。簡單而言,該方法是通過reshape一個圖片中的隨機人臉到一個隨機的更小的錨尺度。具體點,首先選擇一個尺度為\(s_{face}\)的人臉,然后如之前提到的在PyramidBox中的錨尺度:

\[s_i=2^{4+i},for\, i=0,1,...,5$$. 這里$i_{anchor}=argmin_iabs(s_{anchor_i}-s_{face})$表示基於選定的人臉最接近的錨的尺度,然后從下面集合中隨機選擇一個索引$i_{target}$: $$\{0,1,...,min(5,i_{anchor}+1)\}\]

最后,resize 尺度為\(s_{face}\)的人臉到

\[s_{target}=random(\frac{s_{i_{target}}}{2}, s_{i_{target}}*2) \]

因此,圖片的resize尺度是

\[s^*=s_{target}/s_{face} \]

通過對圖片進行\(s^*\)尺度的resize,然后隨機的裁剪包含隨機選定人臉的一個640x640的圖片,就得到了一個錨采樣的訓練數據。例如,首先隨機選定一個人臉,假設其size為140,然后選擇最近的錨尺度,假設為128。然后從16,32,64,128,256中選擇一個目標尺度。假設選擇了32,那么縮放原圖的尺度因子為32/140=0.2285。最后,從resize之后的圖片中裁剪一個包含最初選定的人臉的640x640的圖片塊,這樣就得到了采樣的訓練數據。
如圖5所示,





data-anchor-sampling改變了訓練數據集的分布:

  • 小型人臉的比例大於大型人臉的;
  • 通過大型人臉中生成小型人臉,增加了更小尺度人臉樣本的多樣性

PyramidBox Loss
作為《Fastr-cnn》中多框損失的一個泛化方式,作者在每個圖片上采用PyramidBox Loss,定義如下:

\[L(\{p_{k,i}\},\{t_{k,i}\})=\sum_k\lambda_kL_k(\{p_{k,i}\},\{t_{k,i}\}) \]

這里第\(k\)個金字塔錨loss的定義為:

\[L_k(\{p_{k,i}\},\{t_{k,i}\})=\frac{\lambda}{N_{k,cls}}\sum_{i_k}L_{k,cls}(p_{k,i},p_{k,i}^*)+\frac{1}{N_{k,reg}}\sum_{i_k}p_{k,i}^*\, L_{k,reg}\, (t_{k,i},t_{k,i}^*) \]

這里\(k\)是金字塔錨的索引(k=0,1,2分別表示人臉,頭和身體),\(i\)是錨的索引,\(p_{k,i}\)是第\(k\)個目標(人臉,頭,身體)的第\(i\)個錨的預測概率。ground-truth標簽定義為:

\[ p_{k,i}^* = \begin{cases} 1, & \text{if the anchor down-sampled by stride $s_{pa}^k$ is positive;} \\ 0, & \text{otherwise} \end{cases} \]

例如,當\(k=0\),這里的ground-truth 標簽等於fast rcnn中的標簽,而當\(k\geq 1\),可以通過介於下采樣錨和ground-truth人臉之間的匹配來決定對應的標簽。而且\(t_{k,i}\)是一個向量,對應預測邊界框的4個參數化的坐標,\(k_{k,i}^*\)是關聯正錨的ground-truth框,定義為:

\[t_{k,i}^*=(t_x^*+\frac{1-s_{pa}^k}{2}t_w^*s_{w,k}+\Delta_{x,k},\, t_y^*+\frac{1-s_{pa}^k}{2}t_h^*s_{h,k}+\Delta_{y,k},\, s_{pa}^kt_w^*s_{w,k}-2\Delta_{x,k},\, s_{pa}^kt_h^*s_{h,k}-2\Delta_{y,k}) \]

這里\(\Delta_{x,k}\)\(\Delta_{y,k}\)是偏移的偏移量,\(s_{w,k}\)\(s_{h,k}\)是關於寬度和高度的縮放因子。本文中

  • \(k<2\)時,\(\Delta_{x,k}=\Delta_{y,k}=0\),\(s_{w,k}=s_{h,k}=1\)
  • \(k=2\)時,\(\Delta_{x,2}=0, \Delta_{y,2}=t_h^*\),\(s_{w,2}=\frac{7}{8},s_{h,2}=1\)

分類loss\(L_{k,cls}\)是基於二分類的log loss(有人臉還是沒有人臉),回歸分類\(L_{k,reg}\)是平滑L1 loss,與《Faster-cnn》中定義的一樣。這里\(p_{k,i}^*L_{k,reg}\)表示只由正錨激活的回歸loss。這兩項分別被\(N_{k,cls}\)\(N_{k,reg}\)所歸一化,且通過\(\lambda\)\(\lambda_k\)進行平衡,其中\(k=0,1,2\)

優化
正如參數初始化,PyramidBox使用VGG16預訓練的參數,其中conv_fc67和conv_fc7是通過VGG16的fc6和fc7進行子采樣得到的,其他層是通過xavier方式隨機初始化。一共迭代120k次,前80k次學習率為0.001,后20k次學習率為0.0001,接着20k次學習率為0.00001,batchsize為16其中動量為0.9,權重衰減超參數為0.0005。
.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM