智能体开发技术(Python+FastAPI版) 课件 第六章 智能考勤_第1页
智能体开发技术(Python+FastAPI版) 课件 第六章 智能考勤_第2页
智能体开发技术(Python+FastAPI版) 课件 第六章 智能考勤_第3页
智能体开发技术(Python+FastAPI版) 课件 第六章 智能考勤_第4页
智能体开发技术(Python+FastAPI版) 课件 第六章 智能考勤_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

智能考勤content目录01需求与设计分析02OpenCV版本实现03Web端版本实现04活体检测防作弊需求与设计分析01核心功能列表基于人脸识别和活体检测的智能考勤系统,其核心功能是准确的人脸识别和基于防作弊机制的活体检测功能,并提供相应的界面用于考勤数据的查询、导出等。为了让用户能够及时得知是否打卡成功,建议添加语音播放功能,并同步显示当天的最新的考勤数据。另外,可以将智能考勤系统整合到企业内部的办公自动化或人力资源系统中,这部分内容不在本书讨论范畴,但是在设计时可以考虑相应的拓展性。图6-1展示了智能考勤系统纯Web端通过WebSocket实现的界面截图。整体实现思路(1)人脸数据采集:前端界面可以通过JavaScript调用MediaRecorderAPI来实现摄像头调用,并利用canvas元素进行实时截图;也可以基于Python的OpenCV库来调用摄像头实时获取人脸数据。两者思路完全一致,只是实现方法有所差异,本章后续内容会对此进行详细讲解。(2)人脸识别:核心在于检测摄像头中是否存在人脸,并提取出人脸轮廓数据。face_recognition库提供的face_locations()函数可以直接读取并返回人脸在整段视频中的位置信息。如果有多张人脸,则返回多条人脸位置信息。(3)人脸位置标注:为了给用户提供实时的可视化反馈,最好是在识别到人脸时实时在摄像头视频画面中绘制位置框。在Python中,可以使用OpenCV库直接进行绘制,在JavaScript中,可以使用“DIV+固定定位”的方案进行绘制。整体实现思路(4)人脸对比:考勤系统一般会先录入人脸数据,将其保存为图像,并将每一张人脸照片识别为一组编码,此编码在face_recognition库中是一组128维的特征编码向量。人脸对比时,主要对比录入的人脸的特征和识别的人脸的特征,如果相似度较高,则认为两张人脸属于同一个人。(5)数据管理:需要使用数据库对人脸特征向量和考勤数据进行保存,所以使用SQLModel来操作数据库。可以使用3张表来保存数据:第一张表用于保存人员基本信息,如姓名、部门等;第二张表用于保存首次录入的人脸数据;第三张表用于保存每一次的考勤记录。(6)活体检测:为了防止考勤时使用事先拍摄好的照片进行作弊,通常需要进行活体检测。活体检测的方案有很多,本章智能考勤系统的实现思路是基于face_recognition库所识别的脸部的68个关键特征点的坐标值来进行眨眼、张嘴、点头、摇头等动作的实时计算,以检测是否为活体。face_recognition的用法要使用face_recognition,需要先安装环境,主要安装OpenCV、Dlib和face_recognition这3个库,运行“pipinstallopencv-pythondlibface_recognition”命令即可完成安装。其中,OpenCV库主要用于采集摄像头数据、进行图案绘制、实时绘制人脸框等,也包括处理来自前端的视频数据的转码等;Dlib是face_recognition的依赖包。主要函数和功能(1)load_image_file(filename):加载图像文件,并返回表示该图像的NumPy数组。该函数用于从磁盘加载图像数据,以便后续进行人脸识别或分析。(2)face_locations(image,model="hog"):在图像中检测人脸,并返回一个列表,其中每个元素表示检测到的人脸的位置。位置以(top,right,bottom,left)四元组形式表示,分别代表人脸框的上、右、下、左边界。可以选择使用hog或cnn模型来进行检测,默认使用hog。face_recognition的用法(3)face_landmarks(image):在图像中检测人脸并标记68个关键特征点,返回一个字典类型的数据,其中包含每个检测到的人脸的关键特征点坐标。关键特征点包括眼睛、眉毛、鼻子、嘴巴、下巴等。该函数的返回值主要用于活体检测。(4)face_encoding(image,location=None,num_jitters=1,model="small"):返回图像的128维特征编码向量。其中,location是人脸的位置,是可选项,若不指定,则编码整张人脸;num_jitters表示抽样次数,值越大表示计算速度越慢,但是可以提升准确率;model表示使用哪种模型,默认值为small,其计算量小,只针对脸部的5个关键特征点进行编码。(5)compare_faces(known_face_encodings,face_encoding_to_check,tolerance=0.6):将一个人脸编码与一组已知人脸编码进行比较,查看其中是否有相似人脸,并返回一个布尔值数组,表示待比较人脸与已知人脸的匹配结果,当两组编码的差距小于阈值时,认为其是一个人并返回true,否则返回false。可选参数tolerance用于指定容错度阈值,取值为0~1,默认值为0.6,该值越大,说明容错度越高。face_recognition的用法下述代码展示了如何使用face_recognition模型识别人脸并在图像上标注出位置。OpenCV版本实现02利用OpenCV采集摄像头数据代码演示了如何使用OpenCV实时采集摄像头数据,并借助face_recognition判断是否存在人脸,如果存在,则将人脸通过矩形框标注出来。人脸数据存储与对比代码展示了如何进行人脸对比,并找到正确的人脸进行姓名和位置标注。人脸数据存储与对比上述代码中有以下两点需要注意。首先,由于Mr-Zhang.png这张图像是由AI生成的,编者使用提示词让AI生成了一张佩戴眼镜的人的图像,以体现真实的人脸识别时面部有所变化的情况,如图6-4所示。但是在实际生产环境中,智能考勤系统中存储的均是真实的人脸数据,个体差异通常比较大,不会存在此类长得特别像的情况,所以在实际环境中,调用compare_face()函数时,需要调整tolerance参数以达到识别相对准确的目的。人脸数据存储与对比其次,OpenCV中利用putText()函数绘制文字标注时,无法绘制中文标注,因为该函数只支持绘制ASCII字符。如果需要绘制中文标注,则需要安装PIL(即Python图像库),安装命令为pipinstallPillow,并由该库生成中文字符。以下代码演示了PIL库的基础功能,后续章节中使用到其他功能时再进行补充。设计智能考勤系统数据表其核心功能主要涉及3张表。第一张表为用户信息表,用于保存用户的基本信息;第二张表为人脸编码表,用于保存预存储的人脸编码信息;第三张表为考勤记录表,用于记录每次考勤的数据。实现新增人脸数据功能新增人脸数据功能通过Web界面实现交互,利用FastAPI提供后台数据操作。前端界面可以使用两种方案来完成新增:第一种方案是直接上传人脸图像并编码保存;第二种方案是打开摄像头读取人脸数据并截图,上传截图并编码保存。后端代码实现若要新增人脸数据,则需要提供后台接口来获取前端人脸图像,且前端提交的图像与对应的人员图像是正确关联的,进而利用face_recognition进行人脸编码和保存。因此后端代码需要实现以下功能。(1)提供/user接口,用于查询人员信息,并渲染给前端模板界面。前端在提交人脸图像时,同时提交userid的信息,后台可以正确保存对应人员的人脸编码。(2)提供/face/add接口,用于获取前端提交的userid和人脸图像,编码后将其保存到数据表中。(3)创建SQLModel数据映射关系,用于关联对应的3张表,以在接口代码中实现数据的查询或新增等操作。实现新增人脸数据功能首先,实现数据表的映射关系,代码如下。实现新增人脸数据功能其次,编写/user接口代码,该接口用于渲染前端模板界面,列出所有人员信息。同时,该接口实现了Users和Faces两张表的连接查询,用于确认哪些人员还没有上传人脸数据。此处使用LeftJoin(左外连接),将Users作为左表,Faces作为右表。左表Users会显示所有数据,而右表中如果未匹配到userid,则显示为空,说明未上传人脸数据。这样即可在前端界面中清楚地知道哪些人员需要上传人脸图像,哪些人员不需要上传人脸图像。具体实现代码如下。实现新增人脸数据功能上述/user接口只是将人员信息渲染出来,未实现人脸编码信息的存储,所以需要使用/face/add接口将人脸编码信息保存到数据表中,同时,如果前端提交的图像未包含有效的人脸信息,则需要提示用户,具体代码如下。实现新增人脸数据功能前端代码实现前端模板界面需要填充所有用户信息,同时,为了将人脸图像与userid关联起来,以便后端将人脸编码关联到正确的userid上,需要对文件上传框进行特殊处理。此处的处理方案是为每一条人员信息生成一个隐藏的文件上传框,通过按钮来触发文件上传、浏览功能,并根据元素的相对层级定位来进行元素操作。实现新增人脸数据功能前端代码实现最后,完成前后端功能对接和调试。前端代码运行结果如图6-5所示。实现人脸考勤功能整体实现思路可以分为以下4个步骤。(1)从Faces表中查询所有人脸的编码信息,并将其从字符串类型转换为Python列表类型。(2)利用OpenCV打开摄像头,实时采集人脸数据,并根据采集到的人脸信息与已知的人脸编码列表进行对比。(3)如果人脸对比成功,则记录一条考勤信息到Checks表中,如果是当天的第一条考勤数据,则同时记录到checkdate列和checkstart列,否则记录到checkend列。(4)如果人脸对比成功,则通过语音进行提示,告知用户打卡成功,无须继续采集人脸数据。同时,代码需要进行限制,如10分钟内不允许进行第2次打卡。该限制方案可以通过查询数据库来实现。实现人脸考勤功能以下代码演示了如何进行考勤并记录考勤数据,文件名为pycheckin.py实现Web端考勤数据查询功能实现两个接口,一个接口为/check/month,用于渲染默认的当月考勤记录数据;另一个接口为/check/query,用于在前端通过设置查询条件(如姓名、部门、性别或日期)来实现对考勤记录的查询。以下代码用于实现后端的查询。实现Web端考勤数据查询功能前端界面的布局和代码如下。实现Web端考勤数据查询功能前端界面的布局和代码如下。Web端版本实现03前端采集摄像头数据摄像头视频的实时渲染可以使用HTML的video元素来完成,但是video元素并不能直接实现截图。要实现视频截图,还需要使用canvas元素。canvas元素是HTML中绘制复杂图像的元素,其核心是绘图功能。一些HTML游戏也可以使用canvas实现。具体实现方案是当单击“截图”按钮时,动态生成一个canvas元素,先将视频帧渲染到canvas中,再将canvas数据转换为图像数据。下述代码演示了其具体实现。前端采集摄像头数据以下代码用于列出所有摄像头设备的deviceId,在请求权限时指定该设备即可。基于WebSocket进行实时检测首先,开发Python端的WebSocket服务器,用于接收前端实时传输过来的视频截图,并进行人脸检测,检测到人脸后将人脸位置回传给前端,代码如下。基于WebSocket进行实时检测其次,开发前端界面用于实时截取摄像头图像,并传输给WebSocket服务器,WebSocket服务器将识别到的人脸位置回传给前端,前端再动态增加1个或多个DIV(由人脸的数量决定),并根据摄像头video元素相对于当前界面的位置(offsetWidth或offsetHeight)配合后端回传的人脸位置进行运算,将DIV绘制在对应的人脸位置上,该DIV必须使用固定定位才能准确地定位人脸位置。同时,为了体现人脸识别的实时性,前端代码将不再使用“截图”按钮手动操作,而是使用setInterval()函数进行定时任务调用,这样用户可以体验到更好的实时性效果。具体代码如下。基于WebSocket进行实时检测基于前端界面进行考勤首先,优化WebSocket端代码,加入考勤功能,代码如下。基于前端界面进行考勤其次,修改前端代码,对单张人脸的位置信息进行检测,并对打卡成功或重复打卡的响应内容进行检测,同时语音播放考勤结果。打卡成功并显示考勤记录为了更加直观地让用户看到考勤数据,可以在视频下方添加一个表格,将当天的考勤数据实时添加到表格中,并使数据倒序排列,让最后一条考勤记录显示在最上方。活体检测防作弊04人脸68个关键特征点通过神经网络模型识别人脸的68个关键特征点,进而计算距离或比例来得到结果。使用face_recognition库可以准确标注出这68个点位的像素坐标。人脸68个关键特征点face_recognition库的face_landmarks()函数可以识别并标记出人脸中对应的68个点的坐标,并返回一个“列表+字典”对象,其中包括不同部位的坐标数据。例如,以下数据就是一张人脸的68个关键特征点的坐标信息,其中每一个元组中的数据代表对应的(x,y)坐标。人脸68个关键特征点上面的数据一共包含9种类型的坐标信息,对应的特征部位及下标如下。人脸68个关键特征点基于特征点定位,以下代码绘制了人脸上眼睛和嘴巴的特征点位连接起来的线条。指令动作检测原理下面列举4个常用的动作检测算法。(1)眨眼。因为每只眼睛由6个坐标点构成,眨眼动作通常由两只眼睛同步完成,所以只需要计算眼睛的高度与宽度之间的比例便可以确定是睁眼还

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论