人臉檢測:RetinaFace
論文:https://arxiv.org/pdf/1905.00641.pdf
程式碼:https://github.com/deepinsight/insightface/tree/master/RetinaFace
Pytorch復現:https://github.com/biubug6/Pytorch_Retinaface
RetinaFace於19年5月份出現,當時取得了state-of-the-art,可以說是目前開源的最強人臉檢測演算法。
一、論文簡介
RetinaFace,它利用聯合監督和自我監督的多工學習,在各種人臉尺度上執行畫素方面的人臉定位。
(1)在WIDER FACE資料集上手動註釋五個面部標誌,並在這個額外的監督訊號的幫助下觀察硬麵檢測的重要改進。
(3)在WIDER FACE硬測試裝置上,RetinaFace的效能優於現有技術平均預測(AP)1.1%(達到AP等於91.4%)。
(4)在IJB-C測試集上,RetinaFace使最先進的方法(ArcFace)能夠改善他們在面部驗證中的結果(FAR = 1e-6的TAR = 89.59%)。
(5)通過採用輕量級骨幹網路,RetinaFace可以在單個CPU核心上實時執行,以實現VGA解析度的顯示。
————————————
FAR(False Accept Rate)表示錯誤接受的比例
TAR(True Accept Rate)表示正確接受的比例
————————————
創新點
1、整合:人臉檢測、人臉對齊、畫素級的人臉分析、3D密集通訊迴歸。
2、通過利用強監督和自監督多工損失函式來實現上述功能。
3、基於單階段設計,提出了一種名為RetinaFace的新型畫素智慧人臉定位方法,該方法採用多工學習策略同時預測人臉分數,面部框,五個點和三維位置。
4、Mesh Decoder使用圖卷積神經網路進行加速
二、 網路結構
RetinaFace的想法如圖1所示。
由上圖可以看到,RetinaFace的detect head有四個並行的分支:人臉分類,框迴歸,關鍵點檢測和人臉畫素的三維位置和對應關係。
一共有四個模組,分別是Backbone,FPN,Context Module和Multi-task Loss。其中Multi-task Loss對應圖1的四個並行分支Loss。
下面根據程式碼直觀展示RetinaFace的整體結構,我借鑑大佬@茴香豆502的圖片,如有侵權,請聯絡刪除
三、Implementation details
3.1 FPN
RetinaFace採用從P2到P6的特徵金字塔層,其中P2到P5通過使用自頂向下和橫向連線計算相應的ResNet殘差階段(C2到C5)的輸出。P6是在C5處通過一個步長2的3x3卷積計算得到到。C1-C5是在ImageNet-11k資料集上預先訓練好的ResNet-152[21]分類網路,P6是用“Xavier”方法隨機初始化的。
3.2 Context Module
RetinaFace在五個特徵金字塔層應用單獨的上下文模組來提高 感受野並增加剛性上下文建模的能力。從2018年 WIDER Face 冠軍方案中受到的啟發, 我們也在橫向連線和使用可變形卷積網路(DCN)的上下文模組中替換所有 3x3的卷積,進一步加強非剛性的上下文建模能力。
SSH網路的檢測模組,將一個上下文模組與conv疊加後生成分類頭和迴歸頭得到網路的輸出。
上下文模組的作用是擴張預檢測區域的上下文資訊。
3.3 Multi-task Loss
對於任何訓練的anchor i,RetinaFace的目標是最小化下面的多工的 loss:
- Lcls:人臉分類loss,這裡的pi是anchor i為人臉的預測概率,對於pi * 是1是positive anchor,0代表為negative anchor。分類loss Lcls採用softmax loss,即softmax loss在二分類的情況(人臉/非人臉)的應用。
- Lbox:人臉框迴歸loss,這裡的ti={tx,ty,tw,th},ti * ={tx *,ty *,tw * ,th *}分別代表positive anchor相關的預測框和真實框(ground-truth box)的座標。我們按照 Fast r-cnn的方法對迴歸框目標(中心座標,寬和高)進行歸一化,使用Lbox(ti,ti *)=R(ti-ti *),這裡R 是 smooth-L1 Loss
- Lpts:人臉關鍵點回歸loss,五點,這裡li={l x1,l y1,…l x5,l y5},li *={l x1 *,l y1 *,…l x5 *,l y5 *}代表預測的五個人臉關鍵點和基準點(ground-truth)。五個人臉關鍵點的迴歸也採用了基於anchor中心的目標歸一化。
Lpixel:自監督3D Mesh Renderer稠密人臉迴歸
loss調節引數 λ1-λ3 設定為0.25,0.1和0.01,這意味著在監督訊號中,RetinaFace增加了邊界框和關鍵點定位的重要性。
3.4 anchors設定
如上表所示,RetinaFace從P2到P6的特徵金字塔級別上使用特定於比例的錨點,例如[56]。 在這裡,P2旨在通過平鋪小anchors來捕獲微小的面部,但要花費更多的計算時間,並且要冒更多的誤報風險。RetinaFace將scale step設定為2^(1/3),aspect ratio設定為1:1。輸入影象大小為 640*640 , anchors可以 覆蓋 從16x16 到 406x406的特徵金字塔層。從五個下采樣(4,8,16,32,64)的feature map平鋪anchors,每個feature map中的點預測3個anchors,總共有(160 * 160 + 80 * 80+40 * 40+400+100) * 3 = 102300個anchors,其中75%來自P2。不過在程式碼中,只用了8,16,32這三個下采樣層的輸出feature map,且每個點只放兩個anchors。
所以,對於640 * 640的輸入,32,16,8的下采樣輸出,每個點的輸出是【(1,4,20,20),(1,8,20,20),(1,20,20,20)】,【(1,4,40,40),(1,8,40,40),(1,20,40,40)】,【(1,4,80,80),(1,8,80,80),(1,20,80,80)】。
其中4,8,20分別代表一個點兩個anchors的類別數(2 anchors * 2類),(2 anchors * 框的資訊),(2 anchors * 5個關鍵點資訊(一個點x,y))
3.5 資料增強
WIDER FACE訓練集中大約 有 20% 的小人臉 , RetinaFace遵循 [68, 49 ) 並從原始影象隨機crop方形patches並調整這些 patches到 640*640 產生更大的訓練人臉。更具體地說,在原始影象的短邊[0.3,1]之間隨機裁剪正方形patches。對於crop邊界上的人臉,如果人臉框的中心在crop patches內,則保持人臉框的重疊部分。除了隨機裁剪,我們還通過0.5概率的隨機水平翻轉和光度顏色蒸餾來增加訓練資料。
3.6 學習率調整
使用warmup learning 策略,學習速率從10e-3,在5個epoch後上升到10e-2,然後在第55和第68個epochs時除以10。訓練過程在第80個epochs結束。
3.7 實驗結果
RetinaFace與其他24個stage-of-the-art的人臉檢測演算法對比。RetinaFace在所有的驗證集和測試集都達到的最好的AP,在驗證集上的AP是96.9%(easy),96.1%(Medium)和91.8%(hard)。在測試集的AP是96.3%,95.6%,91.4%.相比與當前最好的方法(Improved selective refinement network for face detection)在困難的資料集(包含大量的小人臉)的AP對比(91.4% vs 90.3%)。
此外,使用輕量Mobilenet-0.25作為backbone,對於VGA可以在CPU上達到實時。
RetainFace在最大的人臉檢測圖片中可以檢測到900個人臉,主要依靠聯合額外監督資訊和自監督多工學習方法
參考1:https://blog.csdn.net/c2250645962/article/details/106331720
參考2:https://mp.weixin.qq.com/s?__biz=MzU4NTY4Mzg1Mw==&mid=2247486695&idx=2&sn=9b919fb315c729bd88efccdb19d4876c&chksm=fd878a05caf00313aa6b7ae53d15c53f35e46c68ef5cfdea08e9989186f9e65dec0186f440cd&scene=178#rd