人脸识别
2018-02-27 21:56
155 查看
1、什么是人脸识别?
人脸识别可以分为两个方面,一个是人脸验证,另一个是人脸识别。
人脸验证指的是:假设我们有一个人的画像(Tony),我们需要根据这个画像验证来人是不是Tony本人。
人脸识别指的是:如果我们有一个人脸数据集(大小为K),我们需要识别来人是不是我们的人脸数据集里面的人。
人脸识别的准确率必须依托于人脸验证的准确率。
2、如何解决一次学习问题?
人脸识别问题所面临的一个挑战,就是需要解决一次学习问题。这意味着,在绝大多数人脸识别应用中,你需要通过单单一张图片或者单单一个人脸样例就能去识别这个人。但是,纵观深度学习问题,当深度学习只有一个人脸样例时,它的表现并不好。
要想解决一次学习问题,我们必须先构造“similarity”函数。
接下来,构建“similarity”函数首先得通过Siamese网络。
3、Siamese网络
你要计算“similarity”函数,你实际要做的就是训练一个网络,它计算得到的编码可以用于函数d,它可以告诉你两张图片是否是同一个人。这个网络就是“Siamese”网络。
所以每一张人脸图像都会对应着一个128维的向量编码。
如果你要比较两个图片的话,你要做的就是把第二个图片喂给有同样参数的神经网络,然后得到一个不一样的128维的向量。
假设两张人脸图像的128维的向量编码分别为f(x(1))和f(x(2))。那么你要做的就是计算这两个向量的二范数的平方,如果计算结果小于τ,表示这两张人脸图像是一个人,否则,这两张人脸图像表示不同的人。
接下来,讨论这个Siamese网络的损失函数。
4、Triplet损失函数(三元组损失函数)
要想通过学习神经网络的参数来得到优质的人脸图片编码,方法之一就是定义三元组损失函数然后应用梯度下降。
三元组意味着你需要同时看三张图片。
如下图所示为三元组损失函数的基本思想(Positive意味着同一个人,Negative意味着不同的人)
假如你有一个10000个图片的训练集,里面是1000个不同的人的照片,你要做的就是取这10000个图片,然后生成这样的三元组,然后训练你的学习模型,对这种代价函数使用梯度下降。
那么为什么数据集是1000个人的10000张照片呢?这是因为为了定义三元组的数据集,你需要成对的A和P,即同一个人的成对的图片,为了训练你的系统,你确实需要一个数据集,里面有同一个人的多张照片。
接下来,让我们说说Triplet损失函数的数学表达式。
现在我们来看,你如何选择这些三元组来形成训练集,一个问题是如果你从训练集中随机地选择AP和N,因为是随机地选择,那么这个条件很容易达到(A和N比A和P差别很大的概率很大)
所以你要做的就是尽可能的选择难训练的三元组A、P和N。如果你想知道细节的话,那么这篇论文可能对你有帮助(Schroff et al,2015,FaceNet:A unified embedding for face recognition and clustering)
5、面部验证与二分类
Triplet损失是一个训练人脸识别卷积网络参数的好办法,但是还有其他学习参数的方法,这个方法就是将人脸识别当成一个二分类问题。
假设我们把得到的128维的人脸编码放入逻辑回归中,最后的逻辑回归可以增加参数w和b,就想普通的逻辑回归一样,你将在这128个单元上训练合适的权重用来预测两张图片是否是同一个人,这是一个很合理的方法,来学习预测0或者1。
监督学习下的人脸验证代价函数:
人脸识别可以分为两个方面,一个是人脸验证,另一个是人脸识别。
人脸验证指的是:假设我们有一个人的画像(Tony),我们需要根据这个画像验证来人是不是Tony本人。
人脸识别指的是:如果我们有一个人脸数据集(大小为K),我们需要识别来人是不是我们的人脸数据集里面的人。
人脸识别的准确率必须依托于人脸验证的准确率。
2、如何解决一次学习问题?
人脸识别问题所面临的一个挑战,就是需要解决一次学习问题。这意味着,在绝大多数人脸识别应用中,你需要通过单单一张图片或者单单一个人脸样例就能去识别这个人。但是,纵观深度学习问题,当深度学习只有一个人脸样例时,它的表现并不好。
要想解决一次学习问题,我们必须先构造“similarity”函数。
接下来,构建“similarity”函数首先得通过Siamese网络。
3、Siamese网络
你要计算“similarity”函数,你实际要做的就是训练一个网络,它计算得到的编码可以用于函数d,它可以告诉你两张图片是否是同一个人。这个网络就是“Siamese”网络。
所以每一张人脸图像都会对应着一个128维的向量编码。
如果你要比较两个图片的话,你要做的就是把第二个图片喂给有同样参数的神经网络,然后得到一个不一样的128维的向量。
假设两张人脸图像的128维的向量编码分别为f(x(1))和f(x(2))。那么你要做的就是计算这两个向量的二范数的平方,如果计算结果小于τ,表示这两张人脸图像是一个人,否则,这两张人脸图像表示不同的人。
接下来,讨论这个Siamese网络的损失函数。
4、Triplet损失函数(三元组损失函数)
要想通过学习神经网络的参数来得到优质的人脸图片编码,方法之一就是定义三元组损失函数然后应用梯度下降。
三元组意味着你需要同时看三张图片。
如下图所示为三元组损失函数的基本思想(Positive意味着同一个人,Negative意味着不同的人)
假如你有一个10000个图片的训练集,里面是1000个不同的人的照片,你要做的就是取这10000个图片,然后生成这样的三元组,然后训练你的学习模型,对这种代价函数使用梯度下降。
那么为什么数据集是1000个人的10000张照片呢?这是因为为了定义三元组的数据集,你需要成对的A和P,即同一个人的成对的图片,为了训练你的系统,你确实需要一个数据集,里面有同一个人的多张照片。
接下来,让我们说说Triplet损失函数的数学表达式。
现在我们来看,你如何选择这些三元组来形成训练集,一个问题是如果你从训练集中随机地选择AP和N,因为是随机地选择,那么这个条件很容易达到(A和N比A和P差别很大的概率很大)
所以你要做的就是尽可能的选择难训练的三元组A、P和N。如果你想知道细节的话,那么这篇论文可能对你有帮助(Schroff et al,2015,FaceNet:A unified embedding for face recognition and clustering)
5、面部验证与二分类
Triplet损失是一个训练人脸识别卷积网络参数的好办法,但是还有其他学习参数的方法,这个方法就是将人脸识别当成一个二分类问题。
假设我们把得到的128维的人脸编码放入逻辑回归中,最后的逻辑回归可以增加参数w和b,就想普通的逻辑回归一样,你将在这128个单元上训练合适的权重用来预测两张图片是否是同一个人,这是一个很合理的方法,来学习预测0或者1。
监督学习下的人脸验证代价函数:
相关文章推荐
- 人脸识别中的机器学习(Pyton)
- 人脸识别的主要算法以及原理
- 人脸识别之人脸对齐(一)--定义及作用
- DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现)
- 【计算机视觉】人脸识别之人脸对齐(一)--定义及作用
- 人脸识别算法之pca 主成分分析法
- C# OpenCV学习笔记六之人脸识别/五官识别测试
- 人脸识别---OpenCV3.3+VS2017环境配置
- QT+Opencv实现人脸检测与性别识别(1)
- caffe 之 matlab 接口实现 做人脸识别--之人脸关键点检测
- Python3利用Dlib19.7实现摄像头人脸识别的方法
- PHP实现微信小程序人脸识别刷脸登录功能
- iOS 人脸识别(检测)
- 人脸识别API/SDK 汇总
- 1-001.人脸识别
- Haar特征检测 - 人脸识别
- 机器学习原来如此有趣:用深度学习识别人脸
- 【OpenCV人脸识别入门教程之二】人脸检测
- 人脸识别的十个概念
- 人脸识别