版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hongbin_xu/article/details/83794143
Deep Learning Face Representation by Joint Identification-Verification
DeepID2
1、四个问题
- 要解决什么问题?
- 人脸识别。
- 主要挑战是,设计一套方法能够有效地减少类内差异,并增大类间差异。
- 用了什么方法解决?
- 使用face identification(人脸分类)和face verification(人脸验证)信号进行监督学习。训练了一个CNN用于次任务。
- 效果如何?
- 老论文了,就看个思路。
- 最后在LFW上达到了99.15%的人脸验证准确率。
- 还存在什么问题?
- 由于是较早的论文,网络结构设计以及训练上有一定局限性。
2、论文概述
2.1、网络结构
- 网络结构很简单,类似于LeNet。卷积层+池化层组合,经过四层后,将卷积层展开为全连接层,用来输出特征向量。
2.2、Identification和verification
- 首先是人脸分类(face identification)信号,主要用于将人脸划分为 个类(人)。
- 人脸分类需要在上面的网络之后加上一个有 个输出的softmax层,用来输出预测的每个类的概率值。
- 公式如下:
- 然后是人脸验证(face verification)信号,提取得到的特征向量对于类内来说距离更小,对于类间来说距离更大。
- 直接把上面网络的输出作为特征向量,使用L1/L2范数计算特征之差,使用L2范数作损失函数的效果会更好。实质上,使用L2范数衡量的是特征向量之间的欧式距离。
- 公式如下:
- 关于公式的几个看法:
- 意味着样本是同类,这时我们需要让同类之间的特征向量差值尽可能小,所以就最小化两个特征向量的L2范数。
- 意味着是不同类,这时候我们想让不同类之间的特征向量的距离比同类之间的特征向量的距离大,但不能是无穷大,所以又加入了一个常数 ,防止让欧式距离趋近于无穷大。考虑到人脸任务中,两张脸有些地方是会有一定的相似性,但并意味着我们完全不需要此类信息,比如:这两个人脸的鼻子都很大,并不意味着就可以丢掉鼻子大小这个信息,也许有的人鼻子大小差异又会比较大。
- 如果考虑的是余弦相似度函数,公式如下图所示:
- 公式说明:
- 是特征向量之间的余弦相似度。
- 是sigmoid函数。
- 是label。
2.3、训练流程
2.4、算法流程
- 使用SDM算法抽取人脸上的21个标记,然后根据得到的标记对人脸进行对齐。通过变化位置、尺度、颜色通道,得到200个face patch,对每个face patch,使用该patch及其水平反转的图像进行特征学习。所以,一共需要200个深度卷积神经网络。
- 作者将论文中的深度卷积神经网络框架称为DeepID2。接着,作者使用200个DeepID2来学习上一步得到的patch,每个DeepID2都会将输入图像转换成一个160维的特征向量。
- 对每张图像而言,经过200个DeepID2学习到的特征数目为200*160,特征数目太大了。所以论文中使用前向后向贪心算法来选取一些有效且互补的DeepID2向量,以节约时间。注意,特征选择在每个DeepID2向量间进行,也就是一个DeepID2输出的向量,要么全被选中,要么全不被选中。
- 选中25个向量后,每张图像的维度是25*160=4000维。仍然太大,因而使用PCA进行降维,降维后大约有180维。
- 最后使用联合贝叶斯模型用来进行人脸验证。