目录
前言
人脸识别应用是目前应用最广的一个深度学习的落地项目,如下图所示,只有真正的人脸才可以成功识别。
人脸验证(face verification):判断输入图片和名字是否相符,是一个1:1的问题。
人脸识别(face recognition):是一个1:K的问题,假如人脸验证的准确率是99%,那么一个识别100人的系统则犯错概率是1%×100,即100人中很有可能会识别错误1个人,这是无法落地的。
人脸验证的准确率需要足够高,如99.99%,才能用来构造人脸识别系统。人脸验证的难点是如何解决一次学习(one-shot)的问题。
一次学习 (one-shot learning)
one-shot learning:只有一个训练样本,就能成功训练模型。
要让人脸识别能够做到一次学习,现在要做的应该是构造一个神经网络训练Similarity函数。详细地说,通过神经网络学习这样一个用d表示的函数, ,它以两张图片作为输入,然后输出这两张图片的差异值。如果你放进同一个人的两张照片,你希望它能输出一个很小的值,如果放进两个长相差别很大的人的照片,它就输出一个很大的值。然后设定一个阈值,如果相似函数输出的值小于阈值,则系统认为是同一个人,这样还有一个好处是增加新的识别人脸不需要重新训练神经网络,只需要把这个人的脸送入相似函数运行的数据库中就行。
Siamese网络(孪生神经网络)
可以通过Siamese网络实现图片的相似度判断。
这里跟卷积神经网络的区别是,没有softmax函数,最后全连接层计算出的值作为编码图像的列向量。
将 和
的距离定义为这两幅图片的编码之差的范数,即相似度等于
。
(对于两个不同的输入,运行相同的卷积神经网络,然后比较它们,这一般叫做Siamese网络架构。)
Triplet损失(三元组损失)
如何训练一个神经网络的参数,让其可以成功编码人脸图片?方法之一就是定义Triplet(三元组损失)函数,然后通过梯度下降等反向传播更新网络参数。
数据集据包括锚(Anchor)示例、正(Positive)示例、负(Negative)示例 (positive表示是同一个人)
训练网络时,让anchor和positive的编码相似度大,并且anchor和negative的编码相似度小。即,
但是如果两边都等于0,则这个式子恒成立却无任何意义。所以会加上一个超参数α(可以理解为间隔,类似SVM中的间隔),变形如下:
即 ,间隔越大,则编码差别要越大。
所以Triplet损失(三元组)代表需要同时看三张图片。
Loss function:
(这样的好处是只要损失函数小于等于0,网络不会关心负值的大小)
注意:为了定义triplet损失,训练的数据集中 需要有一部分人是有成对的照片的,这样才会有成对的Ancho和Positive图片。
问题- 如何从训练集中选择A、P、N ?
好的训练样本应该是让d(A,P) 很接近d(A,N), 这样才会让神经网络更新选择让d(A,P)尽可能小,d(A,N)尽可能大。
人脸验证与二分类
除了用Triplet loss的方法,另一种训练神经网络的方法转化为分类问题,具体是选取一对神经网络,使其同时计算出f(x(i))的列向量,然后将其一起输入逻辑回归单元,然后预测输出1,0,表示是不是相同的人。
还有一些变形来代替绿色标记的公式,如 ,这个公式也被叫做
公式
下面的图片是数据库,可以先提前计算好列向量(这样可以不存储原始图像),比较的时候,只需要比较新的图片的列向量。