经典计算机视觉论文笔记——DeepFace\DeepID\DeepID2\DeepID3\FaceNet\VGGFace汇总

1. DeepFace:Closing the Gap to Human-Level Performance in Face Verification

       最早将深度学习用于人脸验证的开创性工作。Facebook AI实验室出品。动用了百万级的大规模数据库。典型的识别信号提特征+验证信号refine的两步走,对DeepID等后人的工作影响很大。

技术概括

关注了人脸验证流程中的人脸对齐步,采用了比较复杂的 3D 人脸建模技术和逐块的仿射变换进行人脸对齐。可以解决 non-planarity 对齐问题。 提出了一个 9 层(其实是 8 层)的 CNN 进行特征提取。提出了一种针对对齐后人脸的的 locally connected layers ,无权值共享。 CNN 提取的特征继续进行 metric learning ,包括卡方距离学习和 siamese network 两种方法。

一些值得反思的细节

CNN 的结构: conv-->pooling-->conv-->3 locally connected layers-->2 fc 。由于最后 5 层都没有权值共享,所以会造成参数膨胀,共有超过 1.2 亿个参数,其中 95% 都来源于最后 5 层。但 locally connected layers 相比原始的 conv 计算速度是一样的。因为动用了目前看来也是惊人的 4000 人的 400 百万幅图像,所以没有出现明显的过拟合。 单个 CNN 最后提取的特征维数是 4096 3D 对齐的步骤是:找 6 landmarks--> 进行 2D 对齐 --> 重找 6 landmarks--> 重进行 2D 对齐 …… 直到收敛 --> 67 landmarks-->3D-2D 映射建模 --> 逐块仿射变换变成正脸。此处水很深,实现起来较复杂,而且后续的论文都没有再用如此复杂的对齐手段也能得到非常好的结果,不建议复现。但对比实验表明 3D 对齐的作用还是很大的,可能是和采用的算法有关系吧,比如针对 3D 对齐定制的 locally connected layers pooling 只使用一次,担心信息损失太多。 只对第一个 fc layer 采用了 dropout CNN 提取完的特征还要进行两次归一化。第一次是每个分量除以训练集中的最大值,第二次是 l2 归一化。此步似乎多余,也没有足够的理论和实验支撑,又回到了人工特征的老路。归一化本身是一种降低特征之间差异的手段,不一定就可以增强 discriminative ability ,应该慎重使用。 CNN 学习出特征后,还需要用某种相似度来做验证。文中采用了两种比较简单的相似度:加权卡方距离和加权 L1 距离。权重分别通过 SVM siamese network 学习到。这一步一般是进行迁移学习。 相似度量学习到后,还要训练一个 SVM 对两两距离做 2 分类,判断是否是同一个人。 数据库: 4030 个人,每人 800-1200 幅图像, 4 40 万幅图像。 10 种网络的距离结果 ensemble ,累加 kernel matrix ,再用 SVM 对距离做分类,判断是否是同一个人。 通过牛逼的工程优化,在 2.2GHz CPU 上可做到 CNN0.18 秒,对齐 0.05 秒,全部 0.33 秒。

2. Deep LearningFace Representation from Predicting 10,000 Classes

       汤晓鸥团队DeepID系列的开创之作。也是典型的两步走策略。

技术概括

训练一个 9 CNN 对约 10000 个人(其实是 8700 个人)做人脸识别,中间有跨层连接和 locally connected layer 。倒数第二层的输出作为特征。 多个人脸区域的特征进行连接作为总特征。 CNN 学习出的特征再训练一个 joint bayesian 进行人脸验证。

一些值得反思的细节

单个 CNN 训练出的特征是 160 维,维度非常小,具有极强的压缩性质。 明确提出识别信号的作用,强于只使用验证信号。 CNN 的结构: conv1-->pooling1-->conv2-->pooling2-->conv3-->pooling3-->conv4-->fc-->softmax 。其中 conv3 只在每个 2*2 局部区域权值共享, conv4 locally connected layer ,权值不共享。 fc 同时与 pooling3 conv4 全连接,是一种多分辨率策略。 CNN 输入会根据 patch 的不同而改变,后续的 feature maps 都会跟着改变。 人脸对齐采用 3 landmarks 。根据 5 landmarks 采样 patches 。一共 10 regions*3 scales*1 RGB*1 gray=60 patches 。每个 patch 还要取 flip 。所以,最后要训练 60*2=120 CNN !最后把每个 CNN 160 维特征连接成 160*2*60=19200 维特征。工作量有点大。 CNN 学习出的特征训练了 joint bayesian 和一个验证用的神经网络。验证用神经网络只是一个三层的浅层网络,输入是成对的图像 patches 19200*2 维,输出层是 2 分类结果输出。对比结果显示这种神经网络没有 joint bayesian 效果好。 训练 joint bayesian 前用 PCA 19200 维特征降维到 150 数据库包括 10177 个人,共 202599 幅图像。

