對這部分不了解的可以看看:
人臉識別和檢測中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