本文首先会介绍人脸识别模型的内部工作原理。随后结合一个简单的案例,我们将通过Python进行案例实践。在本文的最后部分,你将完成你的第一个人脸识别模型!
目录
理解人脸识别的工作原理 案例学习 Python应用 理解Python代码 人脸识别算法的应用理解人脸识别的工作原理
为了理解人脸识别算法工作原理,我们首先来了解一下特征向量的概念。(译者注:此处的特征向量指机器学习的概念,不同于矩阵理论。)
每个机器学习算法都会将数据集作为输入,并从中学习经验。算法会遍历数据并识别数据中的模式。例如,假定我们希望识别指定图片中人物的脸,很多物体是可以看作模式的:
进群:548377875 即可获取数十套pdf以及大量的学习资料哦!
脸的长度(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,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 librarIEsimport osimport face_recognition# make a List of all the available imagesimages = os.Listdir('images')# load your imageimage_to_be_matched = face_recognition.load_image_file('my_image.jpg')# encoded the loaded image into a feature vectorimage_to_be_matched_encoded = face_recognition.face_enCodings( image_to_be_matched)[0]# iterate over each imagefor image in images: # 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 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 shah_rukh_khan.jpg warren_buffett.jpg我们的根目录,facialrecognition包括:
fr.py的形式的人脸识别代码。 my_image.jpg – 即将被识别的图片(“新人物”)。 images/ –语料库。如果你按照前文创建文件结构并执行代码,如下是你能得到的结果:
Matched: shah_rukh_khan.jpgNot matched: warren_buffett.jpgNot matched: barack_obama.jpgNot matched: ray_dalio.jpgNot matched: bill_gates.jpgNot matched: jeff_bezos.jpgNot matched: mark_zuckerberg.jpg
显而易见,新名人是Shah Rukh Khan 并且我们的人脸识别系统可以识别!
理解Python代码
现在让我们解读代码来,并理解其工作原理:
# import the librarIEsimport osimport face_recognition
以上是引入 *** 作。我们将通过已经建好的os库来读入语料库中的所有图片,并且通过face_recognition来完成算法部分。
# make a List of all the available imagesimages = 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 imageimage_to_be_matched = face_recognition.load_image_file('my_image.jpg')
为了保证算法可以解析图片,我们将人物脸部图片转化为特征向量:
# encoded the loaded image into a feature vectorimage_to_be_matched_encoded = face_recognition.face_enCodings( image_to_be_matched)[0]
剩余的代码相对简单:
# iterate over each imagefor image in images: # 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 if result[0] == True: print "Matched: " + image else: print "Not matched: " + image
此时,我们:
对每个图像进行循环 *** 作。 将图像解析为特征向量。 比较语料库中已经加载的图片和被识别的新人物图片。 如果两者匹配,我们就显示出来。如果不匹配,我们也要显示结果。如上所示,结果显示这个简单的人脸识别算法进行得很顺利。让我们尝试将my_image替换为另一个图片:
当你再次运行这个算法,将会看到如下结果:
Not matched: shah_rukh_khan.jpgNot matched: warren_buffett.jpgNot matched: barack_obama.jpgNot matched: ray_dalio.jpgNot matched: bill_gates.jpgNot matched: jeff_bezos.jpgNot matched: mark_zuckerberg.jpg
很明显,系统没有将马云识别为以上的任何一个名人。这意味着我们的算法在以下方面都表现得很好:
正确地识别那些在语料库中存储的人。 对语料库中不存在的人物进行标注。人脸识别算法的应用
人脸识别是一个成熟的研究方向,已被广泛地应用在工业界和学术界。例如,一个罪犯在中国被捕可能就得益于人脸识别系统:系统识别了他的脸并发出警报。由此可见,面部识别可以用来减少犯罪。还有许多其他有趣的人脸识别案例:
面部身份验证:Apple在iPhones中引入了Face ID以用于面部身份验证。一些银行也尝试使用面部身份验证来解锁。 用户服务:马来西亚的一些银行安装了新的人脸识别系统,用于识别有价值的银行客户,以便银行为其提供个人服务。进而银行可以通过维持这类用户并提升用户满意度来获取更多收益。 保险行业:很多保险公司正在通过运用人脸识别系统来匹配人的脸和ID提供的照片,使赔付过程变得更简单。尾记
综上所述,人脸识别是一个有趣的问题并且有很多强大的案例。这些应用可以有效地从各个方面为社会服务。尽管将这些技术商业化可能会带来伦理风险,但我们会把这个问题留到下次讨论。
总结以上是内存溢出为你收集整理的我用Python给自己手机写了个人脸识别!拉开普通手机识别一万倍!全部内容,希望文章能够帮你解决我用Python给自己手机写了个人脸识别!拉开普通手机识别一万倍!所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)