3. Deep LearningFace Representation by Joint Identification-Verification

       超越人类水平(97.53%)。不过同是晓鸥团队的gaussian face是第一次超越人类。

技术概括

明确采用两种监督信号:识别信号用于增加类间距离,验证信号用于减少类内距离(肯定也是有利于增加类间距离的)。 相比于 DeepID loss 层除了用于分类的 softmax loss ,还加入了 contrastive loss 。两种 loss 同时反向传播。 相比于 DeepID ,从众多 patches 中挑选出了 25 个最佳 pathes ,减少计算负担和信息冗余。 验证采用 joint bayesian 或直接用 L2 距离。

一些值得反思的细节

CNN 结构除了最后的 loss 层外与 DeepID 一样。输出是 8192 个人的分类结果。 400 patches 中挑选了 25 个。训练 25 CNN ,最后连接成的特征向量是 25*160=4000 维。在训练 joint bayesian 之前,要通过 PCA 进一步降维到 180 维。 因为加入了 contrasitive loss CNN 学习出的特征可以直接用于计算 L2 距离进行人脸验证,效果不会比 joint bayesian 差很多。 最后通过选择不同的 patches ,训练了 7 个分类器做 ensemble

4. Deeply learnedface representations are sparse, selective, and robust

       一半内容是理论分析。总体上两步走策略没变,只是CNN结构做了较大改变。

技术概括

增加隐含层的宽度,即 feature maps 个数。 监督信息跨层连接。 理论分析 DeepID2+ 的特征是 sparsity\selectiveness\robustness sparsity 是指特征向量中有许多分量为 0 ,因此具有压缩能力。 selectiveness 是指某个分量对某个人的图像或某种属性的图像的激活响应程度和其他人或属性的程度不一样,因此具有判别能力。 robustness 是指图像特征在遮挡前后具有一定的不变性。 利用 sparsity 进行特征二值化,可用于大规模图像检索。

一些值得反思的细节

训练集中没有特意加入遮挡样本,但学习出的特征也具有遮挡的鲁棒性。 相比于 DeepID2 feature maps 的个数由 20 40 60 80 变为 128 128 128 128 。输出的特征维数由 160 变为 512 相比于 DeepID2 25 patches 还要再取一次 flip ,训练 50 CNN ,特征维数共 50*512=25600 维。 数据库: 12000 个人, 290000 幅图像。 fc loss 层连接到之前的每一个 pooling 层后面,也就是类似 googlenet 的策略,让监督信息直接作用到每一层。但 fc 层应该权值不共享。 通过对人脸属性方面的分析,说明通过人脸识别与验证信号学习到某个神经元是对某种属性有更强的激活响应。所有这些神经元的组合代表了各种属性的特征组合,说明通过这些中层属性特征可以对高层的身份特征进行差别,与 kumar 的工作有异曲同工之妙。

5. DeepID3: FaceRecognition with Very Deep Neural Networks

       针对CNN的结构做了较大改进,采用图像识别方面的最新网络结构,且层数加深。其他方面较前作没有变化。

技术概括

实现了两种更深层的 CNN 网络,一种是参考 VGG conv 层的不断堆积,一种是参考 googlenet inception 结构的不断堆积。 继续采用 DeepID2+ 中的监督信号跨层连接策略。 继续采用 DeepID2+ 中的 25 patches (加 flip )特征组合策略。其中 VGG googlenet 各训练一半。 继续采用 DeepID2+ 中的 joint bayesian 用于验证的策略。

一些值得反思的细节

VGG CNN 结构: conv1\2-->pooling1-->conv3\4-->pooling2-->conv5\6-->pooling3-->conv7\8-->pooling4-->lc9\10 fc loss 连接到之前每一个 pooling 层后面。 googlenet CNN 结构: conv1\2-->pooling1-->conv3\4-->pooling2-->inception5\6\7-->pooling3-->inception8\9-->pooling4 fc loss 连接到之前每一个 pooling 层后面。 relu 用于除了 pooling 层之外的所有层。 dropout 用于最后的特征提取层。 特征总长度大约 30000 维。 PCA 降维到 300 维。 DeepID2+ 比起来,精度几乎没有提高。可能还是网络过浅,训练数据过少,没有完全发挥 VGG googlenet 的效果。

