人脸识别和检测中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