• 服务热线:13728883399
  • wangyp@shangeai.com

如何构建人脸识别器的一则指南

时间:2018-09-29 09:01:27点击:275次

编者按:如今,人脸识别已经在我们的生活中处处可见——无论是政府布置在大街小巷的“天眼”,还是手机软件中用于验证用户个人身份的确认手段,刷脸解锁、刷脸支付......每个人与生俱来的这张“独一无二”的脸正在取代数字密码,成为虚拟世界中的身份证明。小编没有iPhone XS,所以就在这里推荐一篇人脸识别入门佳作吧~

人脸识别是计算机视觉的一个子领域,它的应用范围非常广泛,现在已经成为世界各地的企业争相竞逐的新技术之一。考虑到市场的盈利现状,未来这项技术还会有更大的需求空间,所以作为机器学习的学习者,自己动手去从头开始构建一个人脸识别工具很有价值。

本文就是如何构建人脸识别器的一则指南,在文章中,首先我们会介绍这项技术的基本原理,然后用一个简单案例演示如何用Python来实现。

人脸识别的工作原理

在理解人脸识别的工作原理之前,我们先来看看什么是特征向量。

机器学习算法的本质是将数据集中的所有样本作为输入,从数据中学习“知识”,简而言之,算法会遍历数据并识别数据中的模式。以人脸识别为例,如果我们希望给定一幅图像,算法能识别出图像中的人是谁,那么这时它识别到的模式其实有很多种:

脸部的长度/宽度

有时长度/宽度的具体数值可能是不可靠的,因为它们会随着图像缩放不断变化,但即使在重新缩放之后,某些数据还是会始终保持不变——脸部的长宽比率

肤色

五官的形状,如嘴、鼻子等

显然,它们有一个共识——不同人脸的脸部长宽比、五官、肤色等是不同的。如果两张人脸很相似,那它们在这些方面的差异就比较小。这就引出了最具挑战性的一个步骤:把特定人的面部转换成数字表示——机器学习算法只能理解数字。

这种“人脸”(或训练集中特征)的数字表示就是我们所说的特征向量,它包含按特定顺序排列的一系列数字。

为了方便理解,下面举一个简单的例子,我们可以将“人脸”映射到一个特征向量,该特征向量可以包含各种特征,例如:面长(cm)、面宽(cm)、平均肤色(RGB)、嘴唇宽度(cm)、鼻子长度(cm)。

基本上,给定一个图像,我们可以绘制出各种特征并将其转换为特征向量,如:

因此这张人脸可以用(23.1, 15.8, 255, 224, 189, 5.2, 4.4)这个向量表示。当然,除了以上特征,我们还可以通过观察和测量获得更多人脸信息,比如发色、面部毛发、是否戴眼镜等,但为了方便介绍,我们在这篇文章里只考虑以上5个简单特征。

一旦我们将每个图像编码成特征向量,问题就变得非常简单了,因为我们可以通过计算向量之间的“距离”判断两张“人脸”的相似程度。而机器学习在这里发挥的作用主要有两个:

派生特征向量:数据集中的数据量往往非常多,手动列出每个特征显然不现实。机器学习算法可以智能地标记出所需特征,也可以做一些简单计算,如鼻子长度与前额宽度的比率。

匹配算法:一旦获得了特征向量,机器学习算法就可以把新图像与数据集中存在的特征向量集相匹配。

现在我们已经基本了解了人脸识别的工作原理,紧接着,让我们使用一些着名的Python库,尝试构建自己的人脸识别算法。

案例分析

下面是我们数据集中的一些图像,分别是奥巴马、比尔·盖茨、杰夫·贝佐斯、马克·扎克伯格、雷·达利奥和沙鲁克汗。我们把这些人称为“语料库”,然后准备另一位名人(“新名人”)的图像,模型的任务是确定“新名人”是否出现在“语料库”中。

对人类来说,区分上述6人非常简单,即便有读者不认识著名男性沙鲁克汗(末图),我们也能从外形上看出他和奥巴马的明显区别。但这对计算机而言并不简单。

我们选择的“新名人”:

得益于社区成员的贡献,现在我们有一个非常简单的Python库,它封装了上面提到的所有内容——从面部创建特征向量并知道如何检测人脸。这个Python库叫face_recognition,如果再深入研究一下,你会发现它来自dlib——没错,那个跨平台的C++公共库,它包含很多机器学习常用算法,有助于编写复杂的基于C ++的应用程序。

Python中的face_recognition库可以执行大量任务:

检测给定图像中的所有人脸

检测和标记图像中的人脸特征

识别图像中的人脸

实时人脸识别

这里我们只介绍如何用face_recognition识别图像中的人脸,即上述第三个任务。

facerecognition源码:github.com/ageitgey/facerecognition

如何安装facerecognition库:github.com/ageitgey/facerecognition#installation-options

在安装face_recognition之前,你还需要安装dlib:gist.github.com/ageitgey/629d75c1baac34dfa5ca2a1928a7aeaf

在Python中实现

本节包含使用face_recognition库构建简单人脸识别系统的代码,这是实现部分,代码具体表示什么我们会下下节介绍。

