該文來自《FaceBoxes: A CPU Real-time Face Detector with High Accuracy》。該文時間線是2018年1月
雖然人臉檢測上隨着深度學習的普及,引來了巨大的進步,可是如何在CPU環境下實時的保持高准確度是一個難題,因為高准確度的網絡往往伴隨着大量的計算。本文提出的模型就是如何在CPU環境下依然保持高准確度。為此Shifeng Zhang提出了FaceBoxes,一個輕量級且強大的網絡結構,其中包含:
- 快速消解卷積層(rapidly digested convolutional layers,RDCL);
- 多尺度卷積層(Multiple Scale Convolutional Layers,MSCL)。
其中RDCL設計用來確保FaceBoxes能在CPU上獲得實時的能力;而MSCL為了豐富不同網絡層上的感受野和離散的錨點以幫助處理不同尺度的人臉。同時,提出了一個新的錨增密策略來讓不同類型的錨在圖片上都有相同的密度,這明顯的提升了在小人臉上的召回度。提出的檢測器在單CPU核上可以跑到20FPS,在GPU上可以跑到125FPS。並且FaceBoxes的速度對於人臉的數量具有不變性。
0 引言
人臉檢測中的挑戰主要來自2個方向:
- 在嘈雜背景下人臉具有較大的視覺變化,需要處理復雜的人臉二分類問題;
- 搜索空間很大:基於可控時間內,對人臉可能存在的位置以及人臉尺度進行搜索。
如上述兩個問題,所以如何保證實時性,然后網絡結構又不復雜,且高准確度一直是個難點。而之前提出的級聯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並不能提供很高的性能。作者認為這樣的現象主要來自兩個方面:
- 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_{scale}\)是錨的尺度,\(A_{interval}\)是錨的平鋪間隔。這里默認錨的平鋪間隔是32,32,32,64,128。按照上面的式子,對應的密度是1,2,4,4,4。很明顯的,這里錨的不同尺度之間存在平鋪密度不平衡的問題。相對與大錨(如128x128,256x256,512x512),小錨(如32x32,64x64)太稀疏了,這導致小臉的低召回率。
為了消除這種不平衡,提出了一個新的錨增密策略。特別的,為了增密一個類型的錨n次,我們在一個感受野的中心周圍均勻平鋪\(A_{number}=n^2\)個錨,而不是只平鋪一個錨。如圖3
為了提升小錨的平鋪密度,作者的策略是使用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實現。
.