摘要: 基於高斯熱力圖的目標檢測是anchor free中的代表方法,其具有原理簡單,易於拓展,後處理簡單等優勢。
1. 簡介
採用熱力圖做人臉檢測,最開始是Centernet的出現,其在通用通用目標檢測,人體關鍵點檢測,3D目標檢測上都達到了std的效果。後來就出現了centerface,採用mobilev2做bonenet,做人臉與關鍵點檢測。但,項目只給出了推理代碼,沒有給出訓練代碼。後面我借鑑Centernet項目,復現了一個版本:CenterFace.pytorch,但,訓練結果沒法達到原文的最好效果。且代碼是用的Centernet,所以可讀性較差。
今年,出現了DBface,和dbface_small,其中dbface_small只有1.4M也能和retinaface_small一樣的精度。同時,項目重構的代碼,結構清晰,也便於理解和閱讀。
2. 網絡模型結構
2.1 神經網絡部分
直接上圖(PPT畫的,😂😂😂)
-
Block
就是一個殘差模塊 -
ResSE
在每個殘差模塊的shortcut前,增加一個SE模塊 -
FPN中的UP(借用原作者的經驗)
雙線性插值Bilinear+Conv+BN+Activation的上採樣模塊,優於用反捲積、最近鄰插值等,所以比較推薦,但是不同框架對這個的支持不一樣,造成使用困難 -
SSH
在輸出加了一個SSH模塊,增強特徵 -
輸出
有三個分支,分別對應人臉box中心點的高斯熱力圖,人臉box,人臉關鍵點landmark
2.2 模型原理部分
-
hm loss
人臉box中心點hm的尺寸爲:200*200,hm_target也是200 * 200 ,採用focal loss作爲損失函數。hm_target == 1表示正樣本,hm_target < 1的表示負樣本。所以一個目標用anchor的理念,就只有一個anchor。- 引入pos_weight,改善大目標檢測
CenterNet AnchorFree的特性是所有目標都一個點,正類貢獻無論目標尺寸大小都一樣,Anchor Base的特性是目標越大正類loss貢獻越大,也正因此,大目標在CenterNet上訓練效果總是不好,解決大目標不行,本項目提倡增加pos_weights來處理,並且增加大目標的權重,實驗證明有良好的提升大目標效果
- 引入pos_weight,改善大目標檢測
-
box loss——giou loss
box輸出爲200 * 200 * 4。在Centernet項目中是預測的w,h,採用的是L1loss。DBface中人臉box採用的是[x1, y1, x2, y2]左上,右下,相對box中心的偏差,並用giou loss。 -
landmark loss
landmark輸出爲200 * 200 * 10。其也是相對於box中心點的偏差。人臉關鍵點採用WingLoss