# 导入库

import os

import face_recognition

# 制作所有可用图像的列表

images = os.listdir('images')

# 加载图像

image_to_be_matched = face_recognition.load_image_file('my_image.jpg')

# 将加载图像编码为特征向量

image_to_be_matched_encoded = face_recognition.face_encodings(

image_to_be_matched)[0]

# 遍历每张图像

for image in images:

# 加载图像

current_image = face_recognition.load_image_file("images/" + image)

# 将加载图像编码为特征向量

current_image_encoded = face_recognition.face_encodings(current_image)[0]

# 将你的图像和图像对比,看是否为同一人

result = face_recognition.compare_faces(

[image_to_be_matched_encoded], current_image_encoded)

# 检查是否一致

if result[0] == True:

print"Matched: " + image

else:

print"Not matched: " + image

文件夹结构如下:

facialrecognition:

fr.py

my_image.jpg

images/

barack_obama.jpg

bill_gates.jpg

jeff_bezos.jpg

mark_zuckerberg.jpg

ray_dalio.jpg

shahrukhkhan.jpg

warren_buffett.jpg

它们分别表示:

fr.py:人脸识别的代码

my_image.jpg:要识别的图像(“新名人”)

images/:“语料库”

当你创建上面的文件夹结构并运行上面的代码时,这是你得到的输出:

Matched: shah_rukh_khan.jpg

Not matched: warren_buffett.jpg

Not matched: barack_obama.jpg

Not matched: ray_dalio.jpg

Not matched: bill_gates.jpg

Not matched: jeff_bezos.jpg

Not matched: mark_zuckerberg.jpg

显然,“新名人”是沙鲁克汗,我们的人脸识别系统能够检测到他!

理解Python代码

现在,我们来分解上述代码,进一步了解它是如何工作的:

# 导入库

import os

import face_recognition

这就是常规“导入”操作,我们会用face_recognition编写算法

# 制作所有可用图像的列表

images = os.listdir('images')

这行简单代码可以帮助我们识别语料库中所有图像的路径。执行此行后,我们会得到:

images = ['shah_rukh_khan.jpg', 'warren_buffett.jpg', 'barack_obama.jpg', 'ray_dalio.jpg', 'bill_gates.jpg', 'jeff_bezos.jpg', 'mark_zuckerberg.jpg']

现在,下面加载新名人图像:

# 加载图像

image_to_be_matched = face_recognition.load_image_file('my_image.jpg')

为了确保算法能够解释图像,我们将图像转换为特征向量:

# 将加载图像编码为特征向量

image_to_be_matched_encoded = face_recognition.face_encodings(

image_to_be_matched)[0]

剩下的代码不难理解:

# 遍历每张图像

for image in images:

# 加载图像

current_image = face_recognition.load_image_file("images/" + image)

# 将加载图像编码为特征向量

current_image_encoded = face_recognition.face_encodings(current_image)[0]

# 将你的图像和图像对比,看是否为同一人

result = face_recognition.compare_faces(

[image_to_be_matched_encoded], current_image_encoded)

# 检查是否一致

if result[0] == True:

print"Matched: " + image

else:

print"Not matched: " + image

综合来看,我们用这些代码做到了:

在每个图像上循环

将图像编码为特征向量

将加载的图像与要识别的图像进行比较

如果人物一致,我们输出结果。如果人物不一致,我们也会输出结果

上面的输出清楚地表明这个简单人脸识别算法的效果非常好,让我们尝试用另一个图像替换my_image :

再次运行算法时,输出变成了这样:

Not matched: shah_rukh_khan.jpg

Not matched: warren_buffett.jpg

Not matched: barack_obama.jpg

Not matched: ray_dalio.jpg

Not matched: bill_gates.jpg

Not matched: jeff_bezos.jpg

Not matched: mark_zuckerberg.jpg

显然,马云不在我们的“语料库”中。

人脸识别应用

人脸识别是一个有趣的问题,关于它的研究比较成熟,这项技术也被广泛应用于工业界和学术界。“歌神”张学友之所以能成为“逃犯克星”,演唱会现场布置的先进人脸识别摄像头功不可没,这也是人脸识别用于减轻犯罪的一个典例。此外,这项技术还有许多应用:

身份验证:苹果已经为iPhone中的人脸身份验证引入高级面部识别码,一些常用的APP,如支付宝,也在用户要求进行个人社保信息操作时要求进行人脸认证。

客户服务:马来西亚的一些银行已经安装了使用人脸识别系统来检测高价值客户的系统,以便客服人员提供个性化服务。通过这种方式,银行可以通过留住这些客户创造更多收入。

保险承保:许多保险公司正在使用人脸识别系统,将客户真人面部与照片身份证上的人脸相匹配。这样,客户的承保过程会变得更快。

总而言之,人脸识别已经开始从各个方面服务社会,虽然某些商业化应用会存在道德风险,但这些都不应成为阻碍技术发展的绊脚石。

原文标题:面部识别简介(使用Python代码)

文章出处:【微信号:jqr_AI,微信公众号:论智】欢迎添加关注!文章转载请注明出处。

  • 标签: