centerNet的 創新點:
這是一種不需要使用anchor的網絡結構,網絡的輸出使用的由3個head層所決定,第一個輸出類別數,第二個輸出中心點位置,第三個輸出偏置項
(hm): Sequential( (0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU(inplace) (2): Conv2d(64, 80, kernel_size=(1, 1), stride=(1, 1)) ) (wh): Sequential( (0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU(inplace) (2): Conv2d(64, 2, kernel_size=(1, 1), stride=(1, 1)) ) (reg): Sequential( (0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU(inplace) (2): Conv2d(64, 2, kernel_size=(1, 1), stride=(1, 1)) )
我們先放置一張檢測結果來進行演示
假設輸入一張圖的大小是640x640, 下采樣的比例是4的話,那么卷積圖的尺度是160x160
損失函數談論
中心點預測損失函數
這里采用的也是focal loss的思想
第一種情況: 當是目標物體時,當 接近1的話,這個物體容易被識別出來,即(1-
)^a的值越小,即損失值也越小,使得權重偏向於更難訓練的目標
第二種情況: 1.當不是目標物體時,假如此時的概率值是0.9,因為這個時候的概率值應該是0才對,我們使用( )^a進行懲罰,但是由於可能是中心點附件的位置,所以使用(1-Yxyc)^P 進行安慰一下
2.當不是目標物體時,假如此時的概率值是0.1, 對於( )^a進行獎勵,使用(1-yxyc)^P進行懲罰,即離的越遠,損失函數越大,離的越近,損失函數越小,這相當於弱化了實際中心點其他負樣本的損失比重,相當於處理正負樣本不平衡。
目標預測偏置損失函數
由於中心點直接采用的是特征圖的中心點,因此在實際的縮放過程中,應該是需要有關於中心點位置的偏移量
假設我們有一張640和320的圖片,resize成512,512, 由於網絡下采樣的比例是4,因此縮放為128, 128,如果此時實際的中心是[98.97667,2.3566666],那么對應位置上的中心點的位置是98, 2, 由此可知,此時的偏移量應該是0.97667, 0.3566666,這里使用的就是L1 loss, 這個式子中 是我們預測出來的偏置,而
則是在訓練過程中提前計算出來的數值
目標預測長寬損失函數
為了減少回歸的難度,這里使用 作為預測值,使用L1損失函數,與之前的
損失一樣:
總的損失函數表達式
在論文中 ,然后
,論文中所使用的backbone都有三個head layer,分別產生[1,80,128,128]、[1,2,128,128]、[1,2,128,128],也就是每個坐標點產生
個數據,分別是類別以及、長寬、以及偏置。
推理階段:
在一階和二階檢測識別網絡中,由於存在大量的anchor,因此很有可能存在一個關鍵點,有多個大於閾值的檢測結果,但是這里我們一個特征點只對應一個檢測目標,因此我們使用3x3的maxPool,判斷當前的點是否比周圍其他8個點都大,從中挑選出大於閾值的前100個點,作為最后的檢測結果
最終的檢測結果 閾值大於0.3的結果
不添加閾值的,前100個結果
熱力圖