英语原文共 6 页,剩余内容已隐藏,支付完成后下载完整资料
基于 OpenCV 的性别、年龄和人脸识别的Android应用开发
经济与旅游学院,“Mijomirkovi 博士”,
信息学院
普拉大学,普拉,克罗地亚
摘 要:人脸识别系统背后的原理是每个人都有一张独特的脸。就像指纹一样,一个人的脸有许多独特的结构和特征。面部认证和面部识别是具有挑战性的任务。为了使面部识别系统更加可靠,必须让它们在应用中有很好的准确性和 精密性。考虑到不同的面部表情或光照条件而捕捉到的图像,与数据库中只存储每个人的一张图像的情况相比,可以让系统有更大的准确性与精密性。人脸识别方法处理捕获的图像并将其与存储在数据库中的图像进行比较。如果找到匹配的模板,则识别个体。否则,这个人就会被报道为身份不明。本文详细描述和介绍了用于识别人的性别、年龄和面孔Android 移动应用程序开发的整个过程。介绍了当前的人脸检测和识别方法以及在 Android 移动应用开发中使用的开发工具。该软件解决方案介绍了使用OpenCV 库的细节,并通过图像的方式显示了移动应用程序的实际结果。
关键词:人脸检测; 深层神经网络; 人脸识别; Android应用; 性别、年龄、人脸识别; OpenCV; AndroidStudio;
1 引言
人脸识别系统是近二十年来研究的热点和重点领域之一。其原因主要有自动识别与监控系统的需求、人们对人脸识别的兴趣以及人机交互等。研究对象包括神经科学、心理学、计算机视觉、模式识别、图像处理和机器学习等领域的知识和研究人员
可靠的人脸识别的第一步是检测图像中出现人脸的位置。人脸检测是人脸识别的基础。然而,对于计算机系统来说,这是一项艰巨的任务,它会影响到人脸的位置、人脸的定位、人脸的表情、部分人脸的覆盖、照明条件等问题。
本文将探讨在 OpenCV 库的帮助下,以Android 应用程序的形式在移动设备上实现人脸识别系统、性别和年龄识别的可能性。
论文的其余部分结构如下。第二部分简要介绍了生物特征识别系统。第三部分介绍了用于人脸检测和人脸识别的算法。第四部分介绍了系统的设计和应用功能。第五部分介绍了软件解决方案,并通过代码片段和结果进行了详细的解释。最后得出结论。
2 生物识别系统
生物特征识别系统本质上是一种模式识别系统,它通过确定用户所具有的某种身体或行为特征来进行个人身份识别。生物特征识别系统可分为数据登记模块和身份识别模块。
在注册阶段,个人的生物特征被生物特征传感器扫描,以获得特征的数字表示。为了方便匹配和减少存储需求,特征提取器对数字表示进行了进一步处理,以创建一个紧凑但具有表达能力的表示,称为模板。在识别阶段,生物识别传感器捕获待识别个体的特征,并将其转换为数字格式,由特征提取器进一步处理,以获得与模板相同的表示。表示的结果输入到特征匹配器中,该匹配器将其与模板进行比较,以确定个体的身份[4]。
3 人脸检测与识别
对于图像,人脸检测的目的是确定图像中是否存在人脸,如果存在人脸,则恢复人脸在图像中的位置和每个人脸的范围。有许多相关的人脸检测问题。其中一些困难可能是确定图像中脸部的位置,检测面部特征的存在和位置,如眼睛、鼻子、眉毛、鼻孔、嘴巴、嘴唇和耳朵,以及确认个人在图像中的身份的脸部鉴定,实时评估其位置和方向,以及识别脸部的情绪状态。因此,人脸检测是解决上述问题的自动化系统的第一步[8]。
局部二值模式(LBP)是一个非常有效的纹理算子,来自于一个局部邻域的纹理的一般定义局部二值模式。由于其判别能力和计算的简单性, LBP 纹理算子已经成为各种应用中的热门方法。它可以被看作是一种独特的方法,传统的统计和结构模式 的纹理分析。也许LBP 算子在现实应用中最重要的 特点是它能够抵抗单调的灰度变化,例如光照变化引 起的灰度变化。另一个重要特征是它的计算简单性, 这使得在具有挑战性的实时环境中对图像进行分析成 为可能[7]。
原始 LBP 算子对每个像素的 3x3 邻域进行中心值阈值化,并将结果视为二进制数,从而对图像像素形成标签。这些不同标签的直方图可以用作纹理描述符 [3]。在应用 LBP 算法之前,需要对我们要识别的人 脸图像的数据集进行训练,并为每个图像设置一个 ID,以便算法在输出结果中使用该信息。
如图 1 所示,在面部灰度图像的例子中,LBP 算子取图像的 3x3 像素部分,该部分也可以表示为 3x3 矩 阵,其中包含每个像素的亮度(0-255)。以矩阵的中心 值作为阈值,定义 8 个邻域的新值。对于阈值的每个邻居,将设置一个新的二进制值。如果该值低于阈值,则为 0;如果该值等于或高于阈值,则为 1。该矩阵将只包含二进制值,如果连接形成一个新的二进制值。然后,将新的二进制值转换为十进制值,并将其设置为矩阵的中心值, 它实际上是原始图像的一个像素。在操作结束时,生成一个新的图像,更好地代表了原图像的特征。
图1 LBP操作实例[8]
Lbph(LocalBinaryPatternHistogram)算法使用四个参 数:半径、邻域、网格 x 和网格 y。半径用于建立圆形 局部二进制模式,表示中心像素周围的半径,通常设 置为 1。邻居表示用于构建循环局部二进制模式的样 本点数,通常设置为 8。网格 x 表示水平方向上的单 元格数量,通常设置为 8。网格 y 表示垂直方向上的 单元格数,通常设置为 8。
提取用于人脸识别的直方图,将图像划分为具有网 格 x 和网格 y 参数的多个网格,如图 2 所示。每个网格的每个直方图将包含 256 个位置,代表每个像素强 度的出现。最终直方图是由每个直方图的连接创建的, 它代表了原始图像的特征。在进行人脸识别时,根据 给定输入图像的最终直方图表示训练数据集中的每一 幅图像。比较两种直方图,输入图像和训练图像,算 法返回最接近直方图的图像[8]。
图2 提取直方图的示例[8]
4 设计及功能
使用案例图,如图 3 所示,描述了与移动应用程序 的交互设计,其中显示和描述了与移动应用程序交互 的所有可能选项。
主屏幕显示了选择三种不同行为的选项,性别,年龄,或者脸部识别。按下所需的任何动作都会触发选 定的活动。在每个活动开始时,初始化一个摄像机,以处理实时图像。另外,通过初始化摄像机、将人脸检测分类器加载到移动应用程序的后台。当性别或年龄识别活动开始时,预先训练的性别 和年龄识别模型的数据载入背景。
应用程序支持同时检测所有人脸,但由于移动设备 资源有限,不支持同时识别所有人脸。通过选择人脸 识别,启动一个训练活动,用户必须获取一定数量的 他想要识别的人的面部图像。在训练活动中,可以在 设备存储器中捕获和保存人脸图像,建立人脸识别模 型,自动将提取的人脸特征存储在设备存储器中,删 除所有人脸图像,删除人脸特征分类器,并在满足以 上条件后运行人脸识别活动。在识别过程中,相机帧中只能出现一张人脸,然后自动初始化识别性别、年 龄或人脸。
人脸检测结果是可见的,因为在相机框架中,每个 被检测的人脸周围都有矩形范围,并且识别结果会根 据它们的活动写入被检测人脸周围出现的矩形上方。 性别认知结果的可能价值是:“男性,女性”。当认识到 年龄时,结果的可能值可能是:“0-2,4-6,8-13,15-20,2532,38-43,48-53,60 ”。在人脸识别中,结果的价值实 际上是在相机帧中与人脸匹配概率最高的图像编号。
图3用于性别、年龄和脸部识别的 Android应用使用案例图
5 软件解决方案
与相机的每一次交互都是通过 OpenCV 抽象类 cameragridgeviewbase执行的。课程的任务是与相机和 OpenCV 库进行交互。主要职责是控制相机何时可以启用、相机帧处理、调用任何相机帧调整的外部接口以及将相机帧结果呈现给移动 设备显示器。接口,启动,停止和相机框架操作是Cvcameraviewlistener2 及 其 方 法 ,onCameraViewStarted() 、 onCameraViewStopped() 和 onCameraFrame()。方法 onCameraViewStarted()在相机预览开始时被调用,然后通过 onCameraFrame()回调将帧传递给客户端。方法 onCameraViewStopped() 在相机预览由于某种原因被停止并且没有帧通过 onCameraFrame()回调发送到客户端之后被调用。方法 onCameraFrame()在需要传递帧并且返回的值是需要被修改的帧时被调用显示在屏幕上。它接受 cameragridgeviewbase.cvcameraviewframe 输入帧,这个帧表示 onCameraFrame()回调的一个单帧,它必须由它的默认方法 gray()或 rgba()操作,并返回具有帧的指定Mat对象。
为了能够访问移动设备摄像头,添加了文件 AndroidManifest.xml 中的权限。对于人脸检测,我们使用了 OpenCV 的目标检测级联分类器,它允许我们加载之前评估过的级联分类器。利用训练好的 LBP 人脸特征分类器以 XML文件的形式实现人脸检测。
- 人脸检测
为了成功地进行人脸检测,当前的摄像机帧实时采用了 Mat类,即应用于所有 OpenCV2d 计算机视觉应用程序。类实际上是基本的映像容器。它可以显示为包含两部分数据的类。矩阵头,其中包含的信息,如矩阵大小,存储 使用方法,存储矩阵的地址和矩阵指针,其中包含像素值。
使用 detectMultiScale()方法,参见图 4,我们可以 检测给定相机帧中的各种大小的面,并将它们保存到 MatOfRect 对象中。为了能够在图像中检测到的每个 面周围绘制一个矩形,所有检测到的面都存储在一个 二维数组中。使用 ImgprocOpenCV 图像处理模块的 方法矩形()绘制被检测面周围的矩形。
图4 检测到人脸检测和在周围绘制矩形
- 性别和年龄识别
性别和年龄识别使用李维和哈斯纳的咖啡模型[5]。该模型通过 Adience 收集的未经过滤的人脸进行性别和年龄分类,包含 26580张图像,共有2284名受试者。 Adience 收藏的照片来源于 flickr.com的相册,这些相册是通过 iPhone5或更新版本的智能手机自动上传制作的,可以通过知识共享图书馆公开获取许可证。所有的图片都是手动标记年龄和性别,使用图片本身和任何可用的上下文信息(图片标签,相关文字,同一相册中的附加照片等)。
卷积神经网络包含 3 个卷积层,每个卷积层后面 跟着一个纠正的线性操作和一个池层。第一卷积层包 含 96 个 7x7 像素的滤波器,第二卷积层包含 256 个 5x5 像素的滤波器,第三卷积层包含 384 个 3x3 像素 的滤波器。最后,增加两个完全连接的层,每层包含 512 个神经元。最后,结果是从完全连接的层,这是类属性,在这种情况下,性别或年龄,输入图像属于 [5]。该模型由 Dnn 深度神经网络 OpenCV 模块实现。 性别识别结果被描述为 0 或 1 的输出值,其中 0 表示男性,1 表示女性。在年龄识别中,年龄估计的结果以产出值的形式描述,每个值代表一个特定的年龄 组;0-2,4-6,8-13,15-20,25-32,38-43, 48-53,60 。
如图 5 所示,作为参数的年龄识别方法需要从移动相机的RGBA帧和检测到的面孔的二维阵列。在该方法中,将创建一个新的 Mat 对象,该对象仅包含整个框架中检测到的面。然后,面部图像降低到我们所使用的卷积神经网络的图像分辨率,227x227,并切换到 BGR 格式的三通道图像。在初步的图像处理之后,图像通过深层神经网络发送,其中最高值的结果通过静态类 MinMaxLocResult 检索,该类打印检测到的面孔所属的性别或年龄组类号,并将结果作为 String变量返回。年龄识别结果如图 6所示。
- 面部识别
在实现人脸识别之前,需要对人脸图像进行人脸 识别模型的训练。通过在移动设备显示器上按下“捕 获”键,执行获取检测到的人脸图像的方法。方法参数,如图 8 所示,是图像数量,RGBA 框架和人脸检测分类器。在方法执行的最初,在存储脸部图像的设备内存中创建一个名为 FacePics 的目录,以及 XML 格式的训练过的脸部识别模型。然后进行初步的图像处理,将 RGBA 帧转换为灰度图像,从整幅图像中只检测和提取一个人脸,将人脸图像的分辨率降低到 92x112,并对人脸图像进行直方图均衡。初步图像进行处理,以优化资源和性能所需的计算训练的人脸识别算法。脸部图像使用 OpenCV 读写图像模块 Imgcodecs保存到 Pictures目录的 FacePics中。
获取人脸图像后,接下来的动作是对训练人脸识别模型的图像处理,建立人脸识别模型,利用人脸图像和相应的人脸标签进行人脸识别模型训练,并将训练好的人脸识别模型保存到设备。将 FacePics 目录中保存的每个映像加载到一个灰度,并保存在垫对象中。每个图像的标签实际 上是图像的数量。然后对输入图像进行处理,最后将 每个图像保存在 MatVector 对象中,并将相应的标签 写入到 Mat对象中。
移动应用程序使用 LBPH 人脸识别模型,该模型 使用 OpenCV 人 脸 分 析 模 块 Face 中 的 静 态 FaceRecognizer 类创建。在创建了人脸识别模型之后, 就可以使用它的方法了。其
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[235453],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。