人脸识别的简单介绍(含Python代码)



介绍


你是否意识到,每当你上传照片到Facebook上,平台都会用人脸识别算法来识别图片中的人物?目前还有一些政府在用人脸识别技术来识别和抓捕罪犯。此外,最常见的应用就是通过自己的脸部解锁手机。

 

计算机视觉的子领域应用得非常广泛,并且全球很多商业活动都已经从中获益。人脸识别模型的使用在接下来的几年内还会继续增长,所以一起来了解如何从零开始构建人脸识别模型吧!



本文首先会介绍人脸识别模型的内部工作原理。随后结合一个简单的案例,我们将通过Python进行案例实践。在本文的最后部分,你将完成你的第一个人脸识别模型!


目录

 

  • 理解人脸识别的工作原理

  • 案例学习

  • Python应用

  • 理解Python代码

  • 人脸识别算法的应用

 

理解人脸识别的工作原理

 

为了理解人脸识别算法工作原理,我们首先来了解一下特征向量的概念。(译者注:此处的特征向量指机器学习的概念,不同于矩阵理论。)

 

每个机器学习算法都会将数据集作为输入,并从中学习经验。算法会遍历数据并识别数据中的模式。例如,假定我们希望识别指定图片中人物的脸,很多物体是可以看作模式的:


  • 脸部的长度/宽度。

  • 由于图片比例会被调整,长度和高度可能并不可靠。然而,在放缩图片后,比例是保持不变的——脸部长度和宽度的比例不会改变。

  • 脸部肤色。

  • 脸上局部细节的宽度,如嘴,鼻子等。

 

显而易见,此时存在一个模式——不同的脸有不同的维度,相似的脸有相似的维度。有挑战性的是需要将特定的脸转为数字,因为机器学习算法只能理解数字。表示一张脸的数字(或训练集中的一个元素)可以称为特征向量。一个特征向量包括特定顺序的各种数字。

 

举一个简单的例子,我们可以将一张脸映射到一个特征向量上。特征向量由不同的特征组成,如:


  • 脸的长度(cm)

  • 脸的宽度(cm)

  • 脸的平均肤色(R,G,B)

  • 唇部宽度(cm)

  • 鼻子长度(cm)

 

当给定一个图片时,我们可以标注不同的特征并将其转化为如下的特征向量:

 


如此一来,我们的图片现在被转化为一个向量,可以表示为(23.1,15.8,255,224,189,5.2,4.4)。当然我们还可以从图片中衍生出无数的其他特征(如,头发颜色,胡须,眼镜等)。然而在这个简单的例子中,我们只考虑这五个简单的特征。 


现在,一旦我们将每个图片解码为特征向量,问题就变得更简单。明显地,当我们使用同一个人的两张面部图片时,提取的特征向量会非常相似。换言之,两个特征向量的“距离”就变得非常小。


此时机器学习可以帮我们完成两件事:


  • 提取特征向量。由于特征过多,手动列出所有特征是非常困难的。一个机器学习算法可以自动标注很多特征。例如,一个复杂的特征可能是:鼻子长度和前额宽度的比例。手动列出所有的这些衍生特征是非常困难的。

  • 匹配算法:一旦得到特征向量,机器学习算法需要将新图片和语料库中的特征向量进行匹配。


既然我们对人脸识别如何工作有了基本的理解,让我们运用一些广泛使用的Python库来搭建自己的人脸识别算法。


案例学习


首先给定一些人物脸部的图片——可能是一些名人,如Mark Zuckerberg, Warren Buffett, Bill Gates, Shah Rukh Khan等,并把这些人脸看作我们的语料库。现在,我们给定一些其他名人的新图片(“新人物”),并判断这些“新人物”是否在语料库中。

 

以下是语料库中的图片:



如图所示,我们所列举的名人有Barack Obama, Bill Gates, Jeff Bezos, Mark Zuckerberg, Ray Dalio 和Shah Rukh Khan。

 

现在,假定“新人物”如下:


注:以上所有图片均来自Google图片。

 

显而易见,这是Shah Rukh Khan。然而对电脑来说,这个任务很有挑战性。因为对于我们来说,我们可以轻易地将图片的多种特征结合来判断这是哪个人物。然而对电脑而言,学习如何识别人脸是非常不直观的。

 

有一个神奇但是简单的python库封装了以上提及的内容——可以根据脸部特征生成特征向量并且知道如何区分不同的脸。这个python库叫做face_recognition。它应用了dlib——一个现代C++工具包,其中包含了一些机器学习算法来帮助完成复杂的基于C++的应用。

 

Python中的face_recognition库可以完成大量的任务:


  • 发现给定图片中所有的脸。

  • 发现并处理图片中的脸部特征。

  • 识别图片中的脸。

  • 实时的人脸识别。


接下来,我们将探讨其中的第三种任务——识别图片中的脸。

 

