1. 簡介
FaceBoxes是一個足夠輕量的人臉檢測器,由中國科學院自動化研究所和中國科學院大學的研究者提出,旨在實現CPU下的實時人臉檢測,FaceBoxes論文是《FaceBoxes: A CPU Real-time Face Detector with High Accuracy》。里面有一些思路值得大家學習,比如如何對模型進行加速處理,以及多尺度檢測時檢測框的密度不一致的問題~~
提到快速的人臉檢測網絡,MTCNN是一個繞不過去的坎。但是作者羅列了級聯人臉檢測器的幾大不足:
- 檢測速度會受到人臉數量的影響;
- 多階段訓練,過程復雜;
- VGA上速度也就那樣(16fps),也不是很高呀。
針對這些問題,FaceBoxes提出以下幾個創新點:
- 使用RDCL模塊快速降低特征圖大小,為檢測速度提供了保證
- MSCL模塊使用多尺度特征圖預測,解決了多尺度的問題
- 使用anchor稠密化策略提高小臉的召回率
2. 網絡結構
可以看出,這個網絡與SSD網絡有很多相似的地方,但是對SSD算法有了很多的改進,使其更加適應於人臉的檢測!由於目標任務的改變,是人臉,也就是相對於整張圖片一般為小目標,且大多數為等比例的目標,所以與通用的SSD來說,我們的anchor設置比例為1:1,且只從三個層的范圍檢測,預知人臉的尺度比例變化不大~
本節介紹了使facebox在CPU設備上准確和高效的三個貢獻:快速消化卷積層(RDCL)、多尺度卷積層(MSCL)和anchor加密策略。最后,我們介紹了相關的訓練方法。
2.1 快速消化卷積層-RDCL:Rapidly Digested Convolutional Layers
大多數基於CNN的人臉檢測方法通常都受到時間開銷的限制,尤其是在CPU設備上。更准確地說,當輸入、卷積核和輸出的大小都很大時,CPU的卷積運算是非常耗時的。我們RDCL的設計是通過適當的卷積核大小來快速縮小輸入空間大小,減少輸出通道的數量,使CPU設備上的facebox達到實時速度,具體如下:
- 縮小輸入空間大小:快速縮小
輸入的空間大小,我們的RDCL為它的卷積和池化層設置了一系列大的步長。如圖1所示,Conv1、Pool1、Conv2和Pool2的步長分別為4、2、2和2。RDCL的總步長為32,這意味着輸入空間的大小減少了32倍。 - 選擇合適的卷積核大小:卷積核的大小
一個網絡的前幾層應該是小的,以加快速度,同時也應該足夠大,以減輕空間尺寸減小帶來的信息損失。如圖1所示,為了保持效率和效率,我們對Conv1、Conv2和所有池層分別選擇了$77$、$55$和$3*3$個內核大小。 - 減少輸出通道數量:
我們利用C.ReLU激活函數,減少輸出通道的數量。C.ReLU可以通過在應用ReLU之前將負輸出連接起來,將輸出通道的數量增加一倍。使用C.ReLU顯著提高了速度,而精度的下降可以忽略不計。
2.2 多尺度卷積層-MSCL:Multiple Scale Convolutional Layers
該方法以RPN為基礎,在多目標檢測的場景中,RPN作為一種不確定類的檢測器。對於單類檢測任務(如人臉檢測),RPN自然是唯一相關類的檢測器。然而,作為一種獨立的人臉檢測器,RPN無法獲得具有競爭力的性能。我們認為,這種令人不滿意的表現來自兩個方面。首先,RPN中的anchor只與最后一個卷積層相關,該卷積層的特征和分辨率都太弱,無法處理各種大小的人臉。其次,anchor相關層負責檢測一定尺度范圍內的人臉,但它只有一個單一的感受野,無法匹配不同尺度的人臉。為了解決以上兩個問題,我們的MSCL按照以下兩個維度進行設計:
-
沿網絡深度維度進行多尺度設計。
如上圖所示,我們設計的MSCL由多個層組成。這些層的尺寸逐漸減小,形成多尺度特征圖。這些層是一種沿網絡深度維度的多尺度設計,將anchor離散在多個分辨率不同的層上,自然處理不同大小的尺度。
-
沿網絡寬度尺寸進行多尺度設計。
為了學習不同尺度人臉的視覺模式,anchor相關層的輸出特征應該對應不同大小的感受野,這可以通過Inception模塊[34]輕松實現。Inception模塊由多個不同卷積核的卷積分支組成。這些分支作為網絡寬度維度上的多尺度設計,能夠豐富感受野。如上圖所示,MSCL的前三層基於Inception模塊。下圖說明了我們的Inception實現,這是一個性價比高的模塊,可以捕捉不同尺度的人臉。
2.3 Anchor稠密化
類似於SSD算法,我們在不同的feature map上設置anchor box用於檢測目標物體,但是對於目標擁擠的情況,我們就會發現,在網絡底層設置的小anchor顯然非常的稀疏!!!所以我們要對那些底層的小anchor進行一個稠密化的工作,具體就是在每個感受野的中心,也就是SSD中的anchor中心,對其進行偏移。根據其密度大小進行2 、3或4倍的稠密化工作!
anchor密度:
$A_{scale}$表示anchor的尺度,而 $A_{interval}$ 表示anchor的間隔,默認為32、32、32、64、128. 所以5中anchor的密度分別為1,2,4,4,4,顯然出現了密度不均衡的情況,所以我們要對32x32的anchor進行四倍的稠密化,對64x64的anchor進行二倍的稠密化~
3. 網絡訓練
3.1 數據增強
每一幅訓練圖像都采用以下數據增強策略進行順序處理:
- 顏色蒸餾:應用一些光度蒸餾。
- 隨機裁剪: 我們從原始圖像中隨機裁剪五個方形補丁:一個是最大的方形補丁,其他的大小介於原始圖像的短邊尺寸的[0.3,1]之間。 然后我們隨意選擇一個補丁用於后續操作。
- 尺度變換:隨機裁剪后,將選中的正方形patch調整為1024*1024。
- 水平翻轉:調整大小后的圖像水平翻轉的概率為0:5。
- 人臉框過濾:如果人臉框的中心在上述處理過的圖像中,我們保留重疊的部分,然后過濾掉這些高度或寬度小於20像素的人臉框。
- 匹配策略:在訓練中,我們需要確定哪些anchor對應於一個人臉邊界框。我們首先將每個人臉匹配到具有最佳jaccard重疊的錨點,然后將錨點匹配到具有高於閾值(即0.35)。
- 損失函數:我們的損失函數與faster R-CNN中的RPN相同。采用2類softmax損失進行分類,smoothL1損失進行回歸。
3.2 困難負樣本挖掘
在anchor匹配后,大多數anchor都是負樣本,導致正樣本和負樣本嚴重不均衡。為了更快更穩定的訓練,將他們按照loss值排序並選取最高的幾個,保證正樣本和負樣本的比例最高不超過3:1.
3.3 其他實現細節
使用“xavier”方法隨機初始化所有參數。我們以0:9的動量,0.0005的重量衰減和32的batch size對模型進行fine tune。迭代的最大數量是120 k,我們使用$10^{-3}$學習速率的80 k迭代,然后繼續分別訓練了20 k迭代學習率為$10{-4}$和$10{-5}$。
4. 測試
4.1 運行時間效率
基於CNN的方法一直因其運行時效率而受到指責。雖然現有的CNN人臉檢測器可以通過高端gpu加速,但在大多數實際應用中,尤其是基於CPU的應用中,速度不夠快。如下所述,Facebox足夠高效,可以滿足實際需求。
在推理過程中,我們的方法輸出大量的框(如一個vga分辨率圖像的8525個框))。在應用NMS之前,首先以0:05的置信度閾值過濾掉大多數框並保留前400個框,然后執行jaccard重疊為0.3的NMS並保留前200個框。使用Titan X (Pascal)和cuDNN v5.1以及Intel Xeon E5-2660v3@2:60GHz來測量速度。如下表所示,與最近基於cnn的方法相比,Facebox可以在CPU上以每秒20幀的速度運行,具有最先進的精度。
4.2 模型分析
為了更好地理解facebox,我們一個接一個地去除每個組件,以檢查每個提出的組件如何影響最終性能。
- 實驗一:去掉anchor稠密化策略
- 實驗二:使用三個卷積層來代替MSCL,也就是使用單一的感受野
- 實驗三:在RDCL中,使用ReLU來代替CReLU
實驗結論如下: - Anchor加密策略至關重要: anchor加密策略用於增加小anchor的密度(即3232和6464),以提高小人臉的召回率。 從上表中,我們可以看到在消除anchor加密策略后,FDDB上的mAP從96.0%降低到94.9%。 急劇下降(即1.1%)證明了所提出的anchor加密策略的有效性。
- MSCL更好: 表2中第二列和第三列之間的比較表明MSCL有效地將mAP增加1.0%,這取決於不同的感受域和多尺度anchor平鋪機制。
- RDCL是高效且准確的保留: RDCL的設計使FaceBoxes能夠在CPU上實現實時速度。 如上表中所述,RDCL導致精度略微下降,但速度顯着提高。 具體而言,FDDB mAP以大約19.3ms的速度改進而降低0.1%。