人臉識別和檢測中loss學習 - 10 - ArcFace: Additive Angular Margin Loss for Deep Face Recognition - 1 - 論文學習


 

對這部分不了解的可以看看:

人臉識別和檢測中loss學習 - 7 - SphereFace 

NormFace: L2 Hypersphere Embedding for Face Verification - 1 - 論文學習

人臉識別和檢測中loss學習 - 9 - ADDITIVE MARGIN SOFTMAX FOR FACE VERIFICATION- 1 - 論文學習

該方法與AM-softmax類似,只是將邊際參數m放到了cos函數中,即cos(θ+m),損失函數為:

 

 計算步驟如下圖所示:

 

  • 首先將得到的特征向量x和權重Wj分別進行歸一化,這里特征x的維度是512維
  • 然后將歸一化后的特征向量x和權重Wj作為全連接層的輸入,,計算每個類對應的WjTxi,等價於計算得到cosθj
  • gt表示的是該圖像的真實標簽值,mx.sym.pick(fc7,gt)的作用是得到該圖像標簽對應的位置的fc7計算得到的值,因為對於該圖像來說,其他類的結果是多少與它無關,它只用關注自己的標簽對應的結果哦就可以了,得到original_target_logit
  • 然后經過一個arccos計算,將θj角度計算出來,然后添加上邊際參數m,再求cos(m+θj),得到marginal_target_logit
  • 然后下面的one_hot()操作的作用是:假設輸入的圖像數量為2,gt=[2,1],一共有三類,n=3,將gt變換為[[0, 0, 1], [0,1,0]]的2*3維向量one_hot,即大小為batch_size*number
  • broadcast_mul()操作的作用就是:用marginal_target_logit-original_target_logit得到將邊際參數添加進去后logit的變化值,這是一個(2,)的值(即大小為(batch_size,)),然后將該值expand_dims(,1)將值變為2*1的值K,即在位置0添加一個軸,假設值為[2 3]。broadcast_mul()將one_hot和值K相乘,因為one_hot的大小為batch_size*number,K的大小為batch_size*1,這樣會將K自動擴展為batch_size*number,和one_hot逐位相乘,這樣就能得到每個batch對應的增加結果,大小為atch_size*number,結果為[[0, 0, 2], [0,3,0]]
  • 將這個結果加到之前的fc7層的值上,這樣就只會改變batch對應的標簽上的值了
  • 然后在將得到的結果乘以scale參數s,得到s*cos(m+θj)
  • 將這個值s*cos(m+θj)作為softmax函數的輸入,得到最終的預測結果,即概率
  • 然后將該結果輸入交叉熵損失函數中進行計算得到損失

 

下面的圖中只顯示了角度在[20o,100o]間變化是的target logit變化的結果。這是因為在訓練一開始時,權重Wyi和特征向量xi的角度是90,然后進過訓練慢慢會停在30附近,此時的target logit的值也接近概率1:

 

如果進行的是二分類,我們發現ArcFace在整個時間間隔中有着更穩健的線性角度邊界。相反,SphereFace和CosFace則有着非線性的角度邊界:

 

 

 

 

設置s=64,m=0.5,使用PReLU和max pooling layer


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM