【干货】通过OpenFace来理解人脸识别

【导读】本文是Stephanie Kim的一篇博文你,作者探讨的是一个老生常谈的话题“人脸识别”,介绍针对人脸识别任务的一个特定的开源库——OpenFace。作者之所以专门介绍该开源库,说明该库必然是有其独特的优势。与Google FaceNet和Facebook DeepFace不同,它主要聚焦在移动设备上的实时人脸识别,旨在用少量数据实现高准确率。本文还介绍了OpenFace原理、训练过程、及相关案例,刚兴趣的读者不妨读一读,相信不会令你失望。专知内容组编辑整理。


Understanding Facial Recognition Through OpenFace

人脸识别已经成为我们生活中越来越普遍的一部分。


如今,智能手机使用人脸识别来进行访问控制,动画电影如(“阿凡达”)则使用它来为带来逼真的运动和表情。警方的监控摄像机使用脸部识别软件来识别被逮捕的罪犯,这些模型也被用于零售店进行有针对性的营销活动。当然,我们都会使用celebrity look-a-like和Facebook’s auto tagger等应用来对我们自己,我们的朋友以及我们的家人进行分类。


人脸识别可用于许多不同的应用,但并不是所有的人脸识别库在准确性和性能上都是相同的,大多数最先进的人脸识别系统都是专有的黑箱。


OpenFace是一个开放源代码库,可以与专有模型的性能和准确性相媲美。这个项目是在考虑移动设备的情况下创建的,所以让我们来看一些使这个库快速准确的内部实现,并列举一些案例来说明为什么你可能想要在你的项目中使用它。


高层架构概览




OpenFace是一个由Brandon Amos,Bartosz Ludwiczuk和Mahadev Satyanarayanan开发的深度学习面部识别模型。它基于这篇文章:FaceNet: A Unified Embedding for Face Recognition and Clustering,该文由Florian Schroff,Dmitry Kalenichenko和James Philbin在Google发表,并且使用Python和Torch进行实现,因此可以在CPU或GPU上运行。


虽然OpenFace只有几年的历史,但它被广泛采用,因为它提供了相当于Google FaceNet或Facebook DeepFace等企业级的最新人脸识别准确性水平的人脸识别模型。


除了开源之外,OpenFace还有一个特别的好处,那就是该模型的开发主要集中在移动设备上的实时人脸识别,因此可以在很少的数据的情况下以高精度训练模型。


 

从高层面来看,OpenFace使用Torch来进行离线训练,这意味着OpenFace只需进行一次训练并且用户也不必亲自来训练这些海量的图片。这些图像然后被扔进谷歌的FaceNet模型进行特征提取。FaceNet使用三元损失函数(triplet loss function)来计算神经网络对人脸进行分类的准确性,并且由于在超球面(hypersphere)上产生的度量结果而能够对人脸进行聚类。


新图像在dlib的人脸检测模型运行之后,这个训练好的神经网络在后面Python实现中被使用。


一旦面部被OpenCV的仿射变换(Affine transformation),所有的人脸都指向相同的方向,它们被送入一个训练好的神经网络进行一次前向传播。这个128维的人脸表达可以用来进行分类或匹配,甚至可以用于进行相似性检测的聚类算法。 


 

训练



 


在OpenFace的训练部分,500k图像通过神经网络进行训练。这些图像来自两个公共数据集: CASIA-WebFace :包含了10,575个人和494,414图像; FaceScrub:包含了530个人和106863张图像。


显然,提前在所有的图片上训练神经网络十分关键,因为在移动设备或任何其他实时场景下不可能训练500,000个图像来检索所需的面部表示。现在请记住,这部分的流程只执行一次,因为OpenFace训练这些图像以生成128维的人脸表示,这些人脸表示可以表示一般的人脸,将在稍后使用。接下来,不是在高维空间中匹配图像,你只需使用低维数据,这将加快整个模型的速度。


如前所述,OpenFace使用Google的FaceNet架构进行特征提取,并使用三元损失函数来测试神经网络对人脸的分类的精度。他是通过训练三个不同的图像来实现的,其中一个是已知的人脸图像,称为锚图像,然后同一个人的另一个图像具有正的表示,而最后一张是一个不同人的图像,具有负的表示。

如果你想了解更多关于三元损失的信息可以点击Convolutional Neural Network Coursera video.


关于使用三元嵌入的一个很酷的事情是表示是,嵌入是在单位超球面上测量的,在这个单位超球面上使用欧几里得距离来确定哪些图像靠得更近,哪些距离更远。很明显,负图像表示距离正图像表示和锚图像表示比较远,而后两个表示之间的距离更近。这非常重要,因为这样可以将聚类算法用于相似性检测。例如,如果想在家谱网站上检测家庭成员,或者在社交媒体上查找可能的营销活动(在这里考虑groupon),就可能需要使用聚类算法。


从背景中分离出人脸




  

