2026/1/5 12:42:30
网站建设
项目流程
商户网站唯一订单号,东莞百度seo关键词优化,用discuz做的网站,网站后台 开源基于 SeetaFaceVS2017Qt 的人脸识别
1 目的
目前计算机视觉技术已经比较成熟#xff0c;相关的开源项目与算法很多#xff0c;可以将这些开源算法进行整合#xff0c;进而做成一个小项目#xff0c;以供日后学习与研究。本实验主要将利用人脸识别开源项目SeetaFace#…基于 SeetaFaceVS2017Qt 的人脸识别1 目的目前计算机视觉技术已经比较成熟相关的开源项目与算法很多可以将这些开源算法进行整合进而做成一个小项目以供日后学习与研究。本实验主要将利用人脸识别开源项目SeetaFace结合使用OpenCV工具结合VS2017与Qt实现一个人脸识别的小项目。最后对实验系统进行测试评估。2 相关知识与技术介绍2.1 OpenCV 简介OpenCV(Open Source Computer Vision Library)是一个开源的可以跨平台运行的计算机视觉库可以运行在 Linux、Windows、Android 和 Mac OS 操作系统上。它轻量级而且高效由一系列 C 函数和少量 C 类构成同时提供了 Python、Ruby、MATLAB 等语言的接口实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 的设计理念是所包含的函数能以最快的速度进行编译之所以使用 C 代码进行编写就是希望能够利用多核处理器的优势达到最快的运行速度。它构建了一个方便开发人员使用的、简单易懂的计算机视觉框架在这个基础上开发人员能都更方便的设计出更复杂的计算机视觉相关程序。OpenCV 是由 Intel 发起的项目其中的源代码都是开源免费的代码因此可以用于科研人员的研究领域也可以用于商业领域。最新的版本 OpenCV3.4.2 已于 2018 年 7 月 4 日发布。2.2 SeetaFace 简介SeetaFace 是由中科院山世光老师带领的人脸识别研发组基于 代码研发的人脸识别算法。SeetaFace 人脸识别引擎包括了搭建一套全自动人脸识别系统所需的三个核心模块即人脸检测模块 SeetaFace Detection、面部特征点定位模块 SeetaFace Alignment 以及人脸特征提取与比对模块 SeetaFace Identification。其中SeetaFace Detection 采用了一种结合传统人造特征与多层感知机MLP的级联结构在 FDDB 上达到了 84.4% 的召回率100 个误检时并可在单个 i7 CPU 上实时处理 VGA 分辨率的图像。面部特征点定位模块 SeetaFace Alignment 通过级联多个深度模型栈式自编码网络来回归 5 个关键特征点两眼中心、鼻尖和两个嘴角的位置在 AFLW 数据库上达到 state-of-the-art 的精度定位速度在单个 i7 CPU 上超过 200fps。人脸识别模块 SeetaFace Identification 采用一个 9 层的卷积神经网络CNN来提取人脸特征在 LFW 数据库上达到 97.1% 的精度注采用 SeetaFace 人脸检测和 SeetaFace 面部特征点定位作为前端进行全自动识别的情况下特征提取速度为每图 120ms在单个 i7 CPU 上。3 基于 SeetaFace 的人脸识别算法SeetaFace人脸识别引擎包括三个核心模块即人脸检测模块SeetaFace Detection、面部特征点定位模块SeetaFace Alignment以及人脸特征提取与比对模块SeetaFace Identification。下面对上述三个模块的情况做简要介绍。3.1 人脸检测模块 SeetaFace Detection该模块基于一种结合经典级联结构和多层神经网络的人脸检测方法实现其所采用的漏斗型级联结构Funnel-Structured CascadeFuSt专门针对多姿态人脸检测而设计其中引入了由粗到精的设计理念兼顾了速度和精度的平衡。如图1所示FuSt级联结构在顶部由多个针对不同姿态的快速LAB级联分类器构成紧接着是若干个基于SURF特征的多层感知机MLP级联结构最后由一个统一的MLP级联结构同样基于SURF特征来处理所有姿态的候选窗口整体上呈现出上宽下窄的漏斗形状。从上往下各个层次上的分类器及其所采用的特征逐步变得复杂从而可以保留人脸窗口并排除越来越难与人脸区分的非人脸候选窗口。图1 SeetaFace人脸检测模块所采用的FuSt漏斗型级联结构整个算法采用漏斗型先采用计算量小的特征快速过滤大量非人脸窗口图像滑窗然后采用复杂结构逐层筛选人脸。由图 2 所示 SeetaFace 检测效果图看到在人脸局部遮挡的情况下也能很好的检测到人脸区域。图2 SeetaFace检测效果图3.2 面部特征点定位模块 SeetaFace Alignment面部特征点定位人脸对齐在人脸识别、表情识别、人脸动画合成等诸多人脸分析任务中扮演着非常重要的角色。由于姿态、表情、光照和遮挡等因素的影响真实场景下的人脸对齐任务是一个非常困难的问题。形式上该问题可以看作是从人脸表观到人脸形状的复杂非线性映射。为此SeetaFace Alignment采用一种由粗到精的自编码器网络Coarse-to-Fine Auto-encoder Networks, CFAN来求解这个复杂的非线性映射过程。如图 3 所示CFAN 级联了多级栈式自编码器网络其中的每一级都刻画从人脸表观到人脸形状的部分非线性映射。具体来说输入一个人脸区域由人脸检测模块得到第一级自编码器网络直接从该人脸的低分辨率版本中快速估计大致的人脸形状 S0。然后提高输入人脸图像的分辨率并抽取当前人脸形状 S0相应提升分辨率各特征点位置的局部特征输入到下一级自编码器网络来进一步优化人脸对齐结果。以此类推通过级联多个栈式自编码器网络在越来越高分辨率的人脸图像上逐步优化人脸对齐结果。图3人脸对齐方法此次开源的 SeetaFace Alignment 基于上述 CFAN 方法实现了 5 个面部关键特征点两眼中心鼻尖和两个嘴角的精确定位训练集包括 23,000 余幅人脸图像标注了 5 点。需要注意的是为加速之目的在基本不损失精度的情况下开源实现中将 CFAN 级联的数目减少到了 2 级从而可在单颗 Intel i7-3770 (3.4 GHz CPU)上达到每个人脸 5ms 的处理速度不包括人脸检测时间。图 4 是本文通过 SeetaFace Alignment 分别对不同人员在不同状态特征点定位得到的效果图。测试中发现通过多次验证在不同表情、不同面部偏转角度、抬头低头、脸部局部遮挡等情况下都能有效的定位。且对于戴眼镜测试者也能很好的定位到特征区域。图4 SeetaFace人脸对齐3.3 人脸特征提取与比对模块 SeetaFace Identification人脸识别本质上是要计算两幅图像中人脸的相似程度其一为注册阶段类比人的相识过程输入系统的另一幅为识别阶段即再见时的辨认过程的输入。为此如图 5 所示一套全自动的人脸识别系统在完成前述的人脸检测与人脸对齐两个步骤之后即进入第三个核心步骤人脸特征提取和比对。这个阶段也是深度学习风起云涌之后进步最大的模块目前大多数优秀的人脸识别算法均采用卷积神经网络CNN来学习特征提取器即图 5 中的函数 F。图5 人脸识别系统的核心流程SeetaFace 开源的人脸特征提取模块也是基于卷积神经网络的。具体地说是深度卷积神经网络 VIPLFaceNet一个包含 7 个卷积层与 2 个全连接层的 DCNN。其直接修改自 Hinton 教授的学生 Alex Krizhevsky 等于 2012 年设计的 AlexNet即引爆 CNN 在视觉中广泛应用的网络。与开源的 SeetaFace Identification 代码一起发布的人脸识别模型是使用 140 万人脸图像训练出来的这些训练图像来自于约 1.6 万人其中既有东方人也有西方人。人脸特征直接采用 VIPLFaceNet FC2 层的 2048 个结点的输出特征比对可简单采用 Cosine 计算相似度然后进行阈值比较验证应用或排序识别应用即可。在 LFW standard Image-Restricted 测试协议下使用 SeetaFace Detection 与 SeetaFace Alignment 检测并对齐人脸采用 SeetaFace Identification 进行特征提取和比对可以达到 97.1% 的识别正确率请注意这是系统全自动运行的结果对少量不能检到人脸的图像截取中间区域输入人脸对齐模块即可。速度方面在单颗 Intel i7-3770 CPU 上开源代码提取一张人脸之特征的时间约为 120ms不含人脸检测和特征点定位时间。4 系统环境搭建与实验结果通过对上述的理论知识的了解学习接下来进行系统的环境搭建然后进行具体的实验。然后对实验结果做一定的分析。4.1 系统的总体设计方案首先使用摄像头读取采集的图像经过人脸检测模块框出人脸然后使用面部特征点定位(人脸对齐)模块对5个面部关键特征点两眼中心鼻尖和两个嘴角进行标记显示最后使用人脸特征提取与比对模块进行人脸特征提取和比对。在系统中设置一个阈值0.7若比对后的相似度大于0.7就认定为同一个人并触发警报系统。系统的功能框图如图6所示。图6 系统功能框图4.2 配置系统环境4.2.1 配置 OpenCVOpen CV中包含很多图像处理的算法因此学会正确使用Open CV也是人脸识别研究的一项重要工作。在 VS2017中应用Open CV需要进行手动配置下面给出在VS2017中配置Open CV的详细步骤。1.下载并安装 OpenCV3.4.1 与 VS2017 的软件。2.配置 Open CV 环境变量。计算机-右键属性-高级系统设置-高级-环境变量-双击系统变量中的path-在变量只里面添加相应的路径。添加的路径为“....opencv\build\x64\vc15\bin”。里面的省略号请换成自己电脑上的路径例如E:\opencv\build\x64\vc15\bin。如图7所示。图7 配置OpenCV环境变量3.配置工程目录与链接库需要配置包含目录和库目录首先打开视图- 解决方案管理器-右键项目- 属性-VC 目录。1)配置包含目录。添加“...opencv\build\include;...opencv\build\include\opencv;...opencv\build\incude\opencv2”即可里面的省略号请换成自己电脑上的路径如图 8 所示。图8 配置包含目录2)配置库目录添加“E:\opencv\build\x64\vc15\lib 即可里面的省略号请换成自己电脑上的路径如图 9 所示。图9 配置库目录3)配置链接库首先打开视图- 解决方案管理器-右键项目- 属性- 链接器- 输入- 附加依赖项针对 Debug 配置添加“opencv_world341d.lib”,若在 Release 下就添加“opencv_world341.lib”。这是 OpenCV3 版本的方便之处OpenCV2 版本需要添加很多项。操作如图 10 所示。图10 配置链接库上述三步配置要注意每次新建工程都要重新配置但也可以只配置一次达到以后都不用单独配置的效果那么就在属性管理器- 展开项目-Debug|x64(或者 Release|x64)-(双击)进 Microsoft.Cpp.x64.user然后后续操作和前面三步一样。4.2.2 配置 SeetaFace项目里自带 doc 格式的配置文档具体配置请参考配置文档这里就不再说明如何配置。下载代码压缩包即可。目前只是提供一些动态库没有完全开源代码有兴趣的可以去试试。在 VS2017 中新建三个 dll动态链接库项目将 SeetaFace 的三个模块 FaceDetection、FaceAlignment 和 FaceIdentification 分别制作成 DLL 项目然后将生成的 lib 和 dll 文件保存下载以便在项目中直接添加使用。在这里就不详细地进行具体配置说明了。关于包含目录、库目录、附加包含目录、附加库目录、附加依赖项如何使用? 及静态库动态库的创建与调用和 vs 里引用的使用不要了解的可以参考文章https://blog.csdn.net/young__fan/article/details/805287404.2.3 配置 Qt 插件在VS2017上安装Qt插件在VS2017菜单栏-工具 - 扩展和更新-联机,然后在右侧的搜索框中输入“Qt”并回车。搜索结束后可以在返回的搜索列表中见到“Qt Visual Studio Tools”。选中它并点击“下载按钮”下载该插件如图11所示。在这里建议最好不要使用Visual Studio Community 2017社区版我之前用的就是社区版怎么都装不上Qt插件社区版应该是阉割版的VS要是装不上插件多半是社区版的问题建议下载VS2017专业版的或者企业版网上都有秘钥。图11 在VS2017上安装Qt插件下载好 Qt 插件以后关闭 VS2017 软件而后会自动弹出“VSIX 安装器窗口”然后直接点“修改按钮”确定安装。紧接着重新启动 VS2017会发现菜单栏中多了一个“Qt VS Tools”点击菜单栏上的“Qt VS Tools Qt Options”点击 “Add 按钮”打开“Add New Qt Version 窗口”。在该窗口中写入自定义的 Qt 版本名称并指定 Qt 工具集所在目录比如C:\Qt\Qt5.9.0\msvc2017_64。前提是你的电脑已经安装了 Qt然后点击“OK 按钮”完成 Qt 版本添加接下来就可以新建 Qt 项目了VS2017 菜单栏上选择“文件 - 新建 - 项目可以见到名为“Qt”的项目模块然后选择 Qt GUI Application如图 12 所示。图12 新建Qt项目4.3 系统的软件实现系统的硬件部分是基于一个720p罗技c310的USB摄像头进行图像采集工作所以重要的工作在软件设计方面。下面将进行具体的软件实现。4.3.1 系统中的图像类型转换通过 OpenCV 中 VideoCapture 类可以进行图像的逐帧采集采集到的图像类型为 Mat 类型。SeetaFace 中的图像类型为 ImageData 类型而且在后面的 Qt 平台下会使用到的图片类型为 QImage。以上这三种类型在某些情况下需要进行必要的转换下面对具体的类型转换进行说明。1)Mat 类型转 ImageData首先将 Mat 类型的图片转为单通道的灰度图如果已是灰度图就不用转了具体转化代码如下cv::Mat img; cv::cvtColor(frame, img_gray, cv::COLOR_BGR2GRAY); seeta::ImageData image; image.data img.data; image.width img.cols; image.height img.rows; image.num_channels 1;2)Mat 类型转 QImage其中需要将 Mat 类型的 BGR 通道顺序变换为 QImage 的 RGB 顺序可以调用 OpenCV 中的 cvtColor 函数实现以上是对两种图像类型的 data 部分的格式进行调整下一步只需要明确 Mat 的头结构里的变量与 QImage 的头结构里的变量的对应关系即可实现转换具体转换代码如下Mat frame,temp; cvtColor(frame, temp, CV_BGR2RGB); QImage image QImage((const unsigned char *)(temp.data), temp.cols, temp.rows, QImage::Format_RGB888);3)QImage 类型转 Mat与 2)类似将 QImage 的 RGB 通道顺序变换为 Mat 类型的 BGR 顺序然后将 QImage 的头结构里的变量与 Mat 的头结构里的变量的对应关系即可实现转换具体转换代码如下Mat frame; cv::Mat Temp cv::Mat(image.height(), image.width(), CV_8UC3,(void*)image.constBits(), image.bytesPerLine()); cvtColor(Temp,frame,CV_RGBA2BGR);4.3.2 线程设计把系统分为两个线程即主线程与子线程。主线程主要负责 UI 及一些一般的处理子线程负责人脸特征提取与比对模块 SeetaFace Identification 部分的数据处理因为这块比较耗资源如果都放在子线程的话会是 UI 卡顿。1)主线程主线程部分主要进行摄像头的采集图像并显示在 UI 上以及人脸对齐的显示然后就是一些其他的小功能例如拍照/截图功能。下面就主线程的主要功能进行分析与说明。因为是对摄像头采集的图像进行基本类似于实时的处理因此在系统中设置定时器进行定时处理因为主线程中有 UI 还要工作的原因故设置为死循环的方式不可取。在 Qt 中的定时器设置定时时间长度设定为 35ms理论上大概每秒能获取 28 帧图像基本可以满足实时性的要求。在获取摄像头图像的基础上进行 5 个面部关键特征点两眼中心鼻尖和两个嘴角的定位并显示在 UI 上。主体流程图如图 13 所示。图13 主线程主体流程图2)子线程因为系统要基于 Qt 实现 UI其他线程中不能操作 UI 对象只有主线程能对 UI 进行操作所以将人脸特征提取与比对模块 SeetaFace Identification 放在子线程。将 SeetaFace Identification 部分的处理函数设置为可控的死循环设置 bool 变量来对死循环进行控制。然而UI 要将处理后的信息显示出来因此线程之间要进行通信。3)线程通信线程的通信部分可以使用 Qt 的“信号与槽”功能使用连接函数将信号与槽函数连接将线程中需要传递的数据放在信号中一旦信号发射就执行相应的槽函数来完成线程之间的通信任务。流程图如图 14 所示。图14 线程通信流程图由图 5 所知要在系统中输入一张需要进行比对的图片在 UI 中通过按钮获取该图片的路径信息然后通过信号发射这个路径然后子线程那边接收到信号后将这个图片路径获取下来以便进行接下来的人脸特征提取与比对。当主线程触发人脸识别的信号以后子线程接收后将摄像头获取的图像与输入图像进行人脸特征提取与比对。最后将人脸比对的相似度及被认定为同一个人的裁剪人脸通过信号发送给主线程主线程在 UI 上进行数据显示。4.4 基于 Qt 的 UI 设计Qt 是一个跨平台的 C 图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的很容易扩展并且允许真正的组件编程。Qt 提供了一种称为信号与槽的方式使得各个元件之间的协同工作变得十分简单。Qt 拥有自己的集成开发环境IDE名为 Qt Creator但为了使各个部分的衔接方便在 VS2017 上安装一个叫 Qt Visual Studio Tools 的 Qt 插件。这样就可以进行 VS 加 Qt 的混合编程。1)UI 设计图图15 UI的设计图2)信号与槽UI 部分主要使用的是按钮来进行操作按钮的点击信号与对应的槽函数如图 16 所示。具体的槽函数请参见附录中的代码。图16 信号与槽4.5 实验结果与分析在完成上述的各项准备工作之后下面就进行最后的整体调试工作。运行已经写好的程序然后生成应用程序界面界面样式如图 17 所示。采用了一些逻辑方法去除了窗体的边框然后再右上角设置了一个关闭按钮这个关闭按钮具有关闭线程退出窗口等其他功能。图17 应用程序界面接下来通过具体的实验来进行演示操作具体操作为打开摄像头- 人脸检测与对齐- 输入图片- 人脸识别。可以发现 SeetaFace 具有很好的识别能力在输入同一个人的照片后进行人脸识别可以达到 0.9 以上相似度图 16 中的相似度为 0.911083然后显示发现目标并发出警报可见效果还是很不错的如图 18 所示。图18 同一个人的效果演示然后为了对比再输入一张非同一个人的照片结果相似度为 0.2 以下图 17 中的相似度为 0.167754判定为不是同一个人因此没有输出裁剪的人脸和发出警报如图 19 所示。图19 不同人的效果演示在实验过程中发现一个问题当输入一张同一个人之前的照片识别的相似度会有所下降会比输入现拍的照片相似度低但也基本大于 0.7图 18 中的相似度为 0.76884即被判别为同一个人如图 20 所示。可能这是 SeetaFace 算法存在的小缺陷吧证明算法还有优化的空间。图20 输入非现拍图片的效果演示基于同样的原理该系统还具备视频人脸识别功能。打开一段视频输入一张图片即可实现在视频中查找到与输入图片为同一个人的人脸然后将找到后人脸保存在应用程序的文件夹中实验效果如图 21 所示图 19 中的相似度为 0.7762。图21 视频人脸识别5 总结本文主要利用人脸识别开源项目SeetaFace使用OpenCV作为图像处理工具结合集成开发环境VS2017与C图形用户界面应用程序框架Qt实现一个人脸识别的小项目。主要工作是首先进行系统各项环境与功能的搭建与实施在基于开源库与项目的基础进行了应用性的实验与结果分析。本文首先进行了基本知识与技术的介绍进行了相关理论的了解与学习为接下来的系统实施打下了基础。OpenCV 是图像处理常用的工具在在学习与科研过程中具有很好的帮助性。SeetaFace 作为为数不多的开源人脸识别项目很值得学习与研究是一个很不错的开源项目。接下来本文进行了系统环境的搭建与实验然后根据实验进行了结果分析。在系统搭建环节首先确定了系统的总体设计思路然后进行了系统环境配置。首先配置的是 OpenCV其次进行 SeetaFace 的配置然后在 VS2017 上配置了 Qt 插件。在系统软件设计中先进行了系统中图像类型转换的介绍然后进行了多线程的设计。最后实施了具体的实验根据实验对系统进行了分析与探讨。从实验结果发现该系统具有良好的人脸识别特性但也有一些需要优化的空间。本文虽然基本整体实现了系统设计的功能但在许多方面还存在着瑕疵还有很多值得改进的地方。其实可以将该系统进行嵌入式等相关平台的移植进一步增加该系统的应用价值。