zoukankan      html  css  js  c++  java
  • 【华为云技术分享】人脸识别算法的训练之路(下)

    人脸识别算法的训练之路(上)

    人脸识别

    人脸识别问题本质是一个分类问题,即每一个人作为一类进行分类检测,但实际应用过程中会出现很多问题。第一,人脸类别很多,如果要识别一个城镇的所有人,那么分类类别就将近十万以上的类别,另外每一个人之间可获得的标注样本很少,会出现很多长尾数据。根据上述问题,要对传统的CNN分类网络进行修改。

    我们知道深度卷积网络虽然作为一种黑盒模型,但是能够通过数据训练的方式去表征图片或者物体的特征。因此人脸识别算法可以通过卷积网络提取出大量的人脸特征向量,然后根据相似度判断与底库比较完成人脸的识别过程,因此算法网络能不能对不同的人脸生成不同的特征,对同一人脸生成相似的特征,将是这类embedding任务的重点,也就是怎么样能够最大化类间距离以及最小化类内距离。

    在人脸识别中,主干网络可以利用各种卷积神经网络完成特征提取的工作,例如resnet,inception等等经典的卷积神经网络作为backbone,关键在于最后一层loss function的设计和实现。现在从两个思路分析一下基于深度学习的人脸识别算法中各种损失函数。

    思路1:metric learning,包括contrastive loss, triplet loss以及sampling method

    思路2:margin based classification,包括softmax with center loss, sphereface, normface, AM-sofrmax(cosface) 和arcface。

    Metric Larning

    1.  Contrastive loss

    深度学习中最先应用metric learning思想之一的便是DeepID2了。其中DeepID2最主要的改进是同一个网络同时训练verification和classification(有两个监督信号)。其中在verification loss的特征层中引入了contrastive loss。

    Contrastive loss不仅考虑了相同类别的距离最小化,也同时考虑了不同类别的距离最大化,通过充分运用训练样本的label信息提升人脸识别的准确性。因此,该loss函数本质上使得同一个人的照片在特征空间距离足够近,不同人在特征空间里相距足够远直到超过某个阈值。(听起来和triplet loss有点像)。

    9.jpg

    Contrastive loss引入了两个信号,并通过两个信号对网络进行训练。其中识别信号的表达式如下:

    10.jpg

    验证信号的表达式如下:

    11.jpg

    基于这样的信号,DeepID2在训练的时候就不是以一张图片为单位了,而是以Image Pair为单位,每次输入两张图片,为同一人则为1,如果不是同一人则为-1.

    1.        Triplet loss from FaceNet

    这篇15年来自Google的FaceNet同样是人脸识别领域分水岭性质的工作。它提出了一个绝大部分人脸问题的统一解决框架,即:识别、验证、搜索等问题都可以放到特征空间里做,需要专注解决的仅仅是如何将人脸更好的映射到特征空间。

    Google在DeepID2的基础上,抛弃了分类层即Classification Loss,将Contrastive Loss改进为Triplet loss,只为了一个目的:学习到更好的feature。

    直接贴出Triplet loss的损失函数,其输入的不再是Image Pair,而是三张图片(Triplet),分别为Anchor Face, Negative Face和Positive Face。Anchor与Positive Face为同一人,与Negative Face为不同的人。那么Triplet loss的损失函数即可表示为:

    12.jpg

    该式子的直观解释为:在特征空间里Anchor与Positive的距离要小于Anchor与Negative的距离并超过一个Margin Alpha。他与Contrastive loss的直观区别由下图所示。

    13.jpg

    1.        Metric learning的问题

    上述的两个loss function效果很不错,而且也符合人的客观认知,在实际项目中也有大量的应用,但该方法仍有一些不足之处。

    ·         模型训练依赖大量的数据,拟合过程很慢。由于contrastive loss和triplet loss都是基于pair或者triplet的,需要准备大量的正负样本,,训练很长时间都不可能完全遍历所有可能的样本间组合。网上有博客说10000人、500000张左右的亚洲数据集上花一个月才能完成拟合。

    ·         Sample方式影响模型的训练。比如对于triplet loss来说,在训练过程中要随机的采样anchor face, negative face以及positive face,好的样本采样能够加快训练速度和模型收敛,但是在随机抽取的过程中很难做到非常好。

    ·         缺少对hard triplets的挖掘,这也是大多数模型训练的问题。比如说在人脸识别领域中,hard negatives表示相似但不同的人,而hard positive表示同一个人但完全不同的姿态、表情等等。而对hard example进行学习和特殊处理对于提高识别模型的精度至关重要。

    2.        对于Metric Learning不足进行修正的各种trick

    a.       Finetune

    参考论文:Deep Face Recognition

    在论文《Deep Face Recognition》中,为了加快triplet loss的训练,坐着先用softmax训练人脸识别模型,然后移除顶层的classification layer,然后用triplet loss对模型进行特征层finetune,在加速训练的同时也取得了很不错的效果。该方法也是现在训练triplet loss时最常用的方法。

    b.      Triplet loss的修改

    参考论文:In Defense of the Triplet Loss for Person Re-Identification

    该作者说出了Triplet loss的缺点。对于Triplet loss训练所需要的一个三元组,anchor(a)、positive(p)、negative(n)来说,需要从训练集中随机挑选。由于loss function的驱动,很有可能挑选出来的是很简单的样本组合,即很像的正样本以及很不像的负样本,而让网络一直在简单样本上进行学习,会限制网络的范化能力。因此坐着修改了triplet loss并添加了新的trick,大量实验证明,这种改进版的方法效果非常好。

    在Google提供的facenet triplet loss训练时,一旦选定B triplets集合,数据就会按照顺序排好的3个一组,那么总共的组合就有3B种,但是这些3B个图像实际上有多达种有效的triplets组合,仅仅使用3B种就很浪费。

    在该片论文中,作者提出了一个TriHard loss,其核心思想是在triplet loss的基础上加入对hard example的处理:对于每一个训练的batch, 随机挑选P个ID的行人,每个行人随机挑选K张不同的图片,即一个batch含有P×K张图片。之后对于batch中的每一张图片a,我们可以挑选一个最难的正样本和一个最难的负样本和a组成一个三元组。首先我们定义和a为相同ID的图片集为A,剩下不同ID的图片图片集为B,则TriHard损失表示为:

    14.jpg

    其中是人为设定的阈值参数。TriHard loss会计算a和batch中的每一张图片在特征空间的欧氏距离,然后选出与a距离最远(最不像)的正样本p和距离最近(最像)的负样本n来计算三元组损失。其中d表示欧式距离。损失函数的另一种写法如下:

    15.jpg

    另外,作者在轮中也提出了几个实验得到的观点:

    Ø  平方后的欧式距离不如开方后的真实欧氏距离(后续会简单提一下原因)

    Ø  提出了Soft-Margin损失函数替代原始的Triplet loss表达式,soft-margin能够使得损失函数更加平滑,避免函数收敛在bad local处,能够一定程度上加速算法收敛。

    Ø  引进了Batch Hard Sampling

    该方法考虑了hard example后效果比传统的triplet loss好。

    a.       loss以及sample方法的修改

    参考论文:Deep Metric Learning via Lifted Structured Feature Embedding

    该论文首先提出了现有的三元组方法无法充分利用minibatch SGD trainingtraining batches的优势,创造性的将the vector of pairwise distances转换成the matrix of pairwise distance,然后设计了一个新的结构化损失函数,取得了非常好的效果。如下图所示,是contrastice embedding,triplet embedding以及lifted structured embedding三种方式的采样示意图。

    16.jpg

    直观上看,lifted structured embedding涉及的分类模式更多,作者为了避免大量数据造成的训练困难,作者在此基础上给出了一个结构化的损失函数。如下图所示。

    17.jpg

    其中P是正样本集合,N是负样本集合。可以看到对比上述的损失函数,该损失函数开始考虑一个样本集合的问题。但是,并不是所有样本对之间的negative edges都携带了有用的信息,也就是说随机采样的样本对之间的negative edges携带了非常有限的信息,因此我们需要设计一种非随机的采样方法。

    通过上述的结构化损失函数我们可以看到,在最终计算损失函数时,考虑了最像和最不像的hard pairs(也就是损失函数中max的用处),也就相当于在训练过程中添加了difficult neighbors的信息了训练mini-batch,通过这种方式训练数据能够大概率的搜寻到hard negatives和hard positives的样本,而随着训练的不断进行,对hard样本的训练也将实现最大化类间距离和最小化类内距离的目的。

    18.jpg

    如上图所示,该文章在进行metric learning的时候并没有随机的选择sample pairs,而是综合了多类样本之间较难区分者进行训练。此外,文中还提到了以为的寻求max的过程或者寻求single hardest negative的过程会导致网络收敛到一个bad local optimum,我猜想可能是因为max的截断效应,使得梯度比较陡峭或者梯度间断点过多。作者进一步改进了loss function,采用了smooth upper bound,即下式所示。

    19.jpg

    a.       sample方式和对triplet loss的进一步修改

    参考论文:Sampling Matters in Deep Embedding Learning

    1)        对采样方式的修改

    文章指出hard negative样本由于anchor的距离较小,这是如果有噪声,那么这种采样方式就很容易受到噪声的影响,从而造成训练时的模型坍塌。FaceNet曾经提出一种semi-hard negative mining的方法,它提出的方法是让采样的样本不是太hard。但是根据作者的分析认为,sample应该在样本中进行均匀的采样,因此最佳的采样状态应该是在分散均匀的负样本中,既有hard,又有semi-hard,又有easy的样本,因此作者提出了一种新的采样方法Distance weighted sampling。

    在现实状态下,我们队所有的样本进行两两采样,计算其距离,最终得到点对距离的分布有着如下的关系:

    20.jpg

    那么根据给定的距离,通过上述函数的反函数就可以得到其采样概率,根据该概率决定每个距离需要采样的比例。给定一个anchor,采样负例的概率为下式:

    21.jpg

    由于训练样本与训练梯度强相关,因此作者也绘制出了采样距离、采样方法与数据梯度方差的关系,如下图所示。从图中可以看出,hard negative mining方法采样的样本都处于高方差的区域,如果数据集中有噪声的话,采样很容易受到噪声的影响,从而导致模型坍塌。随机采样的样本容易集中在低方差的区域,从而使得loss很小,但此时模型实际上并没有训练好。Semi-hard negative mining采样的范围很小,这很可能导致模型在很早的时候就收敛,loss下降很慢,但实际上此时模型也还没训练好;而本文提出的方法,能够实现在整个数据集上均匀采样。

    22.jpg

    1)        对loss function的修改

    作者在观察constractive losstriplet loss的时候发现一个问题,就是负样本在非常hard的时候loss函数非常的平滑,那么也就意味着梯度会很小,梯度小对于训练来说就意味着非常hard的样本不能充分训练,网络得不到hard样本的有效信息,因此hard样本的效果就会变差。所以如果在hard样本周围loss不是那么平滑,也就是深度学习中经常用的导数为1(像relu一样),那么hard模式会不会就解决了梯度消失的问题。另外loss function还要实现triplet loss对正负样本的兼顾,以及具备margin设计的功能,也就是自适应不同的数据分布。损失函数如下:

    23.jpg

    我们称anchor样本与正例样本之间的距离为正例对距离;称anchor样本与负例样本之间的距离为负例对距离。公式中的参数beta定义了正例对距离与负例对距离之间的界限,如果正例对距离Dij大于beta,则损失加大;或者负例对距离Dij小于beta,损失加大。A控制样本的分离间隔;当样本为正例对时,yij为1,样本为负例对时,yij为-1。下图为损失函数曲线。

    24.jpg

    从上图可以看出为什么在非常hard的时候会出现梯度消失的情况,因为离0点近的时候蓝色的线越来越平滑,梯度也就越来越小了。另外作者对的设置也进行了调优,加入了样本偏置、类别偏置以及超参,对损失函数进一步优化,能够根据训练过程自动修改的值。

    Margin Based Classification

    Margin based classification不像在feature层直接计算损失的metric learning那样对feature加直观的强限制,是依然把人脸识别当 classification 任务进行训练,通过对 softmax 公式的改造,间接实现了对 feature 层施加 margin 的限制,使网络最后得到的 feature 更 discriminative。

    1.      Center loss

    参考论文:A Discriminative Feature Learning Approach for Deep Face Recognition

    ECCV 2016的这篇文章主要是提出了一个新的Loss:Center Loss,用以辅助Softmax Loss进行人脸的训练,为了让同一个类别压缩在一起,最终获取更加discriminative的features。center loss意思即为:为每一个类别提供一个类别中心,最小化min-batch中每个样本与对应类别中心的距离,这样就可以达到缩小类内距离的目的。下图为最小化样本和类别中心距离的损失函数。

    25.jpg

    为每个batch中每个样本对应的类别中心,和特征的维度一样,用欧式距离作为高维流形体距离表达。因此,在softmax的基础上,center loss的损失函数为:

    26.jpg

    个人理解Center loss就如同在损失函数中加入了聚类的功能,随着训练的进行,样本自觉地聚类在每一个batch的中心,进一步实现类间差异最大化。但是我觉得,对于高维特征,欧氏距离并不能反映聚类的距离,因此这样简单的聚类并不能在高维上取得更好的效果。

    1.      L-Softmax

    原始的Softmax的目的是使得,将向量相乘的方式变换为向量的模与角度的关系,即,在这个基础上,L-Softmax希望可以通过增加一个正整数变量m,可以看到:

    27.jpg

    使得产生的决策边界可以更加严格地约束上述不等式,让类内的间距更加的紧凑,让类间的间距更加有区分性。所以基于上式和softmax的公式,可以得到L-softmax的公式为:

    28.jpg

    29.jpg

    由于cos是减函数,所以乘以m会使得内积变小,最终随着训练,类本身之间的距离会增大。通过控制m的大小,可以看到类内和类间距离的变化,二维图显示如下:

    30.jpg

    作者为了保障在反向传播和推理过程中能够满足类别向量之间的角度都能够满足margin的过程,并保证单调递减,因此构建了一种新的函数形式

    31.jpg

    有人反馈L-Softmax调参难度较大,对m的调参需要反复进行,才能达到更好的效果。

    1.      Normface

    参考论文:NormFace: L2 Hypersphere Embedding for Face Verification

    这篇论文是一篇很有意思的文章,文章对于权重与特征归一化做了很多有意思的探讨。文章提出,sphereface虽然好,但是它不优美。在测试阶段,sphereface通过特征间的余弦值来衡量相似性,即以角度为相似性度量。但在训练过程中也有一个问题,权重没有归一化,loss function在训练过程中减小的同时,会使得权重的模越来越大,所以sphereface损失函数的优化方向并不是很严谨,其实优化的方向还有一部分去增大特征的长度了。有博主做实验发现,随着m的增大,坐标的尺度也在不断增大,如下图所示。

    32.jpg

    因此作者在优化的过程中,对特征做了归一化处理。相应的损失函数也如下所示:

    33.jpg

    其中W和f都为归一化的特征,两个点积就是角度余弦值。参数s的引入是因为数学上的性质,保证了梯度大小的合理性,原文中有比较直观的解释,可以阅读原论文,并不是重点。s既可以变成可学习的参数,也可以变成超参,论文作者给了很多推荐值,可以在论文中找到。其实,FaceNet中归一化的欧氏距离,和余弦距离是统一的。

    1.      AM-softmax/CosFace

    参考论文:Additive Margin Softmax for Face Verification

               CosFace: Large Margin Cosine Loss for Deep Face Recognition

    看上面的论文,会发现少了一个东西,那就是margin,或者说是margin的意味少了一些,所以AM-softmax在归一化的基础上有引入了margin。损失函数如下:

    34.jpg

    直观上来看,-m比更小,所以损失函数值比Normface里的更大,因此有了margin的感觉。m是一个超参数,控制惩罚,当m越大,惩罚越强。该方法好的一点是容易复现,而且没有很多调参的tricks,效果也很好。

    1.      ArcFace

    与 AM-softmax 相比,区别在于 Arcface 引入 margin 的方式不同,损失函数:

    35.jpg

    乍一看是不是和 AM-softmax一样?注意 m 是在余弦里面。文章指出基于上式优化得到的特征间的 boundary 更为优越,具有更强的几何解释。 

    然而这样引入 margin 是否会有问题?仔细想 cos(θ+m) 是否一定比 cos(θ) 小?

    最后我们用文章中的图来解释这个问题,并且也由此做一个本章 Margin-based Classification 部分的总结。

    36.jpg

    这幅图出自于 Arcface,横坐标为 θ 为特征与类中心的角度,纵坐标为损失函数分子指数部分的值(不考虑 s),其值越小损失函数越大。 

    看了这么多基于分类的人脸识别论文,相信你也有种感觉,大家似乎都在损失函数上做文章,或者更具体一点,大家都是在讨论如何设计上图的 Target logit-θ 曲线。

    这个曲线意味着你要如何优化偏离目标的样本,或者说,根据偏离目标的程度,要给予多大的惩罚。两点总结:

    1. 太强的约束不容易泛化。例如 Sphereface 的损失函数在 m=3 或 4 的时候能满足类内最大距离小于类间最小距离的要求。此时损失函数值很大,即 target logits 很小。但并不意味着能泛化到训练集以外的样本。施加太强的约束反而会降低模型性能,且训练不易收敛。 

    2. 选择优化什么样的样本很重要。Arcface 文章中指出,给予 θ∈[60° , 90°] 的样本过多惩罚可能会导致训练不收敛。优化 θ ∈ [30° , 60°] 的样本可能会提高模型准确率,而过分优化 θ∈[0° , 30°] 的样本则不会带来明显提升。至于更大角度的样本,偏离目标太远,强行优化很有可能会降低模型性能。

    这也回答了上一节留下的疑问,上图曲线 Arcface 后面是上升的,这无关紧要甚至还有好处。因为优化大角度的 hard sample 可能没有好处。这和 FaceNet 中对于样本选择的 semi-hard 策略是一个道理。 

    Margin based classification 延伸阅读 

    1. A discriminative feature learning approach for deep face recognition [14]

    提出了 center loss,加权整合进原始的 softmax loss。通过维护一个欧式空间类中心,缩小类内距离,增强特征的 discriminative power。 

    2. Large-margin softmax loss for convolutional neural networks [10]

    Sphereface 作者的前一篇文章,未归一化权重,在 softmax loss 中引入了 margin。里面也涉及到 Sphereface 的训练细节。

    点击这里,了解更多精彩内容

  • 相关阅读:
    Linq之旅:Linq入门详解(Linq to Objects)【转】
    Shadow Map 原理和改进 【转】
    OSG 中文解决方案 【转】
    shadow mapping实现动态shadow实现记录 【转】
    RenderMonkey 练习 第六天 【OpenGL Water 水效】
    glsl水包含倒影的实现(rtt) 【转】
    Docker镜像仓库Harbor之搭建及配置
    docker登录没有配置https的harbor镜像仓库
    Git 清除远端已删除的分支
    单节点k8s的一个小例子 webapp+mysql
  • 原文地址:https://www.cnblogs.com/2020-zhy-jzoj/p/13164692.html
Copyright © 2011-2022 走看看