face detection[FaceBoxes]


該文來自《FaceBoxes: A CPU Real-time Face Detector with High Accuracy》。該文時間線是2018年1月
雖然人臉檢測上隨着深度學習的普及,引來了巨大的進步,但是如何在CPU環境下實時的保持高準確度是一個難題,由於高準確度的網絡每每伴隨着大量的計算。本文提出的模型就是如何在CPU環境下依然保持高準確度。爲此Shifeng Zhang提出了FaceBoxes,一個輕量級且強大的網絡結構,其中包含:api

  • 快速消解卷積層(rapidly digested convolutional layers,RDCL);
  • 多尺度卷積層(Multiple Scale Convolutional Layers,MSCL)。

其中RDCL設計用來確保FaceBoxes能在CPU上得到實時的能力;而MSCL爲了豐富不一樣網絡層上的感覺野和離散的錨點以幫助處理不一樣尺度的人臉。同時,提出了一個新的錨增密策略來讓不一樣類型的錨在圖片上都有相同的密度,這明顯的提高了在小人臉上的召回度。提出的檢測器在單CPU核上能夠跑到20FPS,在GPU上能夠跑到125FPS。而且FaceBoxes的速度對於人臉的數量具備不變性。網絡

0 引言

人臉檢測中的挑戰主要來自2個方向:ide

  • 在嘈雜背景下人臉具備較大的視覺變化,須要處理複雜的人臉二分類問題;
  • 搜索空間很大:基於可控時間內,對人臉可能存在的位置以及人臉尺度進行搜索。

如上述兩個問題,因此如何保證明時性,而後網絡結構又不復雜,且高準確度一直是個難點。而以前提出的級聯CNN雖然進一步加速了整個檢測過程,不過其自己仍是有很多問題:函數

  • 檢測速度是相對圖片中人臉的個數的,若是圖片中人臉數量不少,那麼總體速度就會降低了;
  • 該方法在訓練的時候是幾個網絡單獨訓練的,從而讓訓練變得相對複雜,並且最後輸出的哦模型不是最優的;
  • 對於VGA分辨率的圖片,在CPU上運行的效率是14FPS,仍是趕不上實時的速度。

受到Faster RCNN中的RPN和SSD的多尺度機制的啓發,做者提出了一個能在CPU上跑出實時的模型,叫FaceBoxes。其只包含一個全卷積網絡,且能end to end的訓練
性能




如圖1,其中包含快速消融卷積層(RDCL)和多尺度卷積層(MSCL)。因此本文的主要貢獻:

  • 設計了RDCL用來確保CPU上的實時性;
  • 引入了MSCL用來豐富不一樣網絡層上的感覺野和離散錨從而處理多尺度的人臉;
  • 提出了一個新的錨增密策略來提高小臉的召回率;
  • 讓AFW, PASCAL人臉,FDDB數據集上的最好結果又提高了。

1 結構

1.1 快速消解卷積層 RDCL

RDCL設計之初就是爲了快速將圖像的尺度將下去,並相對其餘網絡減小通道數,從而確保FaceBoxes可以實時:學習

  • 快速下降輸入的空間尺度:經過在卷積層和池化層引入一系列大strides,如圖1所示,Conv1,Pool1,Conv2和Pool2的stride分別是4,2,2,2.總的RDCL是32,意味着輸入圖片的空間尺度被減少了32倍;
  • 選擇合適的核尺度:網絡中最開始的層上核尺度應該是小的,從而才能加速。同時它也應該足夠大,以減輕空間尺寸減少帶來的信息損失。如圖1,爲了儘量保持高效,在Conv1,Conv2,Conv3上分別選擇7x7,5x5,3x3的卷積核;
  • 減小輸出的通道數:這裏利用C.ReLU激活函數(如圖2(a)),去減小輸出的通道數。C.ReLU是來自CNN的觀察,其中較低層中的濾波器會造成對(即濾波器具備相反相位)。 根據這一觀察,C.ReLU能夠經過在ReLU以前簡單地concatenating否認的輸出來使輸出通道的數量加倍。 使用C.ReLU可顯着提升速度,並且精度基本沒降低。

1.2 多尺度卷積層 MSCL

RPN原來是基於多類別目標檢測提出的,而人臉檢測就是個單類別。而做爲獨立的人臉檢測器,RPN並不能提供很高的性能。做者認爲這樣的現象主要來自兩個方面:spa

  • RPN中的錨只與最後的卷積層相關聯,而一層卷積層含有的特徵和分辨率對於抓取不一樣尺度的人臉來講太弱了;
  • 一個關聯錨的層(RPN層)須要負責在一個尺度範圍內檢測人臉,可是一個感覺野(此時是基於一個劃窗位置上,這裏參考faster rcnn的RPN部分)並不能匹配不一樣尺度的人臉。

