
简介人脸识别作为生物特征识别的一种主流技术通过提取人脸图像中的128维特征向量在欧氏空间中度量相似度从而实现身份确认。相比指纹与IC卡它无需物理介质有效规避代打卡与介质磨损问题。基于Python生态face_recognition库结合OpenCV提供了开箱即用的检测与特征提取能力配合SQLite本地存储可快速构建轻量级考勤系统。该方案适用于百人以内的小型办公室、实验室或培训机构具备成本低、部署简单、可追溯抓拍记录等优势。实际落地中需关注光线、角度、照片攻击及阈值调优等工程细节。本文围绕一套完整可运行的人脸识别考勤源码解析系统设计、核心代码、环境配置与踩坑经验为开发者提供从理论到实践的参考。 最近刚好把一个基于Python的人脸识别考勤系统完整跑通了一遍新版源码和说明文档都整理到了手里。这套系统本来是给公司行政部做考勤试点用的我接手之后发现网上虽然流传着各种版本的“人脸识别考勤源码”但真正能开箱就跑、跑完还能看懂核心逻辑的并不多。大多数要么依赖库版本老旧要么摄像头调用部分写得特别糊弄要么连数据库表结构都懒得给。这次的版本算比较完整从人脸录入、特征提取、实时识别到考勤记录落库、报表导出都齐全了所以我决定写一篇拆解笔记分享这套系统的实现思路和运行要点也顺便把我在配置环境、调试摄像头、处理误识别时踩过的坑都交代清楚。如果你是刚学Python不久、想找一个人脸识别项目练手的开发者或者是公司里负责考勤管理的行政/IT人员、想评估本地化人脸考勤方案的可行性这篇文章都能给你一个从理论到落地的完整参考。我会按照“系统功能设计—技术选型—核心代码—运行部署—避坑实测”的顺序来讲尽量把每一步的原理和取舍都讲明白而不是只丢给你一份代码压缩包。1. 传统打卡的痛点以及人脸识别为什么是更优解1.1 指纹、IC卡、纸质签到各自的问题先说一个很多人都经历过的事公司前台放着一台指纹打卡机每天早晚高峰排队不说手指脱皮、出汗、沾了油渍的人经常按三次五次都识别不了后面排队的同事一脸无奈。到了冬天还有同事因为手太干燥导致指纹纹理不清晰指纹机直接罢工。IC卡和工牌的问题更明显代打卡现象泛滥——一张卡可以随便递给同事考勤记录完全失真。纸质签到表就不用多说了替签、补签、漏签月底统计的时候HR基本靠猜。我从行政同事那里拿过一份真实的月考勤异常记录里面有差不多三成是“指纹无法识别”两成是“忘带卡”剩下的是各种说不清的异常。这些问题的根源在于指纹和IC卡的识别前提是“人和凭证绑定”但凭证可以被转移指纹本身又存在个体差异和易受环境干扰的问题。也就是说物理介质参与校验环节越多可作弊和出错的概率就越大。1.2 人脸识别解决了什么人脸识别考勤系统的逻辑完全不同它的校验对象是“人本身”而不是任何外部的卡片或指纹。只要员工的脸上传过一张清晰的照片并提取出特征之后每次站在摄像头前系统就会自动捕捉面部、提取特征、与库中的记录比对匹配成功后生成一条考勤记录。整个过程中员工不需要携带任何东西也不需要接触任何设备彻底绕开了“凭证转移”和“介质磨损”这两个传统方案中的老大难问题。另外一个容易被忽略的优势是可追溯性。每次考勤成功系统可以把抓拍到的现场人脸图保存下来。将来有争议的时候管理员可以直接调出当天的签到照片进行人工核对这是指纹和IC卡方案很难做到的。从管理者的角度来说人脸识别相当于把“验证身份”和“记录时间”两个动作合并成了一个自然行为员工只是正常地走到摄像头跟前数据就已经被记录下来了。1.3 这套源码适合谁、不适合谁我在评估这套系统的时候首先明确了一点它不是万能的。它最适合的是100人以内、网络环境简单的小型办公室、工作室、实验室、培训机构的日常考勤也很适合作为Python学习者和毕业设计者的二次开发底座因为代码结构清晰能看懂能改。但如果你的场景是几百人以上的工厂、人员流动率极高的场所、或者是安全性要求很高的区域那么这套基础版的本地人脸识别方案就不够用了。它没有活体检测硬件没有多人同时快速通过的通道闸机联动也没有云端集中管理这些场景需要升级到商业级的人脸门禁考勤一体机或者带有红外活体检测的专业方案。认清边界才能选对工具。2. 系统功能拆解从首次录入到月底报表2.1 一次完整的人脸考勤流程包含哪些环节这套系统从用户视角来看可以拆成四个环节员工注册、每日签到、考勤管理、报表导出。员工注册阶段管理员启动录入界面输入员工ID和姓名然后调用摄像头连续拍摄若干张人脸照片系统自动提取每张照片的人脸特征编码计算出一个平均特征向量存入数据库。每日签到阶段员工走到摄像头前系统从视频流中检测人脸位置把最大的人脸框截取出来提取128维特征向量与数据库中所有已注册员工的特征做距离计算如果最小距离低于设定阈值就算匹配成功否则提示“未识别”。考勤管理阶段管理员可以查询某天的所有签到记录也可以手动补录、标记异常。报表导出阶段系统按日期范围统计每个员工的签到时间、迟到情况、缺勤天数生成CSV或Excel文件。别看流程听起来简单数据库表设计和各模块的衔接才是决定程序好不好用的关键。2.2 数据模型设计思路我当时看源码时先翻的就是数据库脚本。这套系统默认用的是SQLite三张核心表设计得比较干净。人员表employees字段有id自增主键、emp_id工号唯一、name姓名、department部门、created_at创建时间。人脸特征表face_encodings字段有id、emp_id外键关联员工表、face_encodingBLOB类型存128维向量、image_path存照片路径、updated_at最后更新时间。考勤记录表attendance_records字段有id、emp_id、check_time签到时间、captured_image_path抓拍照片路径、status正常/迟到/异常、remark备注。这样设计的用意是人脸特征和员工基本信息分离方便以后一个人存多张不同状态的照片特征比如戴眼镜和不戴眼镜也方便在员工离职时只删除特征数据而保留历史考勤记录。face_encoding字段用BLOB存储的好处是直接把numpy数组序列化后写进去读取时再还原成数组简单粗暴但很有效。-- 关键建表语句参考 CREATE TABLE face_encodings ( id INTEGER PRIMARY KEY AUTOINCREMENT, emp_id TEXT NOT NULL UNIQUE, face_encoding BLOB NOT NULL, image_path TEXT, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );这里有个容易被忽略的点员工的工号emp_id一定要设计成唯一且不可变的业务主键不要用自增id来关联考勤记录。因为如果以后要对接企业微信、钉钉或者其他HR系统工号才是各方通用的身份标识。源码里如果把自增id当成关联字段二次开发时改起来非常痛苦。2.3 识别端和管理端怎么协作这套系统的部署形态是单机版识别端和管理端在同一个程序里通过不同界面切换。正常使用模式下程序启动后默认进入识别界面摄像头常开持续检测人脸。管理员输入密码后可以切换到管理界面进行员工注册、记录查看、参数配置等操作。这种单机模式的优点是部署成本极低一台带摄像头的Windows笔记本就能跑起来完全不需要服务器。缺点是数据只在本地如果有多台设备分别跑在不同办公室考勤数据是无法自动汇总的。我把这个局限写在这里是希望你在评估时要考虑清楚自己的场景如果只有一台设备、一个办公地点单机版完全够用如果要在总部和分部各放一台那就需要改成C/S架构把考勤数据上传到公用数据库这也算是源码后续比较大的一个改造方向。2.4 源码目录结构怎么读看源码别一上来就从main.py开始逐行读那样很容易被细节淹没。我建议按这个顺序来先看根目录下的requirements.txt了解项目依赖了哪些库基本就能判断出技术栈。再看core文件夹或face_utils.py这类文件名通常里面封装了人脸检测和特征提取的核心函数。然后看db文件夹或database.py理解数据库连接和表结构。最后才看ui界面代码因为界面的按钮事件最终都调用了核心函数先理解核心函数再看界面就非常快。这套源码的目录结构大致是utils工具函数比如图像处理、日志、core人脸识别核心模块、uiPyQt5界面、dataSQLite数据库文件和照片存储、main.py程序入口。值得一提的是好的源码结构会让你找东西非常容易。如果你打开一个源码包所有代码都堆在一个几百行的py文件里那后续维护起来会很麻烦这一点在选型的时候就该注意到。3. 关键技术选型为什么是face_recognition OpenCV SQLite3.1 人脸识别库对比不要什么都自己造轮子目前Python生态里做人脸识别主流的几条路线是OpenCV自带的Haar级联分类器、face_recognition库底层是dlib、以及各种深度学习框架TensorFlow、PyTorch里的预训练模型。Haar级联分类器最大的优点是快但它的检测能力太粗糙了只能告诉你人脸大概在哪个位置无法提取出足够稳定的人脸特征做身份识别所以它顶多当人脸检测器用没法支撑完整的考勤系统。深度学习方法准确率高但是工程复杂度也高需要准备数据集、训练模型、处理GPU环境对一个小型考勤项目来说明显重了。face_recognition是这几个方案里最适合这类项目的它对dlib做了完整封装用的人脸检测模型是HOG方向梯度直方图加CNN特征提取用的是预训练好的ResNet模型直接通过两三个函数就能拿到128维的人脸特征向量。你不需要理解深度网络的训练细节只要调用接口就行。3.2 为什么选face_recognition易用性和效果的最佳平衡我在多个本地人脸识别项目里用过face_recognition它最大的价值是“开箱即用”四个字。安装好之后注册人脸只需要两行代码读入图片、调用face_encodings函数提取特征。识别阶段只需要把实时帧里的人脸和库里所有特征算一遍欧氏距离。几十个人的考勤库在普通CPU上识别一次大概几十毫秒完全够用。另一个选择它的理由是文档和社区案例非常丰富。遇到报错只要把错误信息复制到搜索引擎里基本都能找到解决方案。对一个要交付给非专业同学使用或拿去比赛的源码项目来说这点很重要。相比之下直接用dlib原生的接口代码会多出一大截还要自己处理shape predictor和face descriptor的细节。3.3 OpenCV在这里的角色OpenCV在这个项目里承担三件事摄像头采集、图像预处理、人脸框绘制。摄像头采集是通过cv2.VideoCapture完成的它把摄像头视频流逐帧读进来图像预处理包括把每一帧从BGR颜色空间转为RGBface_recognition内部用的是RGB、缩小图像尺寸人脸框绘制是当识别成功后在画面中的人脸周围画一个矩形框并附上姓名和打卡状态。虽然face_recognition内部也依赖OpenCV但在项目里显式导入OpenCV就是为了清晰地把这些职责分开。实时视频流的处理逻辑要特别注意帧率控制。如果每一帧都执行完整的人脸检测和特征提取CPU会吃不消程序容易卡顿。这套源码里用了一个很实用的技巧不是每帧都做识别而是设置一个检测间隔比如每5帧执行一次完整识别其余帧只显示视频画面。这样既保证了实时性又降低了CPU占用。3.4 SQLite作为本地数据库的取舍数据库选型上这套系统用了SQLite而不是MySQL或PostgreSQL理由很直接单机部署、数据量小、不想引入额外服务。SQLite是一个文件型数据库整个数据库就是一个.db文件备份时直接复制文件就行不需要安装和管理数据库服务。这对行政人员来说非常友好他们不需要懂数据库只要知道双击程序、点按钮就行。当然SQLite也有它的限制写并发能力弱不适合高并发场景。不过在单机考勤场景下签到操作是串行的同一时间只有一个人站在摄像头前所以完全不存在并发问题。如果以后要改造成多设备联网版才需要考虑换成MySQL或PostgreSQL。3.5 GUI方案PyQt5还是Tkinter源码里界面部分用的是PyQt5不是Tkinter。PyQt5的优势在于界面美观度、控件丰富度和视频画面嵌入的方便程度。用Tkinter也能实现但要在窗口里实时显示摄像头视频流Tkinter的刷新和布局控制会麻烦很多。PyQt5里显示摄像头画面通常的做法是用一个QLabel组件作为视频画布通过QTimer定时从视频流读取帧把OpenCV的BGR帧转成RGB后转成QImage再setPixmap到QLabel上。这个模式是通用的理解了它你以后用PyQt5做任何视频相关的界面都能直接套用。4. 核心代码逻辑拆解人脸编码、比对阈值与防作弊4.1 人脸特征编码是怎么产生的人脸特征编码的核心函数是face_recognition.face_encodings。它接收一个RGB图像和一个人脸位置列表返回一个包含128个浮点数的向量。这个向量的几何含义是把一张人脸图像映射到高维特征空间里的一个点同一个人不同照片提取出的128维向量在空间中是聚集的不同人之间则是远离的。整个识别过程就变成了高维空间中的最近邻查找问题。这里“同一人不同照片”的聚集程度取决于很多因素比如光线、角度、表情。所以源码在注册阶段会连续拍摄多张照片然后对多个128维向量取平均值用平均向量作为标准特征。这样可以抹掉单张照片里的偶然偏差让注册特征更稳定。# 注册阶段核心逻辑参考 import face_recognition def register_face(image, known_face_locationsNone): rgb image[:, :, ::-1] # BGR转RGB face_locations face_recognition.face_locations(rgb, modelhog) if len(face_locations) ! 1: return None, 检测到人脸数量异常 face_encoding face_recognition.face_encodings(rgb, face_locations)[0] return face_encoding.tolist(), ok补充一个实际经验注册时要求员工摘掉口罩、正对摄像头、不要逆光。如果注册照片本身质量很差后面识别阶段的准确率一定会大受影响。这是整个系统里性价比最高的质量控制点把好这一关能少掉80%的识别问题。4.2 比对逻辑与阈值该设多少识别阶段的比对逻辑用face_recognition.face_distance函数。它计算当前捕获的人脸128维向量与数据库中所有已注册向量的欧氏距离距离越小代表越相似。然后按距离从小到大排序取最小值与阈值比较。阈值的选择是关键。face_recognition默认的容差是0.6但在考勤场景下我建议从0.45开始试。阈值设太高比如0.6以上会导致不同人误判为同一人设太低比如0.3又会把同一个人在不同光线下的照片拒之门外造成大量漏识别。实际调参时可以找五六个员工让每个人在正常办公光线下站在摄像头前记录系统计算出的最低距离值再取一个比这些值略大、但明显小于不同人距离的中间值作为阈值。这就是根据实际环境数据来确定阈值的过程。4.3 照片攻击与基础版活体检测这是整套系统里最容易被忽视的一环。基础版的face_recognition只能分析2D图像如果有人拿一张打印出来的高清照片、或者手机屏幕里放一张照片怼到摄像头前识别是会成功的。原因很简单照片也被转换成了一张图像照样能提取出128维特征。要防住这种攻击必须加活体检测。商用门禁机用的方案多是红外活体检测利用红外摄像头捕捉人脸的温度分布来区分真假。纯软件方案里有几种思路一是眨眼检测通过连续帧判断眼睛的开闭状态变化二是要求用户做随机动作比如张嘴、左右摇头系统通过面部关键点判断动作是否完成三是用近红外摄像头加软件分析。这套源码目前实现的是基础版没有硬件的活体检测。我在实测中用手机照片试过识别确实能通过。因此如果你要部署在真实办公场合一定要意识到这个安全缺陷。一个相对简单的缓解办法是安装时不把摄像头固定在一个容易被照片怼到的角度同时管理员定期抽查抓拍的照片进行回看。一个相对轻量级的软件活体检测实现思路是用face_recognition的face_landmarks方法提取左眼和右眼的关键点坐标计算眼睛的纵横比EAREye Aspect Ratio当EAR低于某个阈值时认为眼睛闭合。通过连续帧检测“睁眼-闭眼-睁眼”的过程就可以判定为活体。这个方法不需要额外依赖库在源码基础上二次开发也比较容易实现。4.4 多人同时出现在画面里的处理办公场景下经常会发生两个人同时经过摄像头前面的情况。如果每次都识别到多张人脸系统应该怎么处理这套源码的做法是用face_locations检测到所有人脸位置然后取面积最大的人脸框作为“主要识别对象”。这个设计逻辑是站在摄像头前进行打卡操作的人通常会在画面中占据最大区域其他只是路过的人离摄像头远人脸框面积小。这里有一个交互设计上的细节识别界面会把所有检测到的人脸框都显示出来但只有最大的人脸会被执行特征比对和考勤记录操作。这样既避免了误触发也让员工有直观的反馈——他们能看到自己是不是被框住了。如果识别成功后没有弹出姓名大概率是画面中有别的人脸干扰了最大框的判定。4.5 误识别和漏识别的调节策略实际部署中误识别把A识别成B和漏识别明明注册过却提示未知都不可避免。针对漏识别最简单有效的办法是在注册时为每个员工增加多张不同状态的照片特征正常不戴眼镜一张、戴眼镜一张、刘海状态一张全部存入face_encodings表。匹配时只要任何一个特征向量距离达标就算识别成功。针对误识别除了降低阈值还可以引入“多次确认”机制连续两帧或三帧都识别为同一员工才写入考勤记录。这样能过滤掉因为表情夸张、角度偏移导致的瞬间误判。这套源码里有类似思考在连续帧匹配逻辑上做了简单的计数但没把参数暴露到配置界面需要直接改源码里的velue。这一点我在后面避坑章节还会细说。5. 环境搭建与源码运行指南5.1 Python版本和依赖安装版本不匹配是第一个大坑先讲环境因为这是很多人在第一步就放弃的地方。face_recognition底层依赖dlib而dlib在Windows上的安装非常依赖Python版本。根据我的经验和社区反馈Python 3.7到3.9是兼容性最好的区间Python 3.10以上编译dlib时经常会报C编译错误。装依赖的推荐顺序是先装CMake和Visual Studio Build Tools用于编译Windows上的C扩展再装dlib最后装face_recognition、opencv-python、PyQt5。如果你是在Windows上做部署直接按这个命令来pip install cmake pip install dlib pip install face_recognition pip install opencv-python pip install PyQt5有个取巧的方法如果你的Python版本是3.9以下可以直接去pypi.org搜索dlib的预编译wheel包下载安装省去本机编译的等待时间。但要注意预编译wheel也可能因为pip版本问题安装失败遇到这种情况就先升级pip再装。5.2 Windows下配置失败的典型报错dlib安装失败是这套系统在Windows上最常见的报错。典型错误是屏幕上出现一大堆红色报错提示“CMake must be installed to build the following extensions: dlib”。这时候如果你直接安装CMake之后再重试又可能遇到“using Visual Studio 14 2015”之类的编译错误。核心原因是本机缺少完整的C构建工具链。一个更稳妥的解决方案是打开Visual Studio Installer安装“使用C的桌面开发”工作负载或者单独安装Build Tools。装好之后重启终端再执行pip install dlib编译成功率会高很多。如果编译期间出现内存不足的报错可以考虑关掉其他大型软件为编译器腾出内存空间。我实测下来Windows 10 Python 3.8 dlib 19.22.0 face_recognition 1.3.0是一套经过验证的稳定组合。新版本不一定更好稳定才是王道。5.3 摄像头初始化和索引选择程序运行起来后发现画面黑屏这是另一个高频问题。OpenCV的VideoCapture初始化需要指定摄像头索引。笔记本自带摄像头通常是0外接USB摄像头可能是0也可能是1。如果cv2.VideoCapture(0)打不开可以试试cv2.VideoCapture(1)。还有一个常被忽略的坑如果程序曾经打开过摄像头但异常退出摄像头资源没有释放下一次运行就可能会出现打不开的情况。解决方法是先重启Python进程或者用任务管理器杀掉残留的python进程。源码里如果规范地在finally块中调用了video_capture.release()就能避免这个问题但很多早期源码都没有这个意识需要自己注意。# 摄像头打开与释放的标准写法 import cv2 cap cv2.VideoCapture(0) if not cap.isOpened(): print(无法打开摄像头尝试索引1...) cap cv2.VideoCapture(1) # 主循环逻辑... # 程序结束时务必释放 cap.release() cv2.destroyAllWindows()5.4 第一次完整运行从录入到打卡环境配好后我建议按这个流程做一次冒烟测试。第一步运行main.py启动程序确认摄像头画面实时显示。第二步切到管理界面录入一个测试员工建议用你自己的脸拍三张不同角度的正面照片确保特征提取成功。第三步切回识别界面让测试员工走到摄像头前观察是否能正确识别并输出姓名。第四步查询考勤记录确认刚生成了一条签到记录并有一张抓拍照片被保存下来。第五步在管理界面导出当天考勤报表确认CSV文件正常生成。这个流程走完这套系统就能投入试运行了。如果卡在中间某一步基本就是环境或权限的问题优先检查摄像头权限和依赖库是否装全。6. 实测中容易踩的坑光线、角度、照片攻击与性能优化6.1 光线的坑识别率暴跌的主要原因在所有影响识别率的因素里光线变化是最大的变量。我做过一个简单的对照实验同一个员工在光线充足的办公室环境识别成功把办公室窗帘拉上、只剩显示器微光的时候识别距离立刻变大好几次提示未识别。原因是face_recognition训练用的数据集中人脸大多是亮度均匀的自然光场景过暗或过强的光都会让特征提取效果变差。针对这个问题的解决方法是安装补光。不需要专业的摄影灯一盏普通的LED台灯摆放在摄像头旁边、与员工面部形成45度角的方向就能显著提升识别率。另外尽量避免让员工面向窗户站立逆光场景是整个系统最头疼的情况。如果摄像头位置是可以调整的尽量让光源位于员工身后侧而不是正前方。6.2 角度的坑为什么要求正脸面对face_recognition对正面人脸的识别效果最好侧脸、低头、抬头都会让特征偏移。实测中员工低着头用手机、边走路边打卡识别率都会明显下降。系统中的haarcascade_frontalface_default或者HOG模型对侧脸的检测能力有限人脸框的定位精度也会下降。实际部署时最好的办法是在地面上贴一个“脚丫”贴纸提示员工站在摄像头正前方0.5到1米处的固定位置。人脸在画面中的大小也需要控制太远人脸太小特征信息不足太近人脸超出画面边界框不完整。0.5到1米是一个比较理想的距离。6.3 照片攻击的实测结论我专门做过一个测试把自己的照片打印出来打印规格是A6大小然后举到摄像头前。结果系统成功识别了并记录了一条考勤。这个测试印证了我在前面说的安全缺陷基础版软件人脸识别无法区分真实人脸和照片。如果你负责落地这套系统一定要把这个风险告知管理层。我个人的建议是如果办公环境允许可以把摄像头安装在门禁闸机或门框上方由保安或前台人工监督让照片攻击的实施难度大大增加。另外系统保存的抓拍照片也是一个事后追查的手段发现异常考勤记录后可以人工查看抓拍照片来确认当时的情况。6.4 识别速度优化CPU也能跑但有技巧在普通CPU上face_recognition每帧做完整识别大约耗时80到150毫秒看起来不慢但如果每帧都做CPU占用会很高视频画面也会卡顿。优化手段主要有三个方向第一个是缩小检测图像。把传入face_recognition的图像从1920x1080缩小到640x480甚至更小检测速度会显著提升。因为人脸检测的耗时与图像像素数量大致成正比只要人脸在缩小后的图像里依然足够大识别效果不会明显下降。第二个是降低识别频率。前面提到过每5帧或每0.3秒做一次识别就够了中间的空档只做视频显示。第三种是有GPU的情况face_recognition支持CUDA加速但需要自己编译dlib的GPU版本配置成本较高对几十人规模的考勤系统来说CPU优化已经够用。6.5 考勤数据备份和异常处理SQLite数据库虽然稳定但也怕文件损坏和误删。我建议每天下班后定时把data目录下的.db文件复制到备份文件夹里条件允许的话再同步到网盘或NAS。Windows命令行可以用简单的copy命令或者写一个批处理脚本完成不需要额外软件。另外一个容易被忽视的点是数据库写权限。如果程序安装在系统盘通常是C盘的Program Files目录下Windows的UAC权限控制可能会阻止程序写入数据库文件导致考勤记录保存失败。最稳妥的做法是把整个项目放在非系统盘或者当前用户可写的目录下比如D:\attendance_system。6.6 人脸注册时的质量控制最后再强调一次注册阶段的质量控制。我在试运行中遇到过一个典型的失败案例某位同事注册时坐在工位上屏幕亮光映在脸上脸上还有明显阴影后来换到光线均匀的过道重新注册后识别率立刻提高了。注册照片的标准化比后期调阈值的效果明显得多。注册时应该注意以下几点面部不能有遮挡口罩、墨镜、帽子额头不要被刘海大面积遮盖光线均匀避免半边脸亮半边脸暗表情自然不要夸张大笑或紧闭双眼拍摄距离与日常打卡时大致相同如果员工平时戴眼镜建议分别注册戴眼镜和不戴眼镜两组特征或者注册时保持日常最常见的状态。我个人的体会是这类人脸识别考勤系统真正决定成败的往往不在算法层而在部署现场的工程细节光线够不够、员工有没有站在正确位置、注册照片规不规范、数据库有没有定时备份。算法本身已经被face_recognition封装得足够好不需要你去调模型、训参数但如果没有这些工程细节的支撑再好的模型在真实办公场景里也发挥不出来。这套源码的价值在于它把从图像采集、特征提取到考勤记录、报表导出的完整链路打通了你拿着它可以直接跑通一套单机人脸考勤方案。如果你想在它的基础上做二次开发我建议优先考虑三个方向接入真实活体检测来堵住照片攻击的漏洞把单机SQLite改成MySQL以实现多设备数据汇总再加一个简单的网页或微信端查询入口让员工能自己查考勤记录。这几个方向做下来这套系统的实用性会提升一个台阶。本文还有配套的精品资源点击获取