深度学习人脸识别核心技术—框架和优化目标
注:本文选自人脸图像资深工程师言有三出版的新书《深度学习之人脸图像处理:核心算法与案例实战》(机械工业出版社出版)的6.2节,略有改动。经授权刊登于此。
人脸识别本质上是一个人脸验证和匹配问题,其中最重要的就是框架和优化目标,本节集中讨论这两个主要问题。
度量学习即Metrix Learning,这一类方法以Siamese网络[2]、Triplet网络[3]为代表。
1.Siamese网络与Contrastive loss
Siamese网络结构如图6.2所示,输入两张图分别进入两个网络提取特征,这两个网络通常共享权重,使用的损失函数是Contrastive loss。
图6.2 Siamese网络结构
Contrastive loss的表达式如下:
式中,d就是两个特征向量的距离;y是标签,如果两张输入图匹配(即是同一个人脸),y就是1,否则y就是0。
可以看出,如果输入匹配的两幅图,则d越小损失越小;如果不匹配,则要在margin参数的控制下,d越大损失越小,即实现了同时让类内距离尽可能小、类间距离尽可能大的效果。
2.Triplet网络与Triplet loss及其改进
Triplet网络相比Siamese网络增加了一幅输入图像,它输入3幅图像,包括一个Anchor样本,一个正样本,一个负样本,使用Triplet loss进行优化,结构如图6.3所示。
输入3个样本可以是一个正例+两个负例,或者一个负例+两个正例,Triplet loss的目标是要让属于同一个人的人脸在特征空间中尽可能地“近”,而与其他人脸尽可能地“远”。如果输入是两个正样本和一个负样本,则负样本与正样本的距离应该大于正样本之间的距离,或者大于某一个阈值。
一个典型的Triplet loss定义在下面三元组概念之上:基准正例x,正例x+,负例x-。令Net表示网络,Net(x)表示网络提取的特征,定义两个网络输出之间的距离等于特征向量Net(x)之间的欧式距离:Net(x)通常可以是一个归一化后的向量。
图6.3 Triplet网络结构
基准样本x和负样本x-之间的距离定义如下:
基准样本x和正样本x+之间的距离定义如下:
优化目标等于:
在理想情况下,令margin=1,如果网络训练得特别好,满足下式:
此时损失趋向于0,这在比较复杂的任务中几乎不可能出现,因为有的正样本之间相似度很低,强行降低损失会增加过拟合风险。
实际用的时候margin需要精细地调参,而样本的选择也很有技巧,需要使用难样本挖掘,使Triplet Network训练有一定的难度。
Triplet loss的痛点在于每次只看一个负类的距离,没有考虑其他所有负类的情况,这就导致了在随机产生的数据对中,每一个数据对并不能有效地保证当前优化的方向能够拉远所有负类样本的距离,这就往往导致训练过程中的收敛不稳定或者陷入局部最优。
Multi-class N-pair loss[4]是对Triplet loss的一个改进,出发点就是同时优化使用所有负类,实际操作就是每次使用N-1个负类样本,一个正类样本。当样本类别数目N比较小或者不是特别大的时候,N-pair loss已经同时考虑了N-1个负样本和一个正样本的距离优化,所以没必要进行困难负样本挖掘。
由于距离度量在尺度变化时比较敏感,Triplet的margin选择对不同的intra-class也无法通用,有研究者使用角度来代替距离,提出了基于角度的Angular loss[5]。Angular loss本身具有旋转不变和尺度不变性,在一些细粒度分类任务中取得了更好的结果,与之相似的还有Coco loss[6],不再赘述。
3.Center loss
Center Loss[7]与Siamese、Triplet网络优化的目标不同,它只关注类内分布的均匀性,即希望每一个类绕类内中心均匀分布,从而最小化类内距离,公式如下:
式中,xi是第i个样本的特征向量;是第i个样本所属类别yi的类中心,该损失会驱使样本靠近所属类别的中心。
Range loss[8]是对Center loss的一个改进,它同时约束类内紧凑类间分离,类内紧凑约束为每个类最小化两个最大类内距离,类间分离约束为每次都计算每个类别中心,并使类中心距离最小的两个类别距离大于margin。
与直接训练人脸验证网络的度量学习方法不同,基于多类别分类的方法,通常是首先训练好一个人脸分类器,然后训练人脸验证器。人脸分类网络通常是基于Softmax损失的分类网络,训练得到鲁棒的特征表达后,基于该人脸分类网络提取到特征表达,然后训练人脸验证网络或者使用联合贝叶斯等方法学习人脸验证。
1.DeepFace
DeepFace[9]是一个早期的非常典型的人脸识别框架,它首先对输入人脸经过3D对齐,然后使用数据集训练一个人脸分类器得到人脸特征提取网络,最后使用Siamese网络训练人脸验证网络,流程如图6.4所示。
图6.4 DeepFace网络
图6.4中包括两个共享卷积层C1和C3,3个不共享的卷积层(同一张图像不同区域使用不同的卷积核)L4、L5、L6。使用不共享卷积层是因为人脸的局部稳定性假设并不存在,采用相同的卷积核会导致信息的丢失。采用不共享的卷积核会导致训练时的参数量增加,其中95%都来源于最后5层,但是不会影响提取特征时的计算速度。论文中使用了4000人的4×108张图像,也没有出现明显的过拟合。
Siamese验证网络的主体就是人脸分类器除去最后一层全连接层的整个结构,它们共享权重,输出为4096维的人脸特征表达。人脸验证网络的训练就是给Siamese的两个特征输出层添加归一化的全连接层映射后,使用两个全连接层输出的L1损失来判别是不是同一张人脸,计算如下:
这里的f1和f2就是归一化后的特征,αi是一个需要学习的权重。
2.DeepID系列
早期的人脸识别算法中有一个非常典型的系列,即DeepID系列。该系列网络首次超过
专家的人脸识别能力,分为DeepID1[10]、DeepID2[11]、DeepID2+[12]等版本。
在DeepID1中,方法输入39×31大小的图,首先使用多个图像块训练一个10 000类别的分类网络,其中最后的全连接层特征输出只有160维,却能够取得很好的分类结果。值得注意的是这最后一层的特征是和第三层、第四层进行全相连,而不只是和它的上一层即第四层相连,作者验证这是一种有效的多尺度特征获取方案。
网络从一张测试图的10个区域中选60个图像块及其翻转版本,需要训练60×2=120个CNN,最后把每个CNN的160维特征连接成长度为160×2×60=19 200维的特征,而后使用联合贝叶斯方法或者神经网络进行人脸验证,它们的输出都是一个相似度,通过阈值来判断是否是同一张人脸。
作者们使用CelebFaces训练集进行训练,在LFW数据库上的识别率达到97.5%,并且验证了在训练CNN中数据的类别越多,其性能越好。
DeepID2在DeepID的基础上,使用了更大的图像输入、更多的图像块,添加了人脸验证损失,从而能够减少类内方差,增大类间方差。相比于DeepID1,DeepID2从众多图像块中挑选出25个最佳图像块,减少了计算负担和信息冗余。
另外,特征提取网络的第三层只在2×2的区域内共享权重,第四层则完全不共享权重。
DeepID2能比DeepID1取得更好的结果,验证了需要同时最小化类内方差和最大化类间方差才能取得更好的人脸识别模型。
因为DeepID2中加入Contrastive loss,CNN学习出的特征可以直接用于计算L2距离进行人脸验证,效果不会比联合贝叶斯方法差很多。最后通过选择不同的图像块,训练了7个分类器进行集成。
DeepID2+在DeepID2的基础上增加了4个特征提取层的隐藏层数量,特征通道数量由20、40、60、80变为128、128、128、128。输出的特征维数由160变为512。同时将验证损失添加到每一个网络层。相比于DeepID2,25个图像块还要再进行一次翻转,因此需要训练50个CNN,特征维数共50×512=25 600维。
DeepID2+不仅发现所学习到的特征具有稀疏性质,因此可以二值化处理来加快人脸验证计算,也发现高层的特征对遮挡有很强的鲁棒性。
后续的DeepID3只是使用了更新的基准网络,不再做介绍。
DeepID系列模型由于需要训练多个模型,因此实用性不强,但是给后续的一些方法提供了较大的借鉴意义。
END
在看,让更多人看到