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

2018 年 1 月 23 日 专知 专知内容组(编)

【导读】本文是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),加入专知主题人工智能群交流!

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

登录查看更多
56

相关内容

人脸识别,特指利用分析比较人脸视觉特征信息进行身份鉴别的计算机技术。广义的人脸识别实际包括构建人脸识别系统的一系列相关技术,包括人脸图像采集、人脸定位、人脸识别预处理、身份确认以及身份查找等;而狭义的人脸识别特指通过人脸进行身份确认或者身份查找的技术或系统。人脸识别是一项热门的计算机技术研究领域,它属于生物特征识别技术,是对生物体(一般特指人)本身的生物特征来区分生物体个体。生物特征识别技术所研究的生物特征包括脸、指纹、手掌纹、虹膜、视网膜、声音(语音)、体形、个人习惯(例如敲击键盘的力度和频率、签字)等...
深度神经网络实时物联网图像处理,241页pdf
专知会员服务
76+阅读 · 2020年3月15日
【新加坡国立大学】深度学习时代数据库:挑战与机会
专知会员服务
33+阅读 · 2020年3月6日
《强化学习—使用 Open AI、TensorFlow和Keras实现》174页pdf
专知会员服务
136+阅读 · 2020年3月1日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
注意力机制模型最新综述
专知会员服务
266+阅读 · 2019年10月20日
计算机视觉方向简介 | 人脸表情识别
计算机视觉life
36+阅读 · 2019年5月15日
人脸识别 | 基于深度学习以人类为中心的图像理解
计算机视觉战队
7+阅读 · 2019年3月17日
人脸识别入门实战
人工智能头条
4+阅读 · 2018年12月12日
教程 | 如何构建自定义人脸识别数据集
机器之心
5+阅读 · 2018年6月25日
python语音识别终极指南
AI100
13+阅读 · 2018年4月5日
深度学习人脸识别系统DFace
深度学习
17+阅读 · 2018年2月14日
从Face ID说起,浅析人脸识别之刷脸技术
互联网架构师
6+阅读 · 2017年9月25日
基于Python的开源人脸识别库:离线识别率高达99.38%
炼数成金订阅号
5+阅读 · 2017年7月28日
Generative Adversarial Networks: A Survey and Taxonomy
SlowFast Networks for Video Recognition
Arxiv
4+阅读 · 2019年4月18日
Adversarial Transfer Learning
Arxiv
12+阅读 · 2018年12月6日
Arxiv
3+阅读 · 2018年5月28日
Arxiv
6+阅读 · 2018年2月6日
VIP会员
相关资讯
计算机视觉方向简介 | 人脸表情识别
计算机视觉life
36+阅读 · 2019年5月15日
人脸识别 | 基于深度学习以人类为中心的图像理解
计算机视觉战队
7+阅读 · 2019年3月17日
人脸识别入门实战
人工智能头条
4+阅读 · 2018年12月12日
教程 | 如何构建自定义人脸识别数据集
机器之心
5+阅读 · 2018年6月25日
python语音识别终极指南
AI100
13+阅读 · 2018年4月5日
深度学习人脸识别系统DFace
深度学习
17+阅读 · 2018年2月14日
从Face ID说起,浅析人脸识别之刷脸技术
互联网架构师
6+阅读 · 2017年9月25日
基于Python的开源人脸识别库:离线识别率高达99.38%
炼数成金订阅号
5+阅读 · 2017年7月28日
Top
微信扫码咨询专知VIP会员