人脸识别-如何训练tripletloss

简介

本篇论文来自猎户星空这家公司
论文地址https://arxiv.org/abs/1709.02940
tripletloss 来自google发表在cvpr2015上的《A Unified Embedding for Face Recognition and Clustering 》。在lfw上acc为99.63%。因此很多都想复现其效果。但据我了解到目前公开出来训练tripletloss成果的有百度、vgg视觉组、face++,其他好像复现的效果都不太好。

背景

google的facenet采用800万人,2亿数据,每个batchsize为1800进行训练。
然而有用如此数据的公司少之又少。下图展示了一个当每一类人图片数与准确率的关系。
这里写图片描述
可见当数据量缺乏的情况下,使用tripletloss不但不会提高,还会降低。

Tripletloss

这里写图片描述
如上图所示:triplet是一个三元组,包括anchor,negative,positive。从训练样本选取一个样本作为anchor,然后选取和anchor同一类的一个样本作为positive。不同类的某个样本作为negtive。tripletloss方法的目的就是使类内更近,类间变得更加远。由公式可表示如下:

这里写图片描述
最终tripletloss为:
这里写图片描述

训练策略

如下图所示,这是常用的三种训练策略。
这里写图片描述

(a) Triplet with OHNM

第一种方法输入时就组成三元组。即输入的batch为3的倍数,但此时由于negtive是随机采的,导致一个batch中hard negative较少,最终是easy negative优化,效果不好。
这里写图片描述

(b)Triplet with Batch OHNM

这个策略应该是常用的策略,即从一个batch中寻找满足下面公式的三元组。但存在一个问题,一个batch并不能覆盖所有的三元组情况。一个batch中有效的三元组数量有限,因此也不能训练出来一个好结果。
这里写图片描述

(c)Triplet with Subspace Learning

为了使得一个batch中,hard negative数量多,很自然的想法就是想找出那些类特别相似。解决方法就是通过聚类实现。流程如下:

  1. 计算每一个类的中心。
    这里写图片描述
  2. 使用kmeans方法将训练图片聚成M类。
  3. 从离自己相近的簇中寻找Hard negative。这样一个Batch中将会形成更多的hard 三元组。
    这里写图片描述

实验

这里写图片描述

总结

本篇文章在训练tripletloss策略上使用聚类的方法寻找hard negative,在微软数据集上进行训练得到提升。后期可以将其结合sphereface进行看是否有提升。

猜你喜欢

转载自blog.csdn.net/Iriving_shu/article/details/78947603