基于Python的人脸识别系统设计与实现
摘 要
随着人工智能的发展,人脸识别系统在我们的生活中越来越被广泛应用。人脸识别系统是指能够从数字图像或视频源中识别人的技术。人脸识别系统可以通过多种方法工作,但是,它们通常是通过将给定图像中的面部特征与数据库中的人脸进行比较来工作的。人脸识别技术以前是作为一种计算机应用程序而发展起来的,但现在它在不同的移动平台上得到了广泛的应用,如人脸识别系统是一种比较常用的安全机制,可以与指纹和眼睛识别技术等生物识别系统进行比较。通过这项技术,用户可以轻松地解锁他们的移动电话,而不必输入他们的密码。同时它也被广泛应用于各种技术,如机器人开发等等.. 鉴于人工智能的主流发展,本设计主要对人脸识别系统进行开发和拓展。
本设计应用python语言编写程序, 主要用到开源的dlib图像处理库。读取图片/视频或打开摄像头后,首先调用正脸检测器检测出人脸, 再用已经训练好的人脸关键点检测器定位人脸特征点,接着用ResNet人脸识别模型获得人脸的128个向量特征,再与数据库文件下所有jpg图片比较人脸的特征向量值并打印出来结果,结果小于阈值则时,判定为同一个人并弹出提示框显示识别结果,否则显示无识别结果。
除了基本的人脸识别功能,本设计还拓展了三个功能:美颜功能,瘦脸功能和人脸计数。界面上设置三个复选框,选定后读取图片或打开摄像头,可实现各个功能。
美颜功能主要是对人脸进行磨皮去痘,实际上是进行模糊处理。瘦脸功能则改变人的脸型,主要对相应特征点进行分割和压缩。而人脸计数返回图像中的人数。相关的算法会在下文中详细研究。
关键词:人工智能,Python,人脸识别,人脸美化
ABSTRACT
With the development of artificial intelligence, face recognition system is widely used in our life. Face recognition system refers to the technology that can recognize people from digital images or video sources. Face recognition systems can work in a variety of ways, but they usually work by comparing facial features in a given image to faces in a database. Face recognition technology used to be developed as a computer application, but now it has been widely used in different mobile platforms. For example, Facial recognition system is more commonly employed as a security mechanism and can be compared to biometric systems such as fingerprint and eye recognition technology. A more recent use of this technology is in the mobile world, where latest mobile phone models have a built-in face recognition application. Through this technology, users can easily unlock their mobile phones without having to enter their password. It is also widely used in various technologies, such as robot development, etc.. In view of the mainstream development of artificial intelligence, this design mainly develops the face recognition system and expands its functions.
This design uses the python language to write programs and mainly using the open source image processing library : dlib. After reading the picture/video or opening the camera, first call the face detector to detect the face, then use the trained face key point detector to locate the face feature points, and then use the ResNet face recognition model to obtain the 128 vector features of the face, after that, compare the feature vector values of the face with all the jpg images in the database file and print the results. If the result is less than the threshold, it is determined to be the same person . meanwhile a prompt box will be shown to display the recognition result.
In addition to the basic face recognition function, the design also expands three functions: face beautification, face-lifting function and face counting. Set three check boxes on the interface. After selecting the image or opening the camera, it can implement corresponding functions.
The beauty function is mainly to skin the face to remove acne, in fact, it is blurred. The face-lifting function is to change the face shape, mainly to segment and compress the corresponding feature points and the face count returns the number of people in the image. The relevant algorithms will be studied in detail below.
Keywords: Artificial Intelligence, Python, Face recognition, Face beautification
目录
1 绪论
1.1本设计的目的和意义
1.2系统开发背景
1.3存在的问题
1.4.需达到的技术要求
1.5指导思想
2 软件及关键技术简介
2.1 Python
2.2 Anaconda
2.3 conda
2.4 dlib库
2.5 OpenCV-Python
3 基本概念和理论基础
3.1 HOG(HISTOGRAM OF ORIENTED GRADIENT)特征描述子
3.2 深度残差网络(ResNet)
3.3 双线性插值法
3.4 双边滤波
3.4.1 概述
3.4.2 实现方法
3.5 高斯滤波
3.5.1 概述
3.5.2 高斯分布
3.5.3 高斯核
3.5.4 高斯滤波步骤
3.6 图片线性混合
4 软件功能设计
4.1 人脸识别模块
4.1.1功能概述
4.1.2 人脸检测和特征点检测阶段
4.1.3 识别阶段
4.1.4具体实现方法
4.1.5 具体实现代码
4.2 人脸美颜模块
4.2.1 功能概述
4.2.2 具体实现方法
4.2.3 具体实现代码
4.3 人脸计数模块
4.3.1 概述和实现方法
4.3.2 具体实现代码
4.4 瘦脸功能模块
4.4.1功能概述
4.4.2 具体实现方法
4.4.3 具体实现代码
4.5 UI界面设计模块
4.5.1 界面概述
4.5.2 具体实现代码
5 软件测试
5.1 测试环境
5.2 人脸识别功能模块测试
5.2.1 单人识别
5.2.2 多人识别
5.2.3 前置摄像头识别
5.3 美颜功能模块测试
5.3.1 图像人脸美颜测试
5.3.2 前置摄像头美颜测试
5.4 人脸计数功能模块测试
5.4.1图片人脸计数
5.4.2 前置摄像头人脸计数
5.5 瘦脸功能模块测试
5.5.1 图片瘦脸功能
5.5.2 前置摄像头瘦脸功能模块测试
6 总结与展望
6.1 总结
6.2 展望
参考文献
致谢
附录
1 绪论
1.1本设计的目的和意义
面孔是我们在社会生活中首要关注的焦点,在传递身份和情感方面起着重要的作用。在我们的一生中,我们可以识别出许多面孔,并且即使在多年的分离之后,我们也能一眼识别出面孔。即使由于不断变化的条件,包括年龄和外界干扰干扰,如胡须,眼镜或发型使视觉刺激存在较大差异,这项功能仍然是十分强大的。
随着科技的发展,人类社会对人工智能的渴望程度越来越大。人工智能的发展可以提供我们极大的便利。特别是可检测和识别人脸的计算机可以应用于各种任务,包括刑事识别、安全系统、图像和胶片处理、身份核实和人机交互。不幸的是,建立人脸检测和识别的计算模型相当困难,因为人脸是复杂的、多维的和有意义的视觉刺激。现在很多地方都在使用人脸检测,特别是像 picassa、photobucket 和 facebook 这样的图片网站。自动标记功能为图片共享创造了一个新的维度,让其他人了解到在图片中的人是谁。作为图像分析和理解最成功的应用之一,人脸识别受到了人们的重视,尤其是在过去的几年里。造成这一趋势的原因至少有两个:第一是商业和执法应用范围广泛,第二是经过 30 年的研究后可行技术的可获得性。此外,人脸的机器识别问题继续吸引图像处理、模式识别、神经网络、计算机视觉、计算机图形学和心理学等学科的研究人员。对于用户友好型系统的强烈需求是显而易见的,这种系统能够保护我们的资产,保护我们的隐私,而不会因为一个数字失去我们的身份。比如,一个人需要一个 PIN 从 ATM 机获取现金,一个计算机的密码来访问互联网,等等。而且对于那些视网膜、虹膜扫描或者指纹识别,它强烈需要识别人的配合,比如睁开双眼进行扫描、录入指纹等等,即使这些特征十分适合于识别人类这种生物。相比而言,人脸识别系统通常能在识别人不知情的情况下进行,那么就不需要进行强迫也能实现识别功能,因此可更广泛的应用于各个领域。如:
1.法律监督和执法:带有人脸识别功能的监控,预防盗窃和非法行为的发生、发生盗窃事件或其他非法行为后进行分析推理、识别到犯法人后在各个路口和海关进行人脸捕获,以此抓捕到犯罪嫌疑人。
2.信息安全:智能手机解锁屏幕、手机支付(包括Apple pay、支付宝、微信支付等)、各种社交软件的注册和登录、数据库登录、互联网登录、医疗和交易记录等等。
3.智能卡:代替国家身份证、护照、社保卡、手机卡、银行卡、驾驶证等等。
4.娱乐:视频游戏、虚拟现实、VR真人游戏、室内人工智能。
于此同时,随着人脸识别技术慢慢成熟和数字图像处理技术不断的发展,人脸自动美化技术也逐渐受到人们的青睐。
1.2系统开发背景
在这个世纪的大部分时间,甚至上个世纪的部分时间(达尔文,1872年),对人脸识别的兴趣在各个科学学科中都发挥着重要的作用,认知心理学家对人脸识别这一现象很感兴趣,因为有证据表明,人们对人脸的感知与其他有图案的物体不同,因此,人脸可能代表了一类“特殊”的刺激。神经科学家对此也特别感兴趣,因为有证据表明,这种能力是由离散的神经回路辅助的,因此,它代表了一种特殊的大脑功能。人类成长心理学家也认为人脸识别这一能力十分重要,因为人脸在婴儿和看护者之间提供了一个早期的沟通渠道(在语言出现之前)。此外,进化心理学家和动物行为学家对人脸识别也抱有十分大的期待,因为它似乎是一种“特殊”的能力,是通过进化压力来选择的,并在物种间保持不变。
人脸识别作为图像分析与理解中最成功的应用之一,近年来受到了广泛的关注。至少有两个原因可以解释这一趋势:第一个是广泛的商业和执法应用,第二个是经过30年的研究,可行技术的可用性。根据早期科学家对人脸识别的研究,人脸识别其实就是检测和提取人脸特征点,根据特征点进行识别。人脸识别技术在我国也被广泛的应用。人脸识别不仅在互联网、交通、安全等领域占据发展主流,同时还在建筑设计、金融、医疗保险、海外旅游移民等方面也得到广泛的应用和认可。
虽然目前的机器识别系统已经达到了一定的成熟程度,但是它们的成功受到许多实际应用所施加的条件的限制。例如,在光照和/或姿态发生变化的户外环境中获得的人脸图像的识别在很大程度上仍然是一个未解决的问题。换句话说,目前的系统距离人类感知系统的能力还很远。
因为国家的昌盛,我们的生活水平在不断的提高,我们不再满足于物资生活,精神需求也越来越广泛,比如我们更追求外表的美观。以至于现在市面上出现各种类型的PS软件。人们可以借助此类软件来处理自己的皮肤,或者身材,实际上就是使用了相应的图像处理技术来美化人脸或者身材,能展现更美丽的自己,这受众多女性朋友的青睐。于此同时,随着数码相机的发展,用相机拍下的照片的像素,或者说分辨率也越来越高,以至于能够清晰的展示出人脸的各个细节,当然包括了痘痘、雀斑、皱纹等等,这就暴露了一些人们不想暴露的点。因为爱美是人的本性,所以在得到这些照片后,大部分女性朋友都会在PS软件上重新进行美化处理,但是PS过程是相当繁琐和枯燥的,如果需要PS多张人脸,则需要重复一样的步骤,这真的十分浪费时间。事实上为了迎合大众的需求,一部分数码相机,比如柯达相机中,就将这两个步骤结合在一起了。也就是在数码相机上加入自动人脸美化或者瘦脸的功能,人们只要拍照,拍摄完后相机会自动的处理图片中的人脸。怎么处理呢?其实就是利用数字图像处理的一些算法,去除人脸上的痘痘、雀斑、皱纹等等,达到磨皮的作用,同时又不会去除掉人脸的特征。除此之外还能够实现自动瘦脸等等功能。
1.3存在的问题
虽然目前的机器识别系统已经达到了一定的成熟程度,但是它们的成功受到许多实际应用所施加的条件的限制。在变化的户外环境中获得的人脸图像的识别在很大程度上仍然是一个未解决的问题。换句话说,目前的系统距离人类感知系统的能力还很远。
例如影响人脸识别的诸多因素:
(1)复杂场景
图1.1复杂场景下的人脸识别
(2)表情变化
图1.2 表情变化下人脸发生变化
(3)光照变化:
图1.3 光照方向不同时人脸产生的不同视觉效果
(4)年龄变化:
图1.4 随着年龄变化人脸的改变
(5)姿态变化:
图1.5 各种姿态变化
变化是绝对的,不变是相对的。模式识别(图像识别)的基本任务就是从变化中寻找不变的本质。图像处理不是科学,是门艺术。同时,虽然美化瘦脸功能的技术已有产品上市,但是美化的同时会使图像有事产生过度模糊、或者人脸变形的现象,因此总的来说这类技术还是不够成熟,需要我们更深入的研究。
1.4.需达到的技术要求
本设计主要要求使用python语言实现人脸识别功能,因为本设计的研究方向不是人脸识别的底层算法,所以使用已经训练好的模型进行人脸识别。其中使用了dlib库中的人脸检测方法,它的算法可以是HOG(HISTOGRAM OF ORIENTED GRADIENT)特征算法或者卷积神经网方法、于此同时利用近期设计的深度残差网络(ResNet)人脸识别方法。它的识别速度不仅快,可以达到10帧每秒,而且识别精度也相对较高,因此在开发中此方法深受人工智能爱好者的青睐[2]。
除此了基础的人脸识别功能,本设计还要实现的功能有:人脸美化、人脸计数及瘦脸功能。详细的算法和实现会在下文中提到。
1.5指导思想
人脸识别的商业和执法应用范围从静态、控制格式的照片到不受控的视频图像,构成了广泛的技术挑战,需要同样广泛的技术,从图像处理、分析、理解和模式识别。人脸识别问题的一般表述为:使用现有的、存储人脸的数据库,对给定的图像或者视频中的人脸进行检测,识别场景中的一个或多个人并返回结果,做出响应。可用诸如人种、年龄、性别、面部表情或语言等附带信息可用于缩小搜索范围(增强识别)。该问题的解决方案涉及从杂乱场景中分割人脸(人脸检测)、从人脸区域中提取特征、识别或验证(图 1)。在识别问题中,系统的输入是一个未知的面孔,系统从已知个体的数据库中验证和确定的身份。
图1.6 人脸识别的框架
图1.7人脸识别的框架
此外,图像处理不是科学,是门艺术。我们需要深刻领悟图像对象的特点,根据对象的本质特征选用针对性的图像处理方案。
2 软件及关键技术简介
2.1 Python
Python是一种高级编程语言,同时它与java、C++语言一样也是面向对象的,但与另外的面向对象的编程语言区别却很大,使用过这几种语言的程序员都不得不赞赏python语言的精简和方便[10]。不仅如此,python可以同时在各个不同的操作系统中搭建环境和使用,而且用python语言编写的代码不需要做改变,所以它给程序员提供的功能是毫无质疑的。此外,Python另外的强大之处在于,它的应用领域范围十分广,遍及人工智能、科学计算、Web开发、系统运维、大数据及云计算、金融、游戏开发等。为什么python能实现这么强大的功能呢?主要是因为它具有庞大的库(包括标准库和第三方库),并且它大部分的库都是开源的,开源的库经过不断的使用和完善是使python持续发展的主要原因。通过引用库来实现不同领域的各种功能。然而,于此同时,正是由于库的数量庞大,对于管理这些库以及对库作及时的维护成为既重要但复杂度又高的事情。
2.2 Anaconda
Anaconda中文是森蚺,一种非常肥大的蟒蛇。简单来说你可以把Anaconda当作是Python的懒人包,支持Linux,Mac,Windows系统,包含了Python常用的资料分析、机器学习、视觉化的套件。并且自带了专门用来解决软件环境依赖问题的 conda 包管理系统。 可以在Anaconda下随意切换python的版本,并且可以在Anaconda prompt下方便的安装第三方包,其实在下载时就已经自动为我们装上除了标准库外其他常用的库了。比较特别一点的是,Anaconda是利用conda命令来管理包和环境,使用起来十分方便[6]。
2.3 conda
conda是用来管理包和环境的管理工具。它适用的语言有:Python, R, Ruby, Lua, Scala, Java, JavaScript, C/C++, FORTRAN。conda为Python项目而创造,但可适用于上述的多种语言。适用平台:Windows, macOS, Linux。它的作用有:①快速安装、运行和升级包及其依赖项。②在计算机中便捷地创建、保存、加载和切换环境。
2.4 dlib库
Dlib是一个C++包,它拥有各种机器学习、深度学习相关的库,而且它可以在不同环境下使用,特别是在图像处理领域运用十分广泛。同时dlib所有的设计都是高度模块化的,执行速度快,并且通过一个干净的、现代的C++ API简单地使用。特别的是,因为Dlib是开源的,我们可以免费的使用它,只需要直接在环境下安装即可,十分方便。并且Dlib不依赖第三方库,无须安装和配置,可用在window、Mac OS、Linux系统上。
为什么用Dlib来做人脸识别呢? 因为我们需要3个重要的模型,分别是:人脸检测器,人脸关键点检测器、人脸识别模型,而这3个模型Dlib库中都有,并且后两者还是已经训练好的,比如此设计我使用的是训练好的ResNet人脸识别模型,我们只需直接调用就行,是相当方便的了。ResNet即深度残差网络,为什么用这个模型呢? 如果我们让网络对残差进行学习,得到的人脸识别结果在深度和精度上都比 CNN 更加强大。因为它的强大使他的发明者何凯明在2015年获得ImageNet的冠军,因此目前此算法在人脸识别领域占据领先位置。
Dlib的拥有许多解析文档和开源、高级的图像处理算法。Dlib有debug模式,在debug模式下可以调试代码,查看变量和对象随着程序运行的变化,快速定位错误点。同时Dlib也有说明文档,每个类和函数都在文档中有做详细的说明。除此之外,Dlib还提供了大量的实例,作为程序员重要的参考资料。
2.5 OpenCV-Python
是OpenCV的Python API,结合了OpenCV C++ API和Python语言的最佳特性。OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。Python是一种由Guido van Rossum开发的通用编程语言,它很快就变得非常流行,主要是因为它的简单性和代码可读性。它使程序员能够用更少的代码行表达思想,而不会降低可读性。与C / C++等语言相比,Python速度较慢。也就是说,Python可以使用C / C++轻松扩展,这使我们可以在C / C++中编写计算密集型代码,并创建可用作Python模块的Python包装器。这给我们带来了两个好处:首先,代码与原始C / C++代码一样快(因为它是在后台工作的实际C++代码),其次,在Python中编写代码比使用C / C++更容易。OpenCV-Python是原始OpenCV C++实现的Python包装器。OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库,具有MATLAB风格的语法。所有OpenCV数组结构都转换为Numpy数组。这也使得使用类似于Numpy的各种其他的库(如SciPy和Matplotlib)集成更容易。