6. FaceNet: AUnified Embedding for Face Recognition and Clustering

       非两步式方法,end-to-end方法。在LFW的精度基本上到极限了,虽然后面还有百度等99.77%以上的精度,但从原理上没有创新,也是用了triplet loss等本文得出的技术。

技术概括

提出了一种 end-to-end 的网络结构,最后连接的是 triplet loss 。这样提取的特征可以直接用欧氏距离算相似度。 提出了样本选择技术,找 hard triplets 。这一步至关重要,选不好可能会不收敛。

一些值得反思的细节

特征维度: 128 。可以二值化,效果也不错。 triplet loss 为什么比 contrastive loss 好没有解释得太清楚。两者都有 margin 的概念,而不是像本文所说的是其独有。 triplets 选择有两种方法。 1. 线下选择。用训练中途的网络去找一个样本集中的 hard triplets 2. 线上选择。也是本文最终所采用的方式。从当前 mini-batch 中选择。每个 mini-batch 取几千个( 1800 个)样本,其中保证每人至少 40 个样本。负样本随机采样即可。所有正样本对都用,只选择负样本对。 实际选择 hard negtives 的时候,松弛条件,只选择 semi-hard ,也就是负样本对的距离比正样本对的距离大,但距离小于 margin 即可。 margin:0.2 设计了两种 CNN 结构。 1.VGG 类中加入了 1*1 kernel 。共 22 层。 1.4 亿个参数。 16 亿 FLOPS 2.googlenet 类基于 Inception 模型,其中两个小模型 NNS1 26M 参数, 220M FLOPS NNS2 4.3M 参数, 20M FLOPS 。三个大模型 NN3 NN4 NN2 结构一样,但输入变小了。 NN2 输入: 224×224 NN3 输入: 160×160 NN4 输入: 96×96 。采用了 l2 pooling ,没有用常规的 max pooling ,不知原委。 数据库规模超大。 800 万人,共 2 亿幅图像。 无需对齐。

7. Deep FaceRecognition

       精度上并没有超越前人,但网络结构较易实现,而且提出了一些有很强实践性的工作流程。

技术概括

提出了一个低成本的图像标注流程。 用最朴素的 conv 层不断堆积建造了一个 38 层(另外还有 40 层、 43 层)的 CNN 2622 个人的分类,学习识别信号,最后用 triplet loss 学习验证信号,将特征映射到一个欧氏距离空间用 L2 距离作为相似度。

一些值得反思的细节

数据库: 2600 人, 260 万幅图像。大约每人 1000 幅。 标注团队: 200 人。 图像标注流程如下。 1. 建立人名列表和初步爬图。主要集中于名人,便于从网上获取大量样本,共 5000 人,男女各半。再进行过滤,过滤掉样本太少的、与 lfw 有重合的、按人名爬取的图像不准确的。最后剩下 2622 人,每人 200 幅。 2. 收集更多的图像。从其他搜索引擎、关键词加 演员 等附加词,扩充到每人 2000 幅。 3. 用分类器自动过滤。训练样本采用搜索引擎 rank 最高的 50 幅,用 Fisher Vector 训练 1 对多 SVM 。最后保留每人 2000 幅中分数最高的 1000 幅。要训练 2622 SVM ,工作量巨大。 4. 去重。 5. 人工审核加分类器自动过滤。训练一个 CNN ,每个人分数低的样本就丢弃。最后剩 982803 幅图像。前 4 步只花了 4 天,整个流程花了 14 天。 特征维度: 1024 CNN 结构中不包括 LRN 输入减去了平均脸。没有进行颜色扰动。 mini-batch size= 64 。这个设得有点太小了。 dropout 用于两个 fc 层。 triplet loss 用于 fine-tune 。前面几层的参数都固定不变,只变新加的 fc 层。 triplet 中的负样本只选与 anchor 距离超过 margin 的。 3scales*10patches = 30 patches 。最后这 30 个特征取平均(原文如此,感觉特征取平均会乱套的,一般都是分类结果取平均或 voting

借鉴之处

人脸对齐是必要的,但没必要做精准对齐。训练时不太用准,测试时可以精准。 跨层连接有利于信息流的反馈传播,有利于效果提升。 识别与验证信号都有用,缺一不可。 多个 patches 结合效果明显,但增加了计算负担。 多个 model 结合效果明显,但增加了计算负担。 大规模训练数据量。人数和图像总数都是越多越好。 joint bayesian 、直接用相似度距离均可,关键是学习出的特征是否有效。 可以先用一般类型的图像学习 N 路识别 CNN ,再用测试图像类型迁移学习验证信号。 也可以直接 end-to-end 特征二值化,有利于哈希检索。


你可能感兴趣的:(论文笔记,算法解读)