《基于python的人脸识别系统定稿.docx》由会员分享,可在线阅读,更多相关《基于python的人脸识别系统定稿.docx(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、广东东软学院本科毕业设计(论文)摘要随着科技的不断发展,人工智能在人类生活的应用越来越普及,作为当前最受关注的生物特征识别的方法,人脸识别在考勤、边检、安防、运输等领域有着巨大应用前景,是人工智能与计算机视觉领域的研究热点之一。本文是基于python语言实现的人脸识别系统,利用keras搭建CNN卷积神经网络构造一个18层网络结构的识别模型,实现人脸录入、图像处理、模型训练、识别人脸等功能。主要描述图像处理与模型搭建两个模块。图像处理包括图像的尺寸比例调整、数据归一化等知识,模型搭建包括模型建立、训练、评估。最终识别准确率达到99.6% 。关键词:人脸识别 图像预处理 模型训练 CNNAbst
2、ractWith the rapid development of science and technology, artificial intelligence is more and more popular in human life. As the currently most concerned method of biometrics recognition, face recognition has great application prospects in the fields of time and attendance, border inspection, securi
3、ty, transportation, etc. It is one of the research hotspots in the field of artificial intelligence and computer vision. This paper is a face recognition system based on python. It use keras to build a convolutional neural network to construct an 18-layer structure recognition model to realize funct
4、ions such as face input, image processing, model training, and face recognition. It mainly describes two modules of image processing and model building. Image processing includes knowledge such as image size adjustment and data normalization, and model building includes model establishment, training
5、, and evaluation. The final recognition accuracy reached 99.6%.Key words: Face recognition Image preprocessing Model training CNN目录第一章 课题背景11.1课题来源11.2 研究意义11.3 国外研究现状21.4 国内研究现状2第二章 需求分析32.1技术可行性分析32.2系统需求分析32.2.1程序功能需求分析32.3开发环境需求4第三章 系统概要设计53.1各模块功能介绍63.1.1人脸录入模块63.1.2搭建模型模块63.1.3 人脸识别模块7第四章 系统详细
6、设计84.1 整体运行流程图84.2 图像预处理设计84.2.1调整图像尺寸84.2.2交叉验证法划分数据集104.2.3数据标签one-hot编码104.2.5像素归一化114.2.6 补充说明124.3 卷积神经网络模型的设计124.3.1卷积神经网络124.3.2模型设计154.3.3模型训练17第五章 系统 识别结果20结束语22参考文献23致谢24第一章 课题背景1.1课题来源随着线上支付在生活中的迅速普及,人们出行不带钱包只带手机逐渐成为一种趋势,然而不带钱包,通常就会忘带身份证。而如今现实生活的方方面面中,像银行、金融借贷、买房、购车、住宿、旅游、购物都需要随身携带身份证。而随着
7、科学技术的快速发展,刷脸时代已经强势进入我们的生活,刷脸支付、刷脸安检、刷脸考勤靠刷脸办事正迅速渗透我们的日常生活和工作。这种追求更加便捷生活方式的理念为人脸识别技术创造出许多新的应用场景,并赋予它新的生命,使得人脸技术成为近几年的研究热点。然而,这项技术早在20世纪的60年代便已经有学者展开研究,尤其在安防领域,已经研发出不少的应用并投入实际运用。大众对于该技术的理解更多的是在欧美犯罪电影中出现的FBI和CIA,探员通过查询世界各个角落的监控器,将犯罪嫌疑人与人脸识别系统相比对,从而确定犯罪嫌疑人出现过的地点。虽然情节夸大了该项技术的应用,但实际上人脸识别技术早已被许多国家的大量运用在安防领
8、域。它并不是一项新出现的技术,只是缺乏在人们日常生活中的应用场景,使得人脸识别技术直到近几年随着智能化时代的到来才逐渐被大众熟知。在国内,对该项技术的研究开始于1990年,目前主要应用在考勤、边检、运输、安防等领域。1.2 研究意义随着人工智能在计算机技术领域的迅速发展,智能化产品逐渐渗透在人类社会生活中的各个方面,使得社会的运行效率大幅度的提升,人类也慢慢从体力劳动中解脱出来,将更多的时间放在技术创新创造上,而人脸识别作为人工智能中的重要技术之一,是富有应用意义和挑战性的研究课题之一。相对于其他生物特征识别技术,人脸识别技术因为具有非侵扰性、非强制性、非接触性、便捷性等优点,符合人们对便捷生
9、活方式的追求和对身份识别的快速、准确、安全的要求,使得它在身份识别、自动监控、人机交互等领域拥有巨大的发展潜力。人脸识别技术覆盖了计算机视觉、模式识别、数字图像处理、数学等诸多领域学科内容,虽然对该项技术的研究已取得一些成果,但在实际应用中仍存在着不足和困难,比如人脸识别的背景环境,脸部表情、妆容、姿态、发型的变化,都会降低识别的准确性,给识别带来困难。降低识别错误率、提高识别速度、实时性要求是人脸识别技术当前迫切需要解决的问题。1.3 国外研究现状 20世纪60年代,人脸识别技术便已经有人研究,但一直到80年代后期这段时间内人脸识别技术都只是作为一般性的问题研究,不能自动完成识别任务,没有发
10、表具有代表性的理论研究成果。直到90年代后随着计算机运算速度的提高,人脸识别技术发展迎来了重大突破,诞生了许多代表性的算法,“特征脸”法1 樊慧慧. 智能家居环境下动态人脸身份识别系统设计D.2015.、基于线性判别分析的Fisherface方法, “作差法”,弹性图匹配技术等等,使得人脸识别技术突飞猛进。如今,人脸识别技术已被运用到许多公众场所,尤其是“911”事件后,国外很多大型公众场合已经应用这一技术。美国等欧美国家在人脸识别技术有着较大的成就,早在90年代,美国军方就组织了FERET人脸识别算法测试,对人脸识别技术起到积极的推进。2000年后,人脸识别技术逐渐从学术研究走向商业应用。如
11、今,经过几十年的发展,人脸识别技术已经被广泛应用到金融、安防等其他众多领域。1.4 国内研究现状国内对于人脸识别技术的研究开始于上世纪80年代2 许丽艳. 人脸识别技术研究D.天津大学, 2010.,但到90年代后期才被许多院校和机构普及,相比其他国家起步相对较晚,但是进展迅速且成绩斐然。如苏光大教授提出的最佳二维人脸理论和MMP-PCA算法、李子青带领的研究团队提出了基于近红外的人脸识别技术、汤晓鸥实验室发表的DeepID系列算法等等,其中为08年奥运会安保3 曹健. 人脸检测和识别系统的设计与应用D. 南京信息工程大学,2013.4 人脸识别系统应用奥运开幕式J.中国防伪报道, 2008,
12、 000(009):59.提供保障的人脸识别系统和智能视频监控系统就是李子青教授在中科院自动化所研发。不只是在学术研究上,在商业上,也涌现了很多科技公司专注于这项技术的研究,如商汤科技、依图科技、旷视科技都是国内研究人脸识别技术的知名企业,且在该领域均取得不错的成绩,如依图科技分别在2017和2018的全球人脸识别挑战赛FRPC比赛中获得冠军,在2018年的比赛测试结果显示依图科技的识别算法在千万分之一的误报情况下识别准确率接近99,达到接近极限水平。而且根据NIST在2018年根据全球人脸识别算法测试情况发布的排名中,前五名中三名被中国公司包揽5 弘毅. 2019人脸识别技术50强J.互联网
13、周刊,2019(21).。这些数据表明我国的人脸识别技术在国际上名列前茅。24第二章 需求分析人脸识别技术是近几年人们的研究热点和讨论焦点,它能应用于许多领域,从一开始的安防到如今的金融、教育、考勤等,目前我国和其他国家有大量的学者在不断的深入研究。 2.1技术可行性分析在着手开发之前,我查阅了大量资料,对比目前人脸识别技术的多种算法,卷积神经网络能对极少的预处理过的原始像素,快速识别出特征规律,因此选择卷积神经网络算法做人脸识别。通过搭建一个多层网络模型,对模型输入人脸数据进行训练,使模型能够对实时视频流中出现的人脸进行准确识别。训练模型需要准备数据集,利用摄像头收集身边人的脸部图片作为数据
14、集,为了更好的验证模型,需要将数据集按照交叉验证原则划分训练集、验证集和测试集三部分。采用交叉验证是因为手动划分数据集可能会使数据分布不均匀,导致训练出来的模型偏向于数据较多的,造成在测试或在实际预测时数据较少的分类不正确。交叉验证法通过不同比例对样本进行划分,重复使用样本数据,能够得到多组不同的训练集和测试集,使模型训练效果更优。许多机器学习算法不能直接对标签数据进行操作。它们要求所有的输入变量和输出变量都为数字形式。one-hot编码把分类数据转化为二进制格式,分类的输入和输出变量都是一样的,供机器学习使用。图像是由像素组成,彩色图像由3个矩阵所构成,即红(R)、绿(G)、蓝(B)三个颜色
15、通道,每个像素矩阵的取值都0,255区间内的整数,因此当训练数据的值较大时,会导致模型的训练时间增加,速度变慢。因此需要将图片像素归一化,用于提升网络收敛速度,减少网络模型的训练时间。2.2系统需求分析2.2.1程序功能需求分析整个程序的最终目的是能识别出人脸。首先通过摄像头获取人脸图片,经过图像预处理后作为模型后期训练的数据,预处理模块的好坏直接影响着模型的识别准确率。接着利用keras框架搭建卷积神经网络构建一个18层的卷积网络结构,并利用上述处理过的数据提供给模型进行训练,选择其中最优的模型。这两个模块是实现人脸识别功能的基础。所以本设计中所要完成的功能如下所述:(1)人脸录入这个模块是
16、为了获取图片作为训练数据,主要通过开启摄像头后从视频流中截取人脸图片,并将截图的人脸图片独立保存在文件夹中,文件夹以该人的名字命名;也可以直接导入人脸图片。(2)图像预处理该模块主要包括图像的尺寸比例调整、交叉验证、改变维度顺序、One-hot编码、归一化等。(3)人脸检测该模块采用OpenCV自带的人脸检测工具haarcascade_frontalface_alt2,检测摄像头的哪个区域为人脸,可用于检测静止图像,视频和摄像头所得到图像中的人脸。(4)模型建立该模块采用keras搭建CNN卷积神经网络框架,将预处理过的脸部图像数据作为训练数据,对搭建的神经网络进行模型训练,并评估模型的识别率
17、,得到最终模型。2.3开发环境需求Anaconda是一个开源的集成各类python工具的集成平台,包含了pyqt等大量包,提供包管理与环境管理功能,能很方便的配置程序设计所需的环境。程序设计采用Anaconda 3作为开发工具,内置python版本为3.7,通过Anaconda prompt安装tensorflow,numpy,keras,sklearn等第三方库。值得注意的是不同版本的tensorflow要搭配对应的python版本,安装前最好上网先查询二者对应版本搭配,否则会耗费大量时间在安装上。第三章 系统概要设计本章节大致介绍了人脸识别系统的整体结构设计流程以及图像处理模块运用的原理。
18、(1)系统整体结构设计如图3.1所示图3.1系统结构设计图(2)图像预处理模块设计如图3.2。图3.2 图像预处理层次图3.1各模块功能介绍3.1.1人脸录入模块人脸采集模块是为了获取人脸图片作为后期模型的训练数据,人脸图片可以从USB摄像头实时截取,也可以从视频中截取。利用OpenCV的VideoCapture函数获取摄像头的视频流,利用OpenCV自带的人脸检测工具haarcascade_frontalface_alt2检测摄像头的哪个区域为人脸,进行长宽坐标获取后并截取人脸,将截取到的人脸写入到本地磁盘,作为训练数据。 3.1.2搭建模型模块该模块的主要功能是进行图像数据处理并建立好模型
19、,是实现人脸识别功能的重点,有以下两个子模块:(1)数据预处理主要进行图像数据预处理,通过调整图像的尺寸大小和比例缩放、划分数据集、独热编码标签向量化、像素归一化等一系列操作,将样本处理成为可以被卷积神经网络读取的数据类型。(2)创建模型采用keras框架搭建CNN卷积神经网络,搭建一个4层convl+2层maxpool+2层dropout+2层dense+1层Flatten的以softmax函数作为输出的多分类网络结构,采用预处理后的数据作为样本数据,对模型进行训练;训练选择随机梯度下降法SGD+Momentum作为优化器,以损失函数categorical_crossentropy作为优化目
20、标度量模型拟合程度,选出最优的模型参数,再对数据进行数据增强,通过图片变化扩充数据集,提供给fit_generator函数对模型进行训练,最终将训练后的模型保存在程序目录下。3.1.3 人脸识别模块同样利用OpenCV的VideoCapture函数打开摄像头,用 OpenCV的人脸检测工具haarcascade_frontalface_alt2,截取摄像头中出现的人脸图片,交予模型识别,并给出识别结果,将识别结果保存在对应的excel文件中。第四章 系统详细设计本章节主要介绍图像预处理和建立模型这两方面进行详细介绍,对这两模块涉及到的相关原理算法进行叙述。4.1 整体运行流程图图4.1 系统运
21、行流程图4.2 图像预处理设计4.2.1调整图像尺寸本程序设计的卷积神经网络中加入两层全连接层,全连接层的输入在网络配置时便固定维数,全连接层的核心操作就是矩阵向量乘积,即将输入的特征图矩阵和相应权值矩阵进行乘积运算,矩阵之间的点积运算要求两个矩阵的维数相同,因此固定输入数据的特征图矩阵维数,所以需要对图像数据进行尺寸、比例调整。核心代码如下:def resize_image(image, height = IMAGE_SIZE, width = IMAGE_SIZE): top, bottom, left, right = (0, 0, 0, 0) h, w, _ = image.shape
22、#获取图像尺寸 longest_edge = max(h, w) #对于长宽不相等的图片,找到最长的一边 #计算短边需要增加多上像素宽度使其与长边等长 if h longest_edge: dh = longest_edge - h top = dh / 2 bottom = dh - top elif w longest_edge: dw = longest_edge - w left = dw / 2 right = dw - left else: pass BLACK = 0, 0, 0 #RGB颜色#给图像短的两边增加边界成为正方形,cv2.BORDER_CONSTANT指定所加边界颜
23、色为黑色 constant=cv2.copyMakeBorder(image,top , bottom, left, right, cv2.BORDER_CONSTANT, value = BLACK) return cv2.resize(constant, (height, width) #调整图像大小并返回图像大小的调整利用tensorflow库提供的resize()函数,然而如果直接对图像进行resize,会把图像拉变形(图4.3)。为了使图像resize后仍然保持原始图片的宽高比,我们需要为图像较短的两边加黑框(图4.4),使图像变成正方形又不失真,最后再利用resize()函数进行图
24、像比例缩放(图4.5)。缩放成64*64的目的是为了减少计算量及内存占用,提升后续网络模型的训练速度。图4.2 200*300原始图片图4.3 300*300正方形图像图4.4 300*300正方形图像图4.5 64*64正方形图像4.2.2交叉验证法划分数据集为了更充分利用有限的数据,采用交叉验证来分割数据集,它的基本思想是从现有的数据集中,拿出大部分样本(或者按比例)作为模型训练数据集,留小部分样本用于验证模型。所谓“交叉”,是指这一次作为训练模型的样本,下次可能就是测试集的样本,验证结果会与验证集的真实值比较并计算出误差平方加和结果,这个过程会重复进行,反复的进行交叉验证,直至所有验证结
25、果与真实值相同,验证结束。train_test_split()是Sklearn库中交叉验证模块提供的用于划分数据集的函数,将数据的30%划分为验证集, 70%划分为训练集,具体语句如下:train_images, valid_images, train_labels, valid_labels = train_test_split(images, labels,test_size = 0.3, random_state = random.randint(0, 100)参数test_size = 0.3表示数据划分的比例,参数random_state表示随机选取1,100区间内的整数,每次都随机
26、从数据集中抽取数据建立训练集和验证集,导致每次训练的结果会有不同。_, test_images, _, test_labels = train_test_split(images, labels, test_size = 0.5,random_state = random.randint(0, 100)测试集同样调用这个函数,只不过选择的比例为50%。4.2.3数据标签one-hot编码对标签进行独热编码(One-hot)的原因是因为卷积神经网络采用分类交叉熵(categorical_crossentropy)作为损失函数,它要求训练样本标签必须为one-hot编码形式。One-hot编码又称
27、为独热编码,它采用状态寄存器的组织方式对状态进行编码,用N位寄存器编码N个状态,即每个状态值对应一个寄存器位,且任意时刻仅有一位有效。它先将每个分类值映射成整数值,整数值再表示成二进制形式,实际上就是将分类变量表示为二进制向量,使整数的索引设为1,其他全为0。程序输入4张人脸,每张人脸为一类,一共4类,则用4个状态位来表示,类别状态为0,1,2,3; 0代表“archer”,1代表“miaor” ,2代表“pangzi”,3代表“shouzi”。one-hot编码会提供4个寄存器位保存这4个状态,对这四个标签进行One-hot编码后,结果如表4.1 One-hot编码。表4.1 One-hot
28、编码标签One-hot编码01 0 0 010 1 0 020 0 1 030 0 0 1即标签的1在第几位则代表第几位有效,简单的说,One-hot编码将数值变成了位置信息,使其向量化,方便卷积神经网络操作。4.2.5像素归一化归一化是为了简化计算,通过将数据统一处理为0,1之间的小数,达到减低计算量的目的。周知图像是由像素组成,彩色图像由即红(R)、绿(G)、蓝(B) 这3个像素矩阵所构成,每个像素矩阵的取值都为0,255之间的整数,因此当训练数据的值为较大整数值时,会使模型的训练速度变慢,即模型的训练时间增加,因此对图像数据进行归一化,目的就是为了提升网络速度,减少训练时间。在整数形式的
29、颜色空间中每个像素取值都是在 0,255区间内的整数,而归一化后是小数形式的颜色空间,因此需要先将数据形式浮点化,再归一化。像素的归一化用原始像素值除以所有原始像素值中的最大值来实现,最大像素值一般为255,最小值为0。公式形式6 鲁磊. 基于卷积神经网络的人脸识别方法研究D.西安科技大学,2019.如下:x=x-X_minX_max-X_min (4- 1)这里的X_min为0。x是归一化后的值,X_max和X_min分别表示样本的最大最小值。归一化后图像的像素处于0-1.0范围时,依然介于0-255之间,图像依旧有效的。4.2.6 补充说明Keras是一个以tensorflow或thean
30、o作为后端引擎的模型库,只提供快速构建神经网络模型,不处理卷积和矩阵乘积等计算,而是把这些底层计算交给后端引擎来完成。后端引擎系统决定了图像数据输入卷积神经网络时的维度顺序,而theano和tensorflow的维度顺序是不同的,theano是通道数、行数、列数,而tensorflow为行数、列数、通道数。而不同版本的keras所支持的后端系统不一样,因此需要先确定当前安装的keras采用的后端系统,在进行图片预处理前把图像数据修改成对应后端引擎支持的维度顺序。4.3 卷积神经网络模型的设计4.3.1卷积神经网络卷积神经网络(Convolutional Neural Network,简称CNN
31、)是上世纪80年代科学家从对猫视觉皮层的研究受到启发而诞生的算法,它能够对数据进行有效分类,普遍运用在语音、图像识别等领域。通过多层卷积、池化的堆叠 使得卷积神经网络相比传统神经网络具有参数少、模型训练难度和复杂度低等优点。一个卷积神经网络主要由以下5类组成:(1)卷积层卷积层的作用是对图片进行局部特征提取,是CNN的核心层,作用是对图片进行局部特征提取。具体指输出图像的每个像素值都由输入图像对应位置区域的像素通过加权所得,这个区域叫做局部感受野,区域的权值叫做卷积核,输入图像通过卷积运算后再加上偏置项,通过激活函数得到其特征图,卷积层的数学形式7 易超人,邓燕妮.多通道卷积神经网络图像识别方
32、法J.河南科技大学学报(自然科学版),2017,38(03):41-44+5-6.如下:Xjl=f(iMjXil-1*Kijl+bjl) (4- 2)其中:l为层数;Xjl为卷积层l层的第j个特征图;Mj为输入层的感受野;K为卷积核;b为偏置;f为神经元的激活函数。在数学上来说卷积运算是对两个矩阵进行的。如下图所示8 秦川.基于卷积神经网络的图像识别J.电子技术与软件工程,2020(01):98-99.,用一个3*3的卷积核,卷积核内的点与图片上重合区域的每个像素值做乘积加和运算后再加上偏置,作为输出图片中的一个像素值。图4.6图像矩阵与卷积核的点积运算(2)池化层图像经过卷积之后获得了多个特
33、征图, 但是与原始图像相比特征图的尺寸并没有改变, 所以数据运算量依旧很大。为了降低运算量, 通常会在卷积层后加入下采样层。下采样层也叫池化层,主要功能是对经过卷积层特征提取后的图像矩阵进行信息过滤,去除冗余信息,只保留主要特征,减少网络中的参数和计算次数,防止模型过拟合。常见的池化操作方法有平均值池化(Average Pooling)和最大值池化(Max Pooling)。Average Pooling保留图像的背景信息,它是通过计算覆盖区域的平均值作为池化后的值。而Max Pooling能够保留图像的边缘和纹理信息,它是通过选取覆盖区域的最大值作为区域池化后的值。图4.7 最大池化法图4.
34、8 平均池化法虽然卷积层和池化层都是提取图像特征,但二者略有区别,卷积层是通过卷积核逐个像素滑动覆盖达到目的,而池化层则是按照池化窗口逐块覆盖特征图的方式提取该区域内的代表性特征。(3)Dropout层在神经网络模型训练过程中,如果提供给模型、的训练样本数太少,容易导致训练后模型泛化能力差,产生过拟合现象。过拟合现象是指模型在训练集上预测效果比在未知数据集(测试集)上预测的效果好。这种现象是模型过度依赖现有训练数据集的特征造成的。为了防止过拟合现象发生,在神经网络中加入Dropout层,在诸多过拟合问题的解决方案中,Dropout以其具有简单性和效果良好而被广泛运用。Dropout的关键思想9
35、 Srivastava N, Hinton G, Krizhevsky A, et al. Dropout: A simple way to prevent neural networks from overfittingJ. The Journal of Machine Learning Research, 2014, 15(1): 1929-1958.是在训练过程中从神经网络中随机删除单元以及它们的连接,即在训练过程中,以概率p舍弃神经元并让其它神经元以概率q=1-p保留,这样每一次数据训练都为一个网络结构,相当于训练多个不同结构的网络并集成一体,这样可以使模型的泛化能力更强,防止单一网络
36、结构过拟合图4.9 Dropout前后神经元数对比图(4)Flatten层经过多次的卷积、池化之后,在卷积神经网络中流动的数据依旧是三维的(图4.10),然全连接层接收的输入要求是一维的数据,因此必须将多维数据“压平”即进行一维化处理后才能作为全连接层的输入。即将(height,width,channel)的数据压缩成长度为 heightwidthchannel 的一维数组就是Flatten层的作用。图4.10多维数据一维化(5)全连接层经过前面若干层卷积+池化的特征提取后,全连接层的作用是把前面提取的“好”的局部特征进行重新整合成完整的图,并舍弃掉“不好”的特征,然后再交给softmax函数
37、,完成最终分类。Softmax用于多分类任务,它将每个神经元的输出映射到(0,1)区间内,从而得到当前样例中不同种类的概率分布情况,Softmax函数形式如下:ajL=ezjLk=1NezkL (4- 3)其中:ajL代表第L层第j个神经元输出,zjL代表第L层第j个神经元的输入,用单个神经元的输入结合常数e做指数运算,并把运算结果除所有L层神经元的指数运算之和,得到一个介于0,1之间的浮点值ajL,从softmax的数学形式我们可以得出所有神经元输出之和应为1,即j=1NajL=1 (4- 4)因此公式ajL=ezjLk=1NezkL (4- 3所求的值就是第j个神经元占全部神经元输出的比重
38、。站在分类的角度,第j个神经元的输出值越大,占总神经元输出的百分比越高,被预测为真实类别的概率就越大。因此,经过分类层softmax函数后,最大概率者即为模型预测类别。4.3.2模型设计卷积神经网络的特点10 许少尉,陈思宇.基于深度学习的图像分类方法J.电子技术应用,2018,44(06):116-119.是逐层提取特征, 第一层提取的特征较为低级, 第二层在第一层的基础上继续提取更高级别的特征, 第三层在第二层的基础上提取的特征也更为复杂,以此类推,越高级的特征越能体现出图像的类别属性,卷积神经网络正是通过逐层卷积的方式提取图像的优良特征。通过keras库的序贯模型(Sequential)
39、来堆叠多个网络层来构建出深度神经网络,keras.models和keras.layers库用于建立并训练模型,通过.add()方法将layer一个个的加入模型中。本程序搭建的CNN卷积网络模型如表4.2所示,包括 4个convl+2个maxpool+3个dropout+2个dense+1个flatten+1个softmax总共18层的神经网络结构。将神经网络结构分为三部分,输入图像为64x64像素的RGB图像。 第一部分为2个convl层、1个maxpool层和dropout层,卷积核个数为32个,大小为3x3,首个卷积层的参数个数为33+132=896,采用保留边界特征的方式卷积计算,这样输
40、入和输出尺寸会保持一致。MaxPooling(2,2)为采取池化尺寸窗口为2x2的最大池化法,因此经过池化层后图像从64x64像素变为32x32大小。第二部分跟第一部分相同,不同的是卷积层的卷积核个数为64,大小不变。第三部分包括1个flatten层,2个dense层和1个dropout层,dense(512)表示512个神经元, dense(4)表示分为四个类,最后使用softmax进行分类;第一、二部分池化层后加入0.25比例的dropout层,第三部分dense层后加入0.5比例的dropout层。激活函数Relu是一种非线性函数,在卷积层、全连接层后加入Relu是在神网络中引入非线性,
41、因为神经网络的计算是线性的,无法模拟非线性的关系,线性神经网络的学习能力非常有限,所以引入非线性,使神经元适应复杂的非线性问题,强化神经网络学习能力。表4.2 网络模型结构层数功能描述1输入图像(64*64*3)2Convol (32,3,3)第一部分3Relu4Convol2D(32,3,3)5Relu6MaxPooling(2,2)7Droupt(0.25)8Convol (64, 3, 3)第二部分9Relu10Convol (64, 3, 3)11Relu12MaxPooling(2,2)13Droupt(0.25)14Flatten()第三部分15Dense(512)16Relu17
42、Droupt(0.5)18Dense(4)19softmax输出层4.3.3模型训练(1)优化器选择设计卷积神经网络采用softmax函数作为输出层的激激函数,使模型可以用于处理多分类任务,该函数选择多类别交叉熵(categorical_crossentropy)作为损失函数,数学形式如下:L=-kyklog(Slk) (4- 5)其中:Slk表示softmax函数输出层的神经元,K个神经元对应k个类别,yk为One-hot编码后的标签,目标类的yk为1,其他类的yk为0。选择随机梯度下降法SGD结合动量Momentum作为损失函数的优化算法,作用是在模型训练过程的每次更新时随机选择一个样本进
43、行梯度下降,调整参数(权重和偏置值)使其最优,确保e值最小。随机梯度下降法的基本思想是只随机选取训练集中的一个样本来学习,每次迭代只是考虑当前样本点,而不管其他的样本点,这样当训练数据太多时,可以快速收敛,提高学习速度。但缺点也很明显,每次梯度下降的方向完全依赖当前的训练样本(batch),导致收敛过程曲折,模型迭代次数增多。为使优化更加稳定,引入动量(Momentum),Momentum的概念来自于物理学的力学,其基本原理是模拟物体运动时的惯性,即让优化器在每次更新时保留一定范围的上一轮更新后的方向,同时又根据这一轮的样本调整最终优化方向,这样能增加稳定性又能提高模型学习速度,避免陷入局部最
44、优陷阱。利用keras库提供的model.fit_generator()函数开始模型训练。self.model.fit_generator(datagen.flow(dataset.train_images, dataset.train_labels, batch_size = batch_size), samples_per_epoch = dataset.train_images.shape0, nb_epoch = nb_epoch, validation_data=(dataset.valid_images, dataset.valid_labels)参数nb_epoch指定模型需要进
45、行多少轮次的训练,一轮次训练为训练集全部样本训练一次。参数batch_size指定每次迭代训练样本的数量。为了使模型训练到最优,在每一轮次的训练中还要进行多次的迭代训练,事实上每次迭代训练后,模型在理论上应该朝梯度下降的方向前进一步,直到所有样本数据训练完毕,模型梯度降到本轮训练最低点,训练到此完成,将最终模型保存在程序目录下,存储形式为高压缩效率的HDF5。(2)训练结果模型训练完成后,还需要对模型进行评估,通过keras提供的model.evaluate评估函数。模型训练的数据通过人脸采集模块获取,选取4个人的4张人脸,每张人脸500张图像数据,总共2000张图片作为样本数据,在人脸识别系
46、统中每张人脸为一个类别,总共4个类别。将处理过的图像数据传入网络结构进行训练,训练结果如下: 图4.11神经网络结构可以清晰的看到网络模型的基本结构信息,包括网络层类型、输出数据的维度、每层训练参数个数、总训练参数个数。图4.12 模型训练结果整个模型训练完成一共进行8轮次训练(nb_epoch = 8),每轮再循环35次迭代训练,每次迭代使用20个样本数据(batch_size = 20),结果如表4.3所示(以最后一轮的训练结果为例):表4.3 模型评估结果训练误差(loss)0.0593训练准确率(acc)0.9886验证误差(val_loass)0.0453验证准确率(val_acc)0.9933最终评估模型的准确率为99.60%。图4.13 模型评估结果第五章 系统识别结果系统的识别过程如下:启动系统后,点击识别按钮,系统调用摄像头开启,当人脸检测分类器检测出摄像头存在人脸时,划出脸部区域,并截取一张图像,通过图像预处理后交予模型识别,图像处理与章节4.2的数据