DeepID1,DeepID2

时间:2023-03-08 16:00:36

1.DeepID1 (Deep Learning Face Representation from Predicting 10,000 Classes)

Step1:构建网络框架

DeepID1,DeepID2

DeepConvNet主要由卷积层、Pooling层和全连接层构成。其中,Deep hidden indentity features层与Pool3和Conv4部分连接。

Step2:特征提取

每张人脸图提取5个landmark(两个眼睛的中心,嘴角的两个角点,鼻尖):1.以部分landmarks弱对齐方式提取5个脸部patch;2.以每个landmark为中心,提取5个脸部patch。每张脸提取10个patch,选取3种不同分辨率,2种不同色彩(即彩色图和灰度图),一张人脸图可以提取60个pathches,因此需要训练60个CNN。每个CNN输出特征长度均为160,为了增加模型训练数据量,可以对60个patches进行镜像处理,最终得到的特征长度为160*60*2

DeepID1,DeepID2

Step3:神经网络人脸验证

作者采用两种不同的方法进行人脸验证,即基于联合贝叶斯的人脸验证方法和基于神经网络的人脸验证方法。

贝叶斯人脸验证方法:

将每一个人脸的160*2*60维特征用PCA降维到150维长度,然后用用两个长度为150维的特征计算其联合贝叶斯概率值,并与预定阈值比较判定是否是同一张人脸。

神经网络人脸验证方法

用于人脸验证的神经网络包括四层,即input layer, locally connected layer, fully connected layer和output layer。

input layer:利用Conv-Net可以从一幅人脸图像中提取出160*2*60维长度的一维特征(在这里60代表之前训练得到的60个CNN)。人脸验证的输入是两幅人脸图像,那么用60个CNN中的其中一个CNN对两幅人脸图像及其镜像图像进行特征提取,可以得到160*2(mirror)*2(people)=640维长度的一特征。相应地,60个CNN可以生成60组640维长度的一维特征,将这些特征首尾得到640*60维长度的以为特征。将640*60=38,400长度的一维特征作为人脸验证神经网络的输入。为了满足后续网络对输入层的需求,我们在输入端仍然采用60段独立的640维长度的特征(每段640维的特征是有两个人脸图像及其镜像图像通过一个CNN生成的)。

locally connected layer: 之前通过CNN特征提取得到的60组特征。事实上,每一组特征内部都是高度冗余的,因此在输入层后添加如下图所示的局部连接层作为第一个隐层,这样既可以保留局部特征学习特性又能实现特征降维。

fully connected layer:第二个隐层是全连接层,用于学习全局特征。

output layer:输出层是一个sigmoid函数,用于输出学习结果。

另外,需要注意的是训练网络中每一个隐层(即locally-connected layer和fully-cnnected layer)后都会跟relu层和dropout层,防止梯度弥散和过拟合,使loss收敛效果和网络泛化性能更好。

DeepID1,DeepID2

Step4:实验测试

作者比较了联合贝叶斯人脸验证和神经网络人脸验证方法的性能,实验结果如下:

1.通过联合贝叶斯人脸验证方法实验可知:采用60个Conv-net得到的特征比只使用1个Conv-net得到的特征效果好。(准确率从95.35%提升到96.05%)。即Convnet数量越多,准确率越高。

2.增加Soft-max layer的输出数量(即分类数,或识别的个体数)可以提升人脸验证的准确率。即分类的类别数越多,DeepConv-Net学到的DeepID特征(160维)越有效。此外,作者强调用于人脸验证的一定是160维长度的DeepID特征,而不是Softmax Layer的输出。如果用SoftmaxLayer输出的结果(例如用4348个不同人的数据训练DeepID,Softmax输出是4348维)进行人脸验证特征,采用联合贝叶斯人脸验证方法得到的准确率约为66%,而神经网络人脸验证方法则完全失效。

3.增加patches数(即Convnet数目,两者是相等的)会使DeepID特征维度升高,这与我们在前面第1条结果中得到的结论是一致的。此外,将Convnet数目从1提升到60时,分别用联合贝叶斯和神经网络两种方式进行人脸验证。实验结果表明:虽然神经网络人脸验证方法在Convnet数从1提升到60的过程中准确率相对提升幅度较联合贝叶斯方法略高,但是当Convnet数目是60个时,联合贝叶斯方法绝对准确率更高。

