01简介您是否知道,每当您将照片上传到Facebook时,该平台都会使用人脸识别算法来识别图片中的人?目前,一些政府正在使用面部识别技术来识别和逮捕罪犯。此外,最常见的应用是用自己的脸解锁手机。计算机视觉的子领域应用非常广泛,世界各地的许多企业都从中受益。面部识别模型的使用将在未来几年继续增长,所以让我们学习如何从头开始构建面部识别模型!本文首先介绍人脸识别模型的内部工作原理。然后结合一个简单的案例,通过Python进行案例练习。在本文的第一部分,您将完成您的第一个面部识别模型!02理解人脸识别的工作原理为了理解人脸识别算法的工作原理,我们先来了解一下特征向量的概念。(译者注:这里的特征向量指的是机器学习的概念,它不同于矩阵论。)每一个机器学习算法都以一个数据集作为输入,并从中学习经验。算法遍历数据并识别数据中的模式。例如,假设我们要识别给定图片中的人脸。许多对象都可以看作是模式:面部的长度/宽度。由于图像缩放,长度和高度可能不可靠。然而,在重新缩放图像后,比率保持不变——面部长度与宽度的比率没有改变。面部肤色。人脸局部细节的宽度,比如嘴巴、鼻子等。显然,在这一点上有一个规律——不同的脸有不同的维度,相似的脸有相似的维度。具有挑战性的是需要将特定面孔转换为数字,因为机器学习算法只能理解数字。代表人脸(或训练集中的元素)的数字可以称为特征向量。特征向量由特定顺序的各种数字组成。举个简单的例子,我们可以将一张脸映射到一个特征向量上。特征向量由不同的特征组成,例如:脸长(cm)脸宽(cm)脸的平均肤色(R,G,B)嘴唇宽度(cm)给定图片时鼻子的长度(cm),我们可以标记不同的特征并将它们转换为特征向量,如下所示:这样,我们的图像现在被转换为一个向量,可以表示为(23.1,15.8,255,224,189,5.2,4.4)。当然,我们还可以从图像中推导出无数其他特征(例如头发颜色、胡须、眼镜等)。然而,在这个简单的例子中,我们只考虑这五个简单的特征。现在,一旦我们将每个图像解码为一个特征向量,问题就变得简单了。显然,当我们使用同一个人的两张人脸图像时,提取的特征向量会非常相似。换句话说,两个特征向量之间的“距离”变得非常小。此时机器学习可以帮助我们完成两件事:提取特征向量。由于特征数量众多,手动列出所有特征非常困难。机器学习算法可以自动标记许多特征。例如,一个复杂的特征可能是:鼻子长度与前额宽度的比率。手动列出所有这些派生特征非常困难。匹配算法:一旦得到特征向量,机器学习算法需要将新图像与语料库中的特征向量进行匹配。现在我们对人脸识别的工作原理有了基本的了解,让我们使用一些广泛使用的Python库构建我们自己的人脸识别算法。03Casestudy首先给出一些人脸图片——可能是一些名人,比如马克·扎克伯格、沃伦·、比尔·盖茨、沙鲁克·汗等,并将这些人脸作为我们的语料库。现在,我们得到一些其他名人的新照片(“新人”),并判断这些“新人”是否在语料库中。以下是语料库中的图像:如图所示,我们列出了巴拉克奥巴马、比尔盖茨、杰夫贝佐斯、马克扎克伯格、雷达里奥和沙鲁克汗等名人。现在,假设“新人”如下:▲注:以上图片均来自GoogleImages显然,这是沙鲁克汗。然而,对于计算机来说,这项任务是相当具有挑战性的。因为对于我们来说,我们可以很容易地结合图片的多个特征来判断它是哪个人物。然而,对于计算机来说,学习如何识别人脸是非常不直观的。有一个惊人但简单的python库封装了上述内容——可以从面部特征生成特征向量,并知道如何区分不同的面孔。这个python库叫做face_recognition。它使用dlib——一个现代C++工具包,其中包括一些机器学习算法,以帮助完成复杂的基于C++的应用程序。Python中的face_recognition库可以完成大量任务:找到给定图像中的所有面孔。查找和处理图像中的面部特征。识别图片中的人脸。实时人脸识别。接下来,我们将探索这些任务中的第三个——识别图片中的人脸。face_recognition库的源代码可以在github上的以下链接中获取。链接:https://github.com/ageitgey/face_recognition实际上,这里有一些关于如何安装face_recognition库的说明。链接:https://github.com/ageitgey/face_recognition#installation-options在安装face_recognition之前,还需要安装dlib包。您可以从下面的链接找到安装dlib的说明。链接:https://gist.github.com/ageitgey/629d75c1baac34dfa5ca2a1928a7aeaf04Python应用这部分包括使用face_recognition库构建简单人脸识别系统的代码。这是应用程序操作的一部分,我们将在下一部分阅读代码以了解更多细节。#importthelibrariesimportosimportface_recognition#makealistofalltheavailableimagesimages=os.listdir('images')#loadyourimageimage_to_be_matched=face_recognition.load_image_file('my_image.jpg')#encodedtheloadedimageintoafeaturevectorimage_to_be_matched_encoded=face_recognition.face_encodings(image_to_be_matched)[0]#iterateovereachimageforimageinimages:#loadtheimagecurrent_image=face_recognition.load_image_file("images/"+image)#encodetheloadedimageintoafeaturevectorcurrent_image_encoded=face_recognition.face_encodings(current_image)[0]#matchyourimagewiththeimageandcheckifitmatchesresult=face_recognition.compare_faces([image_to_be_matched_encoded],current_image_encoded)#checkifitwasamatchifresult[0]==True:打印"else匹配:"+图像:"+image文件结构如下:facialrecognition:fr.pymy_image.jpgimages/barack_obama.jpgbill_gates.jpgjeff_bezos.jpgmark_zuckerberg.jpgray_dalio.jpgshah_rukh_khan.jpgwarren_buffett.jpg我们的根目录facialrecognition包含:fr.py形式的面部识别代码my_image.jpg-要识别的图像(“新人”)。图片/——语料库。如果你按照上面的方式创建文件结构并执行代码,你会得到:,新名人是沙鲁克汗,我们的人脸识别系统可以识别!05理解Python代码现在让我们破译代码并理解它是如何工作的:#importthelibrariesimportosimportface_recognition上面是导入操作。我们会通过构建的os库读取语料库中的所有图片,通过face_recognition完成算法部分。#makealistofalltheavailableimagesimages=os.listdir('images')这段简单的代码将帮助我们识别语料库中所有图像的路径。执行这些代码后,我们可以得到:mark_zuckerberg.jpg']现在,下面的代码将加载新人的图像:#loadyourimageimage_to_be_matched=face_recognition.load_image_file('my_image.jpg')为确保算法能够解析图像,我们将人脸图像转换为intoafeaturevector:#encodedtheloadedimageintoafeaturevectorimage_to_be_matched_encoded=face_recognition.face_encodings(image_to_be_matched)[0]剩余的代码相对简单:#iterateovereachimageforimageinimages:#loadtheimagecurrent_image=face_recognition.load_image_file("images/"+image)#encodetheloadedimageintoafeaturevectorcurrent_image_encoded=face_recognition.face_encodings(current_image)[0]#matchyourimagewiththeimageandcheckifitmatchesresult=face_recognition.compare_faces([image_to_be_matched_encoded],current_image_encoded)#checkifitwasamatchifresult[0]==True:print"Matched:"+imageelse:print"Notmatched:"+image此时,我们:遍历每个图像。将图像解析为特征向量。将语料库中加载的图像与识别出的新人物图像进行比较。如果两者匹配,我们就显示它。如果没有匹配项,我们也会显示结果。如上图所示,结果表明这个简单的人脸识别算法运行良好。让我们尝试用另一张图片替换my_image:当您再次运行该算法时,您将看到以下内容:显然,系统并未将马云识别为上述任何名人。这意味着我们的算法擅长:正确识别存储在语料库中的那些人。注释语料库中不存在的人。06人脸识别算法应用人脸识别是一个成熟的研究方向,在工业界和学术界都有广泛的应用。例如,在中国被捕的罪犯可能会受益于面部识别系统:系统识别出他的面部并发出警报。由此可见,人脸识别可以用来减少犯罪。面部识别还有许多其他有趣的用例:面部身份验证:Apple在iPhone中引入了FaceID以进行面部身份验证。一些银行也在尝试人脸认证解锁。用户服务:马来西亚一些银行安装了新的人脸识别系统,以识别有价值的银行客户,以便银行为他们提供贴身服务。反过来,银行可以通过维护此类用户并提高用户满意度来获得更多收入。保险行业:许多保险公司正在使用人脸识别系统来匹配人脸和身份证提供的照片,以简化赔偿过程。07结语综上所述,人脸识别是一个有趣的问题,并且有很多强有力的案例。这些应用可以有效地服务于社会的方方面面。尽管将这些技术商业化可能存在伦理风险,但我们将把这个问题留到下一次讨论。希望您能从本文中有所收获。原文标题:人脸识别简单介绍(附Python代码)原文链接:https://www.analyticsvidhya.com/blog/2018/08/a-simple-introduction-to-facial-recognition-with-python-codes/译者简介:王雨桐,统计学专业学生,准备读数据科学硕士,边跑边弹钢琴。我梦想将数据可视化视为艺术,但目前我正在摸着下巴看机器学习。
