# 基于Hi3519AV100平台的人脸识别系统 **Repository Path**: Jundy/hi3519av100-face-recognition ## Basic Information - **Project Name**: 基于Hi3519AV100平台的人脸识别系统 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2021-10-04 - **Last Updated**: 2021-10-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于Hi3519AV100平台的人脸识别系统 ## 项目介绍 ### 综述 本项目基于Hi3519AV100平台开发了一个人脸识别系统,能够实时识别人脸、用蓝色细框圈出人脸、并将分类和识别准确率通过套接字发送到主机客户端。该系统应用于教师签到场景。 ### 小组成员 刘定邦(队长)、杨博康、张艺粲、熊天晨 ### 系统架构 这是一个多设备系统,主要有人脸识别设备和签到管理设备。设备间需要通信, 因此要用到网络。以下是系统的网络架构。 ![alt 网络架构](images/1234.jpg) 图中,开发板为人脸识别设备,客户端为签到管理设备。它们在同一个局域网 内,通过网络进行通信。摄像头和屏幕为系统的输入和输出设备。调试机器和开发 板通过串口连接。图中,这根连线为虚线,这是因为它的功能仅仅是配置与部署开 发板,以及在系统出故障时调试。在系统启动后,调试机器即可断开连接。 下图是系统的功能架构。 ![alt 功能架构](images/2345.jpg) 系统主体分为两大部分,一个是人脸识别系统,一个是管理客户端(签到管理)。 人脸识别系统又分为两个子模块:一个是系统初始化模块,包括对媒体处理芯片、 算法、UI交互功能以及网络通信等的初始化和设置;一个是人脸识别模块,即算法、 UI交互的具体功能实现以及网络发送。管理客户端也分为两个子模块,一个是统计界面,上面显示签到数据及其统计信息;一个是网络接收模块,负责接收开发板发 送的分类标签及准确率信息并传递给统计界面。 ### 子模块设计 #### 系统初始化模块 单独将系统初始化模块作为一个子模块,其原因在于对于整个系统的启动较为 复杂。系统各项功能的设置与启动、算法功能的预处理、网络通信功能的设置都需 要进行大量工作。下图为系统初始化模块工作的流程。 ![alt 系统初始化](images/3456.jpg) #### 人脸识别模块 初始化工作完成后,即可进行正式的人脸识别。人脸识别的大体流程如图所示。 首先,获取视频当前帧的图像结果;接着,对图像进行人脸探测,获取所有探测出 的人脸信息,将这些人脸信息和数据库已有的人脸进行对比,计算相似度,得到相 似度最高的人脸编号,若相似度高于阈值则认为成功实现人脸识别。最后,如果上 一阶段识别成功,则将在图像上勾画出识别出来的人脸框,并将识别结果通过网络 传输给管理客户端。 ![alt 人脸识别](images/4567.jpg) #### 主机管理客户端 管理客户端界面如图所示。主体部分为学生列表,有学生名字、签到情况及人脸识别 准确率。未签到的学生不会显示签到情况和识别准确率吧。底部为统计信息及一些 按钮,左边显示总签到人数和系统中注册的总人数,右边按钮的功能分别为重新建 立网络连接、显示关于界面以及重置签到情况。 ![alt 管理客户端](images/5678.jpg) 客户端有网络接收模块,负责接收人脸识别系统发送过来的标签和准确率信息,并传递给前端界面,让它显示这些信息。它与前端界面以多线程的方式,并行工作的。 下面用活动图来描述管理客户端的运行逻辑。 ![alt UML](images/6789.jpg) ### 系统实现 #### 人脸识别 ##### 硬件交互 对于一个对应的图像信息,是通过sensor得到当前的图像信息,通过VI的系统传 输给VPSS系统进行处理。通过一直得到当前帧的信息,在这一帧下进行探测,如果 探测到结果,先对于VPSS缓存池当中的图像进行修改并通过VO系统通过HDMI输出到输出源进行图像展示。下图为数据流示意。 ![alt 数据流](images/dataflow.jpg) ##### 算法实现 对于算法本来来说,先需要读取模型的结果,进行建立。模型采用的是seetaface2 开源的训练好的模型结果。算法模型总共有三个部分,分别是FaceDetector、FaceLandmarker和FaceDatabase。它们的功能如图所示。 ![alt 数据流](images/algorithm.jpg) 对于需要保存的人脸信息,首先通过FaceDetector来进行人脸的探测,如果探测成功则继续用FaceLandmarker进行脸部特征的提取,并且与当前的FaceDatabase当中的数据进行对比,如果最高的相似度较低,则认为是一张的新人脸信息保存到 FaceDatabase,否则认为该人脸已经保存到了数据库当中。这一系列的流程当中会出现失败的情况,如果再多次尝试过后一直无法成功录入人脸则认为是这张照片当中未有人脸或者该人脸已经录入了,认为该人脸注册失败,否则认为人脸注册成功并由map计入该人脸在数据库当中的标号和其对应的姓名。 对于探测人脸的过程,首先将通过VPSS得到的当前帧图像通过FaceDetector来进行人脸的探测,可以获得到当前帧图像下所有的人脸的定位位置以及其图像的矩形的长宽。然后把所有的人脸分别通过FaceLandmarker得到对应的人脸特征,与 FaceDatabase当中的数据进行对比,得到相似度最高的标号以及相似度,如果相似在阈值以下,则认为是未判定到注册的人脸,否则认为标记成功,通过socket发生对应的标号以及相似度,同时根据定位位置以及其图像的矩形的长宽,在VPSS的图像当中进行跟新,画所人脸探测的图像框,并将对应的结果输出。 #### 管理客户端界面 界面采用pyqt5设计,它的好处是跨平台,为将来移植到别的平台做好准备。目前,该客户端是在Linux下运行。共设计了三个界面,第一个界面是网络初始化,第二个界面是主界面,第三个是关于信息。 #### 网络通信 网络通信采用socket接口,基于C/S模型。人脸识别系统为服务器,负责发送消息;管理客户端为客户端,负责接收消息。如图为通信过程。服务器端在系统初始化模块中先将socket初始化。在后面,每当检测到人脸,就开始接收连接请求,连接成功后发送标签和准确率。服务器端发送代码另建一个线程,和主线程并行运行。客户端新建socket并和服务器连接,每当连接成功后,就接收服务器发送的信息,传送消息给前端,并关闭当前socket,再重新建立socket监听连接。网络通信的流程如图所示。 ![alt 数据流](images/network.jpg) ## 环境配置 至少需要一台Linux端主机。Linux主机上应装有针对该平台的专用编译器和SDK代码,用于编译程序;还应有NFS,除了传输文件外,在调试时可以直接在板上运行主机上的编译环境,待一切调试完毕,再将编译好的可执行文件放到板子上即可。 ## 文件说明 seeta_face2_detect_demo-210415目录是人脸识别系统的工程,client文件夹为主机客户端程序,images为README.md中用到的图片,demo为系统的系统展示。 ## 未来展望 本项目还有许多可以改进的空间,包括我们项目中做得不甚令人满意的地方, 以及因时间有限没有实现的功能,下面列举如下。 1. 没有充分利用海思开发板的硬件优势,硬件加速的部分未能如期完成, 还需对封装好的神经网络部分代码进行更深一步的研究,了解软硬件接口。 2. 在人脸识别的准确率上,虽然已经取得较为不错的结果,但是若要投入 实际应用,还需进一步提高识别的准确率。 3. 在Windows平台下运行管理客户端为死机,没有尝试移植到Mac平台,可以对两个平台进行适配,挖掘pyqt5的跨平台潜能。