我们已经介绍了OpenFace如何使用Torch来训练数以十万计的图像,以获得低维的脸部嵌入,我们通过对流行的人脸检测库dlib的使用对其进行检查,并解释为什么要使用它而不是OpenCV的人脸检测库。


人脸识别软件的第一步就是从图像的背景中分离出真实的人脸,并将每张人脸与图像中的其他人脸分离开来。人脸检测算法也必须能够处理不良和不一致的光照以及诸如倾斜或旋转脸部而形成的各种脸部扭曲。幸运的是,dlib和OpenCV一起能处理所有这些问题。Dlib负责找到脸上的基准点,而OpenCV则进行脸部位置的归一化。


需要注意的是,在使用OpenFace时,可以使用dlib进行人脸检测,该工具使用HOG(面向梯度的直方图)和支持向量机或OpenCV的Haar级联分类器的组合。两者都是在正样本和负样本图像上进行训练(意味着有一张图像有面部,一张没有),但是在实现,速度和准确性等方面有很大差异。


使用HOG分类器有几个好处。首先,使用图像上的滑动子窗口进行训练,因此可以像OpenCV中使用的Harr分类器一样不需要进行子采样和参数操作。这使得基于dlib的HOG和SVM人脸检测更易于使用、训练速度更快。这也意味着需要更少的数据,并且HOG具有比OpenCV的Haar级联分类器更高的人脸检测精度。使用dlib的HOG + SVM使得人脸检测变得简单!

 

预处理



 


除了在图像中查找每个人脸之外,人脸识别过程的一部分是对图像进行预处理,以处理诸如不一致和光照情况,将图像进行灰度转换以加快训练以及面部位置归一化化等问题。


虽然一些人脸识别模型可以通过对大量数据集进行训练来处理这些问题,但是dlib使用OpenCV的2D仿射变换来旋转脸部,并使得每个脸部的眼睛,鼻子和嘴的位置保持一致。在仿射变换中使用68个面部标记用于特征检测,并且测量这些点之间的距离并与在平均人脸图像中找到的点相比较。然后根据这些点对图像进行旋转和变换,以对面部进行归一化比较,并裁剪成96×96像素输入到训练好的神经网络。


分类 



  


所以,当我们从背景中分离图像并使用dlib和OpenCV对图像进行预处理后,我们可以使用以将图像送入到Torch上训练好的神经网络。在这个步骤中,在神经网络上进行单次前向传播以获得用于预测的128维的表示(面部特征)。然后将这些低维面部表示用于分类或聚类。


为了进行分类,OpenFace使用在现实世界中常用的线性支持向量机来匹配图像特征。关于OpenFace最令人印象深刻的是,图像分类仅需要几毫秒便可完成。


使用案例



 

现在我们已经理解了OpenFace的高层体系结构,我们可以介绍一些有趣的开源的案例。之前提到,面部识别被用作访问控制和识别的一种形式。我们在几年前探索的一个想法是在进入我们的办公室时使用它来识别和定制您的体验https://blog.algorithmia.com/hey-zuck-we-built-your-facial-recognition-ai /。


但是,你也可以考虑创建一个移动应用程序,只有VIP才能进入俱乐部或派对。保镖不需要记住每个人的脸,也不需要依靠名单让人们进入。快速地为训练数据添加新的面孔也是容易的,并且在个人到室外呼吸新鲜空气并且想要再次进入俱乐部的这段时间训练模型。使用这种方法可以构建聚会、会议人员人脸识别案例。安保人员和前台人员可以轻松地更新或删除手机上的数据集的图像。


哪里可以找到OpenFace实现 



 

我们已经提出了OpenFace。你可以从 OpenFace on GitHub (https://cmusatyalab.github.io/openface/)自己实现面部识别模型,或者OpenFace model on Algorithmia上查看和托管你的OpenFace模型,在这里你可以使用我们的SVM实现来添加,训练,移除和预测图像。如果你想学习如何使用我们的面部识别算法,请查看我们制作 celebrity classifier的方法。


另外,请关注我下周在PyCascades讲的幻灯片,这是一个在温哥华召开的地区性Python会议,我将要演讲的题目是Racial Bias in Facial Recognition Software,我将介绍一个构建 celebrity look-a-like应用程序的案例,并讨论由于种族差异以及其他情况造成的模型失败情况。


原文链接:

https://blog.algorithmia.com/understanding-facial-recognition-openface/

OpenFace代码链接:

https://cmusatyalab.github.io/openface/


-END-

专 · 知

人工智能领域主题知识资料查看获取【专知荟萃】人工智能领域26个主题知识资料全集(入门/进阶/论文/综述/视频/专家等)

请PC登录www.zhuanzhi.ai或者点击阅读原文,注册登录专知,获取更多AI知识资料

请扫一扫如下二维码关注我们的公众号,获取人工智能的专业知识!

请加专知小助手微信(Rancho_Fang),加入专知主题人工智能群交流!

点击“阅读原文”,使用专知

展开全文
Top
微信扫码咨询专知VIP会员