L2_Softmax Loss
- 《L2-constrained Softmax Loss for Discriminative Face Verification》
2017,Rajeev Ranjan,L2-constrained Softmax Loss
引言:
人脸验证在LFW数据集上做的很好,但是在实际场景:存在大量视角、分辨率、图像质量变化和遮挡时,验证效果并没有那么理想。主要是两个原因造成的:
1.数据质量不均衡:目前常用的人脸识别公开训练集图像大都是高清、正脸人脸图像,很少包含无限制条件下的难以识别的人脸图像。现在大多数的DCNN模型,使用softmax loss做分类,使用前面提到的训练集训练出来的模型,对高质量的图像过拟合,但对难以识别的图像欠拟合。
DCNN人脸识别流程:
2.softmax loss不适合做人脸验证任务:softmax loss只是保证学习到的特征不用做任何matric learning的时候,能够使得人脸特征可分。但是softmax loss并没有保证positive pairs学到的特征足够近而negative pairs学到的特征足够远,因此不是很适合去做人脸验证任务。另外一点是,softmax loss是要最大化给定的mini-batch中所有样本的条件概率。但是,由于高质量的人脸图像的特征范数较大,低质量人脸图像的特征范数较小,如果直接让容易验证的样本的范数比较大,让难以验证的样本的范数较小,则可以得到最小化的softmax loss。因此,如果直接使用softmax loss只关注了mini-batch中高质量的人脸图像,而忽略了该mini-batch中较少的低质量的人脸图像。
实验验证:
如上图所示,低质量的图像对验证准确率最差,而高质量的图像对验证准确率最高。证明了作者上述观点。
解决办法:
提出L2-Softmax损失函数,将学习的特征x归一化。作者观测到好的正面的脸,特征的L2-norm大,而特征不明显的脸,其对应的特征L2-norm小,因此提出这样的约束来增强特征的区分度。
上面式就是将其归一化到固定值α。实际训练的时候都不需要修改代码,只需要添加L2-norm层与scale层,如下图。
好处:
由于损失函数使得所有人脸图像的特征的范数大小相同,所以softmax loss不会只偏重于对easy samples的学习,也会对diffcult samples进行学习;
还是由于特征的范数大小一致,所以所有的特征样本的特征都分布于一个固定半径的超球面上,此时最小化softmax loss等价于最大化positive pairs之间的余弦相似度,同时最小化negative pairs之间的余弦相似度。
在MNIST数据集上验证L2-softmax:
参数α的限制:
参数α有两种设置方式,一是在训练过程中设置α为固定值,二是通过训练获得。但是第二种方式得到的α会得到比较大的值,添加的限制太过宽松。作者建议设置为一个比较小的固定值。
但是作者也观察到α的值设置太小的时候,超球面的表面积太小,特征分布不开,最后验证准确率也不高。
上图(b)表示以验证准确率p=0.9时,类别数C越大,需要值越大。
作者建议的最小值为:
网络结构:Face-Resnet
实验结果:
α值需要手动设置或者自动学习,手动设置比较麻烦,调参费劲。
和centerloss进行比较:
总结:
本文提出了L2-constrained Softmax Loss,来提高人脸识别系统的准确率。同时证明了特征范数可以对图像质量进行判断,特征范数越大图像质量越好。
Tensorflow参考代码:
# L2-constrained Softmax
bottleneck_normalized = tf.nn.l2_normalize(bottleneck, 1, 1e-12)
scale = tf.get_variable("scale", (), dtype=tf.float32,
initializer=tf.constant_initializer(4.0),
regularizer=slim.l2_regularizer(FLAGS.weight_decay))
bottleneck_scale = tf.multiply(bottleneck_normalized, scale)
参考: https://zhuanlan.zhihu.com/p/34044634
https://blog.****.net/cdknight_happy/article/details/80392523