基于Triplet loss 函数训练人脸识别深度网络

基于Triplet loss 函数训练人脸识别深度网络

在FaceNet中,作者提出了基于度量学习的误差函数Triplet loss,其思想来源如下:

xaixpi22+threshold<xaixni22

其中 xai 表示参考样本, xpi 表示同类样本, xni 表示异类样本,threshold表示特定阈值。该不等式可表示成下列形式:

xaixpi22xaixni22+threshold<0

该不等式本质上定义了同类样本和异类样本之间的距离关系,即:所有同类样本之间的距离+阈值threshold,要小于异类样本之间的距离。当距离关系不满足上述不等式时,我们可通过求解下列误差函数,通过反向传播算法来调节整个网络:

L=argmini(xaixpi22xaixni22+threshold)+

只有括号内公式的值大于0时,才计算误差。利用该公式可分别计算出 xai xpi xni 的梯度方向,并根据反向传播算法调节前面的网络。

在FaceNet中,作者利用该方法与Zeiler&Fergus以及GoogLeNet中提出的网络结构相结合,实现人脸识别,达到了很高的精度。

为了验证TripletLoss的有效性,我们在WebFace数据库上利用TripletLoss训练了另一种深度卷积网来实现人脸验证,WebFace中有该网络的结构描述。与FaceNet不同,我们并没有采用作者使用的semi-hard样本选取策略,而是直接扩大batch中样本的数量。得益于双Titan X显卡,BatchSize达到了540,较大的BatchSize能够保证求得的梯度方向与semi-hard策略所求得的梯度方向相类似。

在得到TripletLoss训练好的网络后,我们利用Joint-Bayesian方法对网络最后一层提取的特征进行学习,得到相似度估计模型。最终模型与DeepID在LFW测试集上的对比ROC曲线如下图所示:

基于Triplet loss 函数训练人脸识别深度网络_第1张图片

可以看出,与DeepID相比,我们的模型在精度上仍有差距,这可能与模型本身的能力、训练时间、只采用灰度图作为训练样本等因素都有关系,但足以证明TripletLoss在人脸识别上是一种不错的训练方法。部分测试结果如下:

基于Triplet loss 函数训练人脸识别深度网络_第2张图片

基于Triplet loss 函数训练人脸识别深度网络_第3张图片

基于Triplet loss 函数训练人脸识别深度网络_第4张图片

基于Triplet loss 函数训练人脸识别深度网络_第5张图片

基于Triplet loss 函数训练人脸识别深度网络_第6张图片

基于Triplet loss 函数训练人脸识别深度网络_第7张图片

基于Triplet loss 函数训练人脸识别深度网络_第8张图片

你可能感兴趣的:(deep-learning)