你可以在github的如下链接中获取face_recognition库的源代码。


附链接:

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/629d75c1baac34dfa5ca2a1928a7aeaf 

 

Python应用

 

这部分包括使用face_recognition库搭建简单人脸识别系统的代码。这是一个应用操作的部分,我们将在下一部分解读代码来理解更多细节。


# import the libraries

import os

import face_recognition

 

# make a list of all the available images

images = os.listdir('images') 

# load your image

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

 

# encoded the loaded image into a feature vector

image_to_be_matched_encoded = face_recognition.face_encodings(

    image_to_be_matched)[0] 

# iterate over each image

forimage inimages:

    # load the image

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

    # encode the loaded image into a feature vector

    current_image_encoded = face_recognition.face_encodings(current_image)[0]

    # match your image with the image and check if it matches

    result = face_recognition.compare_faces(

        [image_to_be_matched_encoded],current_image_encoded)

    # check if it was a match

    ifresult[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

  • shah_rukh_khan.jpg

  • warren_buffett.jpg


我们的根目录,facialrecognition包括:


  • fr.py的形式的人脸识别代码。

  • my_image.jpg – 即将被识别的图片(“新人物”)。

  • images/ – 语料库。


如果你按照前文创建文件结构并执行代码,如下是你能得到的结果:


Matched: shah_rukh_khan.jpg

Notmatched: warren_buffett.jpg

Notmatched: barack_obama.jpg 

Notmatched: ray_dalio.jpg

Notmatched: bill_gates.jpg

Notmatched: jeff_bezos.jpg

Notmatched: mark_zuckerberg.jpg


显而易见,新名人是Shah Rukh Khan 并且我们的人脸识别系统可以识别!


理解Python代码


现在让我们解读代码来,并理解其工作原理:


# import the libraries

import os

import face_recognition


以上是引入操作。我们将通过已经建好的os库来读入语料库中的所有图片,并且通过face_recognition来完成算法部分。


# make a list of all the available images

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']


现在,以下代码将加载新人物的图片:


# load your image

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


为了保证算法可以解析图片,我们将人物脸部图片转化为特征向量:


# encoded the loaded image into a feature vector

 

image_to_be_matched_encoded = face_recognition.face_encodings(

 

    image_to_be_matched)[0]


剩余的代码相对简单:


# iterate over each image 

forimage inimages:

    # load the image 

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

 

    # encode the loaded image into a feature vector

    current_image_encoded = face_recognition.face_encodings(current_image)[0]

  

    # match your image with the image and check if it matches

 

    result = face_recognition.compare_faces(

        [image_to_be_matched_encoded],current_image_encoded)

  

    # check if it was a match

    ifresult[0] == True: 

        print"Matched: " + image 

    else:

        print"Not matched: " + image


此时,我们:


  • 对每个图像进行循环操作。

  • 将图像解析为特征向量。

  • 比较语料库中已经加载的图片和被识别的新人物图片。

  • 如果两者匹配,我们就显示出来。如果不匹配,我们也要显示结果。


如上所示,结果显示这个简单的人脸识别算法进行得很顺利。让我们尝试将my_image替换为另一个图片:



当你再次运行这个算法,将会看到如下结果:


Notmatched: shah_rukh_khan.jpg

Notmatched: warren_buffett.jpg 

Notmatched: barack_obama.jpg 

Notmatched: ray_dalio.jpg 

Notmatched: bill_gates.jpg 

Notmatched: jeff_bezos.jpg 

Notmatched: mark_zuckerberg.jpg


很明显,系统没有将马云识别为以上的任何一个名人。这意味着我们的算法在以下方面都表现得很好:


  • 正确地识别那些在语料库中存储的人。

  • 对语料库中不存在的人物进行标注。


人脸识别算法的应用

 

人脸识别是一个成熟的研究方向,已被广泛地应用在工业界和学术界。例如,一个罪犯在中国被捕可能就得益于人脸识别系统:系统识别了他的脸并发出警报。由此可见,面部识别可以用来减少犯罪。还有许多其他有趣的人脸识别案例:


  • 面部身份验证:Apple在iPhones中引入了Face ID以用于面部身份验证。一些银行也尝试使用面部身份验证来解锁。

  • 用户服务:马来西亚的一些银行安装了新的人脸识别系统,用于识别有价值的银行客户,以便银行为其提供个人服务。进而银行可以通过维持这类用户并提升用户满意度来获取更多收益。

  • 保险行业:很多保险公司正在通过运用人脸识别系统来匹配人的脸和ID提供的照片,使赔付过程变得更简单。

 

尾记

 

综上所述,人脸识别是一个有趣的问题并且有很多强大的案例。这些应用可以有效地从各个方面为社会服务。尽管将这些技术商业化可能会带来伦理风险,但我们会把这个问题留到下次讨论。

 

希望你能从本文中有所收获。



©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容