爲了解決上述2個問題,MSCL主要遵循下面2個維度:設計

  • 基於網絡深度的多尺度設計:如圖1,MSCL包含幾層,這些層在尺寸上是逐步減少的,所以造成一個多尺度feature map。如SSD,這裏默認的錨是關聯着多尺度feature map(即,Inception3,Conv3_2,Conv4_2)。這些層就如基於網絡深度這個維度上進行的多尺度設計,基於不一樣分辨率的多層去分散錨可以處理不一樣尺度的人臉;
  • 基於網絡寬度的多尺度設計:爲了學習不一樣尺度人臉的模式,關聯錨的層的輸出特徵應該對應不一樣尺度的感覺野,這能夠容易的經過Inception模塊去實現。Inception模塊包含不一樣核的多個卷積分支。這些分支做爲網絡寬度上的多尺度設計,如圖1中,MSCL前三個層都是基於Inception實現的。圖2(b)詳細介紹了Inception模塊,用於捕捉不一樣尺度的人臉。

1.3 錨增密策略

如圖1,這裏引入的是1:1的默認錨(即平方錨),由於人臉大多都是正方形的。Inception3層中錨的尺度分別是32,64,128;而Conv3_2和Conv4_2層上錨的尺度分別是256和512個像素。
圖像上錨點的平鋪間隔等於相應關聯錨的層的stride大小。例如,Conv3_2的stride是64個像素,他對應的錨是256x256,表示對於輸入圖片上每64個像素點就有256x256的一個錨。這裏定義錨的平鋪密度(即\(A_{density}\)):
\[A_{density}=A_{scale}/A_{interval}\]
這裏\(A_{scale}\)是錨的尺度,\(A_{interval}\)是錨的平鋪間隔。這裏默認錨的平鋪間隔是32,32,32,64,128。按照上面的式子,對應的密度是1,2,4,4,4。很明顯的,這裏錨的不一樣尺度之間存在平鋪密度不平衡的問題。相對與大錨(如128x128,256x256,512x512),小錨(如32x32,64x64)太稀疏了,這致使小臉的低召回率。3d

爲了消除這種不平衡,提出了一個新的錨增密策略。特別的,爲了增密一個類型的錨n次,咱們在一個感覺野的中心周圍均勻平鋪\(A_{number}=n^2\)個錨,而不是隻平鋪一個錨。如圖3
blog


爲了提高小錨的平鋪密度,做者的策略是使用32x32的錨4次,64x64的錨2次,這保證了不一樣尺度的錨有相同的密度(即 4),因此不一樣尺度的人臉就能匹配差很少相同數量的錨。

1.4 訓練

這裏介紹了訓練數據集,數據加強,匹配策略,loss函數,硬負樣本挖掘,和其餘技術細節。
訓練數據集:WIDER FACE
數據加強:每一個圖片都經歷下面的策略:

  • 顏色失真:如《Some improvements on deep convolutional neural network based image classification》中的照片失真方法;
  • 隨機裁剪:從原始圖片中隨機裁剪5個圖片:一個是最大的平方塊,其餘的是基於最短邊的[0.3,1]的尺寸。而後從這5張中隨機挑一張給後續處理流程;
  • 尺度變化:將裁剪後的圖片resize成1024x1024;
  • 水平翻轉:將resize以後的圖片以0.5的機率水平翻轉;
  • 人臉框過濾:保留那些人臉框的中心還在的圖片;將那些人臉框的高或者框小於20的圖片刪掉。

匹配策略:在訓練中,須要檢測哪一個錨對應哪一個人臉框。首先匹配最高IOU值的錨,而後匹配那些IOU高於0.35的錨;
loss 函數:如faster rcnn中的RPN的loss,這裏基於二值softmax作人臉分類,用L1平滑loss作迴歸。
硬負樣本挖掘:在錨匹配以後,大部分都是負的,這時候會形成正負樣本失衡,因此基於loss進行排序,挑選最高的那些,保證負正樣本比例爲3:1
其餘策略:採用xavier方法初始化,用帶有0.9動量的SGD作迭代,權重衰減的係數爲0.0005,batchsize爲32.最大的迭代次數爲120k,採用基於錢80k的迭代,採用0.001做爲學習率;基於後面的20k,20k次,分別採用0.0001和0.00001做爲學習率。並基於caffe實現。

.

相關文章
相關標籤/搜索