Openface人脸识别的原理与过程:
https://zhuanlan.zhihu.com/p/24567586
原理可参考如下论文:
《OpenFace: A general-purpose face recognition library with mobile applications》
第一步:找出所有的面孔
我们流水线的第一步是人脸检测。
我们的目标是找出并比较当前像素与直接围绕它的像素的深度。然后我们要画一个箭头来代表图像变暗的方向:
用梯度来代替像素这事看起来没有明确目的,但其实背后的理由很充分。如果我们直接分析像素,同一个人明暗不同的两张照片将具有完全不同的像素值。但是如果只考虑亮度变化方向(direction)的话,明暗图像将会有同样的结果。这使得问题变得更容易解决!
但是保存每个像素的梯度太过细节化了,我们最终很有可能「一叶障目不见泰山」。如果能从更高的角度上观察基本的明暗流动,我们就可以看出图像的基本规律,这会比之前更好。
为了做到这一点,我们将图像分割成一些16×16像素的小方块。在每个小方块中,我们将计算出每个主方向上有多少个梯度(有多少指向上,指向右上,指向右等)。然后我们将用指向性最强那个方向的箭头来代替原来的那个小方块。
最终的结果是,我们把原始图像转换成了一个非常简单的表达形式,这种表达形式可以用一种简单的方式来捕获面部的基本结构:
利用HOG去detector人脸
HOG脸部图案第二步为面部特征点估计(face landmark estimation)。
但这次我们会使用由瓦希德·卡奇米(Vahid Kazemi)和约瑟菲娜·沙利文(Josephine Sullivan)在2014年发明的方法ERT(集成回归树)
68点序号图第三步:给脸部编码
所以,解决方案是训练一个深度卷积神经网络(就像我们在第三章做的那样)。但是,并不是让它去识别图片中的物体,这一次我们的训练是要让它为脸部生成128个测量值。通过训练网络来生成这个128个特征,使得这些特征具有如下关系:相同人的图片距离尽可能接近,而不同人的照片距离尽可能远。
每次训练要观察三个不同的脸部图像(Triplet loss):
1.加载一张已知的人的面部训练图像
2.加载同一个人的另一张照片
3.加载另外一个人的照片
机器学习专业人士把每张脸的128个测量值称为一个嵌入(embedding)。将复杂的原始数据(如图片)缩减为可由计算机生成的一个数列的方法,在机器学习(特别是语言翻译)中出现了很多次。我们正在使用的这种脸部提取方法是由Google的研究人员在2015年发明的,但也有许多类似方法存在。
该训练网络已经完成,我们只需要使用它即可生成128个特征值。
第四步:从编码中找出人的名字
面部识别分类器:基于简单线性SVM
总结:
1.使用HOG算法给图片编码,以创建图片的简化版本。使用这个简化的图像,找到其中看起来最像通用HOG面部编码的部分。
2.通过找到脸上的主要特征点,找出脸部的姿势。一旦我们找到这些特征点,就利用它们把图像扭曲,使眼睛和嘴巴居中。
3.把上一步得到的面部图像放入神经网络中,神经网络知道如何找到128个特征测量值。保存这128个测量值。
4.看看我们过去已经测量过的所有脸部,找出哪个人的测量值和我们要测量的面部最接近。这就是你要找的人!
网友评论