人脸识别之DeepID模型

本博文仅提供自己对DeepID的理解,如有错误希望大家能够及时指出。

DeepID模型是人脸识别中主流的模型之一,它采用4层卷积网络,三层池化,并且最后一层和倒数第一层的卷积层以及倒数第二层的池化层全连接,具体的文章见文章地址 。关于该文章的具体内容大家可以阅读文献。以下主要介绍一下自己对文章的理解。

1. 人脸识别目前主要面临的挑战是人脸图片较大的类内变化和较小的类间变化。也就是说在人脸图片中由于人脸的角度,光照,表情,年龄,遮挡,图片质量等因素往往会导致相同的图片之间会存在较大的差异。同时随着待识别的人数增加。有些不同的人也会出现相似的情况。如何准确识别出这类人的信息是关键。

2. 针对上述问题DeepID采用了身份信号和鉴定信号相结合的方式作为最终的损失函数,这样可以保证训练出来的特征在人与人之间的差异较大(用来分类),人与人之间的差异较小(用来进行识别)具体实现方式见下:

一、网络结构:

       


由上述网络结构可以看出,DeepID采用的是4层卷积,3层池化,1层全连接层的网络结构学习出160维的特征。第一层卷积采用的是4X4X20的卷积核,池化层的方式是2X2步长为2。第二个卷积层采用的是3X3X40的卷积核,池化层依然是2X2,第三层采用的是3X3X60的卷积核,池化层的方式不变,最后一层采用的是2X2X80的卷积核。

该网络的特殊性在于最后一个卷积层和最后一个池化层均和最后的全连接层直接相连。主要是由于神经网络层数越高视野域越大,所以这样可以考虑局部和全局特性(一个视野域高一个视野率低)相互弥补。

二、DeepID和DeepID2的区别

DeepID是根据结果直接(160向量)进行分类训练,分类的目标向量(做比较的向量,真实值)采用0-1法生成。此时仅仅用到了身份信息。利用分类结果定义对应的损失函数并将数据按batch的方式传给训练过程。

DeepID2是对损失函数进行了修改,除了根据分类结果定义损失函数外还根据鉴定结果(两张图片是不是一个人)定义了对应的损失函数。两个损失函数按照比重叠加作为最终的函数进行训练。其训练方式也不在是按batch传入,而是按照随机选取对应的图片对进行训练和更新。具体方式如下:





三、训练前的数据处理:(数据增强的方式)

在训练前先对图片使用SDM方法检测出21个检测点,然后根据这些检测点,加上位置,尺度,通道,水平翻转等因素将每张脸变成400张的patch,400张patch再使用200个卷积网络训练出400个160维的向量(对于翻转得到的两张图片采用同一个网络进行训练)。然后在使用PCA降维(DeepID的方式)。

由于上述产生的向量维数过高,所以DeepID2采用了向前-向后贪心算法选取了最优的25个patch,然后在生成25X160维的向量,最终再使用PCA降维。

四、训练中:(数据选取)

DeepID2采用的是CelebFaces+数据集进行训练,FLW数据集进行验证(LFW数据有些身份只有一张照片不适合用来训练)。具体将CelebFaces+数据按4:1分两份,其中4用来进行特征训练,1用来进行验证。整个训练过程的损失函数依然按照上述定义的方式。

五、训练之后的处理:

在训练之后DeepID进行了特征选取,主要是由于上述分类器只是针对训练数据进行具有较低的泛化(训练数据有多少类就分为多少类)能力,因此根据结果选取出的特征进行贝叶斯训练寻找适合身份鉴定的分类器(两张图片是不是同一个人)就显的很重要了,同时也是对特征的一个使用。此时使用的数据是上述训练过程中的验证集(1的那一部分)。同时在训练过程中选取7个最好的25patch(即先选25个训练,在剩下的里面再选25个依次类推),训练出的7个贝叶斯分类器通过svm融合最终生成一个分类器。将结果在LFW数据集上进行验证。(组合分类器原理)


猜你喜欢

转载自blog.csdn.net/hh_2018/article/details/80540067