本文来自《FaceNet: A Unified Embedding for Face Recognition and Clustering》。时间线为2015年6月。是谷歌的做品。网络
虽然最近人脸识别领域取得了重大进展,但大规模有效地进行人脸验证和识别仍是有着不小的挑战。Florian Schroff等人所以提出了FaceNet模型,该模型能够直接将人脸图片映射到欧式空间中。在该空间中,欧式embedding能够用平方的L2距离直接表示人脸的类似度:架构
- 相同ID的人脸距离较小;
- 不一样ID的人脸距离较大。
也就是一旦若是是能直接映射到欧式空间中,那么如人脸识别,验证和人脸聚类均可以基于现有的标准方法直接用FaceNet生成的特征向量进行计算。ide
以前的人脸识别方法是在一个已知人脸ID数据集下,基于一个分类层训练深度网络,而后将中间的bottleneck层做为表征去作人脸识别的泛化(即基于训练集训练一个特征提取模型,而后将该模型,如sift同样在未知人脸甚至未知ID的人脸上提取特征)。此类方法缺点是间接性和低效性:函数
- 作预测的时候,指望bottleneck表征可以很好的对新人脸进行泛化;
- 经过使用该bottleneck层,每一个人脸获得的特征向量维度是很大的(好比1k维)。虽然有工做基于PCA作特征约间,可是PCA是一个线性模型。
FaceNet使用训练后的深度卷积网络直接对嵌入向量进行优化,而不是如以前的DL方法同样去优化所谓的bottleneck层。FaceNet基于《Distance metric learning for large margin nearest neighbor classification》采用triplet loss进行训练,并输出只有128维的embedding向量。这里的triplet包含人脸三元组(即三张人脸图片\(a,b,c\),其中\(a,b\)是来自同一个ID的人脸,\(c\)是其余ID的人脸),loss的目的就是经过一个距离边际去划分正对和负样本。这里人脸图片是只包含人脸区域的图片块,并不须要严格的2D或者3D的对齐,只须要作尺度缩放和平移便可。学习
固然选择哪一种triplet也是很重要的,受到《Curriculum learning》的启发,做者提出一个在线负样本挖掘策略,以此保证持续性增长网络训练过程当中的困难程度(分类越是错误的,包含的修正信息越多)。为了提高聚类准确度,同时提出了硬正样本挖掘策略,以提高单人的embedding特征球形聚类效果(一个聚类簇就是一我的的多张人脸图片)。
优化
类似于其余采用深度网络的方法,FaceNet也是一个彻底数据驱动的方法,直接从人脸像素级别的原始图像开始训练,获得整我的脸的表征。不使用工程化后的特征,做者暴力的经过一大堆标记人脸数据集去解决姿态,光照和其余不变性(数据为王)。本文中采用了2个深度卷积网络:spa
- 基于《Visualizing and understanding convolutional networks》的深度网络(包含多个交错的卷积层,非线性激活,局部响应归一化(local response normalizations)和最大池化层),增长了几个额外的1x1xd卷积层;
- 基于Inception模型。
做者实验发现这些模型能够减小20倍以上的参数,而且由于减小了FLOPS的数量,因此计算量也降低了。
FaceNet采用了一个深度卷积网络,这部分有2种选择(上述两种),总体结构以下图
3d
embedding表示为\(f(x)\in R^d\)。经过将一个图片\(x\)嵌入到d维欧式空间中。另外,限制这个embedding,使其处在d维超球面上,即\(||f(x)||_2=1\)。这里要确保一个特定人的图片\(x_i^a\)(锚)和该人的其余图片\(x_i^p\)(正样本)相接近且距离大于锚与其余人的图片\(x_i^n\)(负样本)。以下图所示
rest
为了保证快速收敛,须要找到那些反模式的triplet,即给定\(x_i^a\),须要选择的\(x_i^p\)(硬正样本)可以知足\(\underset{x_i^p}{\arg max}||f(x_i^a)-f(x_i^p)||_2^2\),类似的,\(x_i^n\)(硬负样本)可以知足\(\underset{x_i^n}{\arg min}||f(x_i^a)-f(x_i^n)||_2^2\)。显然无法基于整个训练集计算\(\arg min\)和\(\arg max\)。并且,如一些误标记和质量不高的人脸图像也知足此类需求,而这些样本会致使训练引入更多噪音。这能够经过两个明显的选择避免此类问题:orm
- 每隔\(n\)步离线的生成triplets,使用最近的网络checkpoint,用其基于训练集的子集计算\(\arg min\),\(\arg max\);
- 在线生成triplet,这经过一个mini-batch内部选择硬正/负样本对来实现。
本文主要关注在线生成方式。经过使用一个包含上千个样本的大mini-batch去计算所须要的\(\arg min\),\(\arg max\)。而为了确保能计算到triplet,那么就须要训练使用的mini-batch中必定要包含(锚,正类,负类)样本。FaceNet的实验中,对训练数据集进行采样,如每一个mini-batch中每一个ID选择大概40个图片。另外在对每一个mini-batch随机采样须要的负样本。
不直接挑选最硬的正样本,在mini-batch中会使用全部的(锚,正)样本对,同时也会进行负样本的选择。FaceNet中,并无将全部的硬(锚,正)样本对进行比较,不过发如今实验中全部的(锚,正)样本对在训练的开始会收敛的更稳定,更快。做者同时也采用了离线生成triplet的方法和在线方法相结合,这可让batch size变得更小,不过实验没作完。
在实际操做中,选择最硬的负样本会致使训练之初有较坏的局部最小,特别会致使造成一个折叠模型(collapsed model),即\(f(x)=0\)。为了减缓这个问题,便可以选择的负样本知足:
\[||f(x_i^a)-f(x_i^p)||_2^2<||f(x_i^a)-f(x_i^n)||_2^2\]
这些负样本称为”半硬(semi-hard)“,即虽然他们比正样本要远离锚,不过平方的距离是很接近(锚,正)样本对的距离的,这些样本处在边际\(\alpha\)内部。
如上所述,正确的triplets样本对的选择对于快速收敛相当重要。一方面,做者使用小的mini-batch以提高SGD的收敛速度;另外一方面,仔细的实现步骤让batch是包含10或者百的样本对却更有效。因此主要的限制参数就是batch size。本实验中,batch size是包含1800个样本。
本实验中,采用SGD方式和AdaGrad方式训练CNN,在实验中,学习率开始设定为0.05,而后慢慢变小。模型如《Going deeper with convolutions》同样随机初始化,在一个CPU集群上训练了1k到2k个小时。在训练开始500h以后,loss的降低开始变缓,不过接着训练也明显提高了准确度,边际\(\alpha\)为0.2。如最开始介绍的,这里有2个深度模型的选择,他们主要是参数和FLOPS的不一样。须要按照不一样的应用去决定不一样的深度网络。如数据中心跑的模型能够有许多模型,和较多的FLOPS,而运行在手机端的模型,就须要更少的参数,且要能放得下内存。全部的激活函数都是ReLU。
第二个策略就是GoogleNet,其相比少了20多倍的参数(大概6.6百万-7.5百万),且少了5倍的FLOPS(基于500M-1.6B)。因此这里的模型能够运行在手机端。如:
- NNS1只有26M参数量,须要220M FLOPS的计算;
- NNS2有4.3M参数量,且只须要20M FLOPS计算量。
表2描述了NN2网络结构,NN3架构是同样的,只是输入层变成了160x160。NN4输入层只有96x96,所以须要更少的CPU计算量(285M的FLOPS,而NN2有1.6B)。另外,为了减小输入尺度,在高层网络层,也不使用5x5的卷积。并且实验发现移除了5x5的卷积,对最后结果没什么影响。如图4
......