4.训练数据越多,Convnet数目越多(即一幅人脸图像提取的Patch数目),人脸验证准确率越高。

2. DeepID2 (Deep Learning Face Representation by Joint Identification-Verification)

继之前的DeepID1实现了97.45%的人脸验证准确率后,作者进一步发扬光大设计了DeepID2,将人脸验证准确率提高至99.15%。我们知道,提高识别网络性能本质上就是要降低类内差异,提高类间差异。然而,传统的DeepID1特征更多将特征学习过程集中在如何提高类间差异,而没有考虑到降低类内差异。特别是对于一些训练时没有出现的类别,对于同一个人的两幅不同图像,因为得到的DeepID1特征不同,很可能在人脸验证时错误识别为不同类别;又或者是,不同人的DeepID1特征验证位同一个人。因此,作者在设计DeepID2时,通过修改Loss函数的组成形式,在提高类间差距的基础上进一步降低类内差距,从而对训练过程中未出现的新类别在人脸验证阶段发挥积极作用。下面将具体介绍DeepID2:

Step1:DeepID2特征提取模型

DeepID1,DeepID2

DeepID2网络模型与DeepID1网络模型基本类似,DeepID2 layer的输入是有Pool3和Conv4共同组成的。这里需要注意DeepID2与DeepID1的一个重要区别是Loss函数的形式。DeepID1的Loss函数即SoftmaxLoss,DeepID2的Loss包括两个部分:SoftmaxLoss和L2/L1 Loss,即文中提到的识别Loss和验证Loss,具体形式如下所示:

DeepID1,DeepID2

DeepID1,DeepID2

第一个公式是识别Loss,其主要目的是增加类间差距,从而区分不同人脸的图像。第二个公式是验证Loss,其主要目的是增加类间差距、降低类内差距。可以看出Yij=1时表示i和j属于同一类,这时fi和fj越接近(类内差距越小)则loss越低;Yij=-1时表示i和j属于不同类,这是如果fi和fj的差值的平方大于某一个阈值m,则loss=0,因此可知对于不同类别类间差距越大,loss越小。作者认为验证loss可以从L1/L2/Cos Loss中任选一种形式,另外作者用权重lamda表示识别Loss和验证Loss的相对权重。

Step2:人脸验证

在进行人脸验证时,作者采用SDM算法从一幅人脸图像中检测到的21个脸部特征点,然后通过相似性变换进行全局人脸对齐。然后根据人脸中landmark的位置、图像颜色、图像尺度及水平镜像方式生成400个脸部patches.考虑到水平镜像的因素,对400个脸部patches可以训练200个CNNs进行识别。200个CNNs处理一幅人脸图像可以生成400组长度分别为160维的特征,即特征总长为400*160=64,000维。当然,这样的特征冗余度很高,因此作者采用前向-反向贪婪算法选取出效果最好的25组特征,这样可以生成25*160=4000维的特征。然后用PCA将4000维的特征降至180维。用联合贝叶斯人脸验证方法验证DeepID2特征。

实验结果:

1.作者验证了lamda(即验证loss的权值)对人脸验证准确率的影响。当lamda=0(相当于不用验证loss)或lamda=+无穷大(相当于不用识别loss),人脸验证效果都不如lamda在俩者之间的取值。作者采用不同的lamda取值测试L2人脸验证模型和联合贝叶斯人脸验证模型,从实验结果可以看出lamda从0增加到+无穷大时,两种人脸验证模型的准确率都是先升高后降低。

2.当用于训练DeepID2的人脸类别越丰富(即人脸类别数),通过CNN学习的特征在人脸识别阶段会越有效,该结论与DeepID1是类似的。

3.作者测试了不同形式的验证loss函数(L2+ loss, L2- loss, 余弦loss)对于人脸验证结果的影响,此处不作介绍。

4.作者选取了七组不重复的特CNN特征组合,用联合贝叶斯方法处理后,进一步采用svm对结果融合,得到最终结果99.15%。(OMG,这种处理方法.......)

总之,作者通过修改CNN网络模型(卷积层的kernel数)和Loss(最重要的修改)的方式训练得到新的DeepID2特征,通过进化版本的特征组合方式,实现了99.15%的人脸验证准确率。