face recognition&&one-shot learning
1、人脸验证与人脸识别:
(1)人脸验证(Verification)
Input:图片、名字/ID
Output:输入的图片是否是对应的人
1 to 1问题
(2)人脸识别(recognition)
拥有一个具有K个人的数据库
输入一副人脸图像
如果图片是任意这k个人中的一位,则输出对应人的ID
2、one shot learning
对于大多数的人脸识别系统都存在一个问题就是one shot learning
对于一个人脸识别系统来说,我们需要仅仅通过先前的一张人脸的图片或者是一个样例,就实现对人的识别,这样的问题就是one shot learning,系统可以识别到对应的人。
对于one shot learning来说,因为只有单个样本,是不足以训练一个稳健的卷积神经网络来进行不同人的识别过程。而且如果有新的成员加入的话,还需要对网络重新训练,这是不现实的。
3、Similarity函数:
(1)d(img1, img2):两幅图片的差异
(2)Input:two images
(3)Output:差异度
(3)if d(img1, img2) <= threshold
Similarity函数实现:
因此:如果x1,x2是同一幅图片,那么很小,反之很大
4、Siamese网络:
对于一个卷积网络,我们去掉最后的softmax层,将图片输入,最后输出一个N维的向量(图中以N=128)。将不同人的图片样本输入相同参数的网络结构,得到各自的图片的编码。
5、Triplet损失函数
为了使用Triplet损失函数,我们需要比较成对的图像(三元组术语)
(1)Anchor(A):目标图片
(2)Positive(P):与A同一人的图片
(3)Negative(N):与A不同人的图片
所以:
也就是
上面的公式存在一个问题,就是当时,也就是神经网络学习到的函数总是输出0时,或者
时,也满足上面的公式,为了防止出现这些情况,我们对上式进行修改:
(称为"margin")即:
,
作为超参数,不同大小有不同的效果。
因此通过上面的推到我们可以定义triplet损失函数:
理解:当z小于0时,我们可以认为这个差距是满足我们的要求的,不需要对参数调整做出贡献,因此,我们可以把代价作为0,即0与负数中的较大值0,当z大于0时,相同图片的编码差异比不同图片的编码差异还大,这是需要做出调整的,因此计入损失函数中。
整个网络的代价:
6、Simaese二分类改进
除了利用上面的Triplet损失函数来学习人脸识别卷积网络参数的方法外,还有其他方式。我们可以将人脸识别问题利用Siamese网络当成一个二分类问题,同样可以实现参数的学习。
对两张图片应用Simaese网络,计算得到两张图片的N维编码,然后将两个编码输入到一个logistic regression单元中,然后进行预测。相同的人则输出1,否则输出0。
对于最后的sigmoid函数,我们可以进行如下计算:
将两个向量对应元素的差值作为特征输入到logistic regression的单元中,增加参数,
,通过训练得到合适的参数权重和偏置,进而判断两张图片是否是同一个人。同时输入逻辑回归单元还可以进行更改:
,也称为卡方公式、卡方相似度。
在实际的人脸验证系统中,我们可以对数据库的人脸图片进行预计算,存储卷积网络得到的编码。当有图片进行识别时,运用卷积网络计算新图片的编码,与预计算保存好的编码输入到逻辑回归单元中进行预测。这样可以提高我们系统预测的效率,节省计算时间。
利用Siamese 网络,我们可以将人脸验证当作一个监督学习,创建成对的训练集和是否同一个人的输出标签。
以上内容来自:https://zhuanlan.zhihu.com/p/31485345