基于Python的人脸识别系统毕设源码详解:从环境搭建到算法调优
简介面向本科毕业设计及课程设计场景的人脸识别系统项目基于Python实现提供完整可运行的源码、毕业论文文档及配套说明。代码内含详细注释结构清晰新手也能快速理解关键逻辑作者自述为98分高分项目获得导师认可适合毕业设计、期末大作业等答辩展示或二次开发。压缩包共2000个文件以1956个Python源码文件为主辅以PDF论文、TXT说明、CSS/JS/HTML前端页面以及MD文档、Shell脚本等覆盖算法实现、模型训练、界面展示与项目部署多个层面。整体大小约82.24MB便于下载和本地配置。目前已有182人学习查看具备一定参考价值。解压后按说明配置依赖即可运行可作为人脸识别课程设计的完整范本也能帮助初学者掌握人脸检测、特征提取、比对识别等核心流程并借助源码注释快速定位关键函数与实现思路。1. 基于Python的人脸识别系统一份能直接部署进答辩现场的毕设源码如果你正在为毕业设计或课程设计找一个人脸识别项目大概率已经在海量资料里翻得头晕了——要么是只讲原理没有代码的PPT型教程要么是GitHub上祖传十年、注释全靠猜的老仓库。这份基于Python的人脸识别系统本科论文毕业设计源码我拆完后的评价是结构干净、注释到位、部署链路短适合我这种需要快速跑通全流程、再把精力花在论文和答辩上的人。它解决了三个实际问题人脸数据怎么采集、模型怎么训练、识别结果怎么稳定输出。适合做毕设选题的本科生也适合想抄一份完整作业的程序员。从解压到看到摄像头框住自己的脸整个过程大概只需要半小时。2. 把代码跑起来环境部署与项目结构梳理2.1 环境准备Python版本、OpenCV与face_recognition的搭配拿到源码后的第一件事不是读代码而是把环境搭好。这个项目的核心依赖集中在OpenCV上人脸检测用的Haar级联分类器人脸识别用的是LBPH算法两者都在OpenCV的contrib模块里。常见的坑是只装了opencv-python没有装opencv-contrib-python导致cv2.face这个命名空间根本不存在一import就报ModuleNotFoundError。我习惯用conda建一个独立的虚拟环境避免把系统Python搞乱。下面的依赖清单是我在Windows 11和Ubuntu 22.04上都验证过的组合依赖包推荐版本作用python3.8 ~ 3.10项目运行时环境opencv-python4.5.x 或 4.8.x图像处理、摄像头调用opencv-contrib-python与opencv-python同版本提供cv2.face模块LBPH算法numpy1.21以上图像数组运算pillow9.x图像文件读写辅助提示opencv-python和opencv-contrib-python必须装成同一个版本否则模型训练阶段会出现facerecognizer属性找不到的诡异报错。如果你是用PyCharm打开项目我建议直接在PyCharm的Terminal里执行以下命令来创建环境conda create -n face_rec python3.9 -y conda activate face_rec pip install opencv-python4.8.1.78 opencv-contrib-python4.8.1.78 numpy pillow参数说明python3.9这个版本选得比较保守因为3.10以上在某些旧版OpenCV里会有兼容性警告opencv-contrib-python是FaceRecognizer所在的位置只装opencv-python的话LBPH训练接口用不了。装完可以用一行命令验证环境是否正常python -c import cv2; print(cv2.__version__); print(cv2.face.LBPHFaceRecognizer_create)这个命令不打印报错就说明环境没问题。我第一次搭的时候犯过一个低级错误——在conda环境里装好了依赖PyCharm的解释器却还指向系统自带的Python结果运行一直报module cv2 has no attribute face浪费了半小时。后来学乖了创建项目时直接指定conda环境的解释器路径问题一次性解决。2.2 项目结构从入口文件到数据目录的分工这份源码的整体结构挺典型的解压后你能看到这几个关键文件文件/目录作用main.py主程序入口跑起来会调用摄像头进行实时识别train.py训练脚本读取dataset目录里的人脸图像生成识别模型dataset/存放采集到的人脸样本按人名分文件夹trainer/存放训练好的模型文件通常是trainer.ymlhaarcascade_frontalface_default.xmlOpenCV自带的Haar人脸检测模型运行顺序是先运行采集脚本把人脸样本存进dataset再运行train.py生成模型最后运行main.py做实时识别。绝大多数这套项目的源码包都是这个逻辑拿到手先看main.py的入口和train.py的路径配置比从第一行读代码高效得多。第一次跑主程序前建议确认一下haarcascade_frontalface_default.xml的路径。OpenCV安装包自带这个文件但路径经常会因为环境不同而变。我一般会在train.py和main.py里用一段兼容代码动态定位它而不是写死绝对路径import cv2 import os # 优先使用项目根目录的xml文件找不到则从opencv安装目录查找 cascade_path haarcascade_frontalface_default.xml if not os.path.exists(cascade_path): cascade_path os.path.join(cv2.data.haarcascades, haarcascade_frontalface_default.xml) face_detector cv2.CascadeClassifier(cascade_path)这段代码的逻辑是先看当前目录有没有复制好的xml没有就从cv2.data.haarcascades这个OpenCV内置路径里找。在Linux上尤其重要因为opencv的data目录和代码目录经常不在一起写死相对路径基本必翻车。2.3 第一次运行采集人脸到生成模型的完整流程跑人脸识别项目的第一个目标不是识别准确率而是跑通链路。先把采集脚本独立出来单独建一个capture_face.py这个脚本的作用是调用摄像头把检测到的人脸裁剪保存到dataset目录下import cv2 import os # 数据集根目录和当前用户目录 dataset_dir dataset person_name input(请输入姓名) person_dir os.path.join(dataset_dir, person_name) os.makedirs(person_dir, exist_okTrue) # 初始化摄像头和Haar检测器 cap cv2.VideoCapture(0) face_detector cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml) count 0 while True: ret, frame cap.read() if not ret: break gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces face_detector.detectMultiScale(gray, scaleFactor1.2, minNeighbors5, minSize(100, 100)) for (x, y, w, h) in faces: count 1 face_img gray[y:yh, x:xw] face_img cv2.resize(face_img, (200, 200)) cv2.imwrite(f{person_dir}/{count}.jpg, face_img) cv2.rectangle(frame, (x, y), (xw, yh), (0, 255, 0), 2) cv2.imshow(capture, frame) if cv2.waitKey(1) 0xFF ord(q) or count 50: break cap.release() cv2.destroyAllWindows() print(f采集完成共保存{count}张图片到{person_dir})逻辑说明detectMultiScale返回所有检测到的人脸位置信息这里把灰度图的人脸区域直接裁剪出来resize成200x200的统一尺寸然后保存。为什么要统一尺寸因为LBPH算法在训练阶段会把所有图片转换到同一个特征维度空间图片尺寸不一致会直接导致训练报错或识别率暴跌。参数说明scaleFactor1.2表示每次缩放比例为1.2数值越小检测越精细但速度越慢minNeighbors5表示每个候选区域至少被5个邻近窗口确认才算人脸这个值太小容易把背景当人脸太大又可能漏检minSize(100, 100)过滤掉太小的检测窗口避免采集到一堆远处的模糊人脸。每张样本保存前我都会快速翻阅一下把闭眼、转头、模糊的图片删掉。经验数据是单人脸采集50张其中30张是正脸静止20张是左右旋转和仰头训练出来的模型在答辩演示时最能抗住评委的随机测试。3. 人脸识别算法选型为什么毕设项目都偏爱LBPH3.1 三种经典算法的对比Eigenfaces、Fisherfaces与LBPH人脸识别这块学术界和工业界的方案很多但毕设级别的源码里最常见的就是三种Eigenfaces特征脸、Fisherfaces线性判别分析和LBPH局部二值模式直方图。这套源码选择的是LBPH我的理解是它在准确率、计算量、调参难度三个维度上取得了最好的平衡。先看一个对比表格把三种算法的本质讲清楚算法核心原理优点缺点Eigenfaces用PCA降维把人脸投影到特征空间原理简单论文好写对光照敏感同一人不同光线识别率明显下降Fisherfaces用LDA降维最大化类间距离、最小化类内距离比Eigenfaces更抗光照变化需要足够的样本量每人少于10张容易过拟合LBPH提取局部纹理特征生成直方图比对相似度对光照、表情变化不敏感训练快对图像噪声敏感需要人脸对齐LBPH的核心思想是把每个像素和它周围一圈像素做比较大于中心点记1、小于记0形成一个二进制序列这个序列转成十进制就是该点的LBP值。整张图像的LBP值统计成直方图再进行归一化处理得到的特征向量就是这张人脸的指纹。训练过程就是给每个已知身份的人保存一组特征向量识别时计算当前人脸特征向量与所有已知向量的距离距离最小的那个标签就是识别结果。这也是为什么LBPH对光照不敏感——因为它比较的是局部像素的相对关系而不是像素绝对值。答辩时如果老师问“为什么不用深度学习”你可以回答LBPH在单人脸小样本场景下训练时间短CPU即可实时运行且可解释性更强适合本科毕设的场景深度。这个说法是能站住脚的。3.2 Haar级联检测器先找到脸再谈认脸人脸识别分为两个阶段检测脸在哪里和识别这是谁。大部分毕设源码用的是Haar级联分类器做第一阶段检测这是OpenCV里最经典的目标检测方法基于Viola-Jones算法用一个训练好的级联分类器在图像上滑动窗口逐级判断窗口内容是否是人脸。这个模块的核心就一个函数detectMultiScale。别看只有一行调用里面的参数直接决定了你后面识别的成功率。先把参数含义理清楚参数推荐值含义与调节倾向scaleFactor1.1 ~ 1.3每次图像缩放比例。越小检测越慢但召回率越高1.3以上容易漏检小尺寸人脸minNeighbors3 ~ 6候选矩形最少被确认的次数。越大误检越少但可能漏掉侧脸minSize(80, 80) ~ (120, 120)最小人脸尺寸小于该尺寸的区域直接忽略maxSize不设或(300, 300)最大人脸尺寸过滤掉异常大的检测框我在这套项目里惯用的组合是scaleFactor1.2, minNeighbors5, minSize(100, 100)。这个组合在摄像头场景下比较稳识别距离1米左右人脸区域大约占画面的1/6到1/4minSize设置成100x100既不会漏掉正常距离的人脸也能过滤掉背景里乱入的玩偶脸。注意minNeighbors这个参数有个容易踩的误区。它不是越大越好设到8以上时稍微偏一点的角度人脸就直接检测不到采集阶段存下来的全是废图。建议先用默认值5跑一遍如果画面里出现大量误检框再逐步往上调。3.3 LBPH训练参数radius、neighbors、grid_x、grid_y的调参边界介绍完检测再看识别模型的训练参数。LBPHFaceRecognizer的创建接口长这样recognizer cv2.face.LBPHFaceRecognizer_create(radius1, neighbors8, grid_x8, grid_y8)这4个参数直接决定了特征提取的方式是穿越到项目后必须理解和调整的地方。参数说明radius中心像素和周围像素的距离。默认是1即只看紧邻的一圈像素。调成2可以捕获更大范围的纹理特征但计算量会增加且对图像分辨率要求更高。这种做法适合样本图片拍得比较清晰、尺寸较大的场景如果摄像头像素不行radius设2反而会引入噪声。neighbors参与比较的邻域像素个数。默认是8对应中心点周围8个方向。这个值越大生成的二进制模式越丰富但也越容易受噪声干扰。grid_x和grid_y图像被划分为网格的数量。默认8x8整张图被划分为64个小区域每个区域提取一个直方图再拼成整张图的特征。网格越多空间信息越细但特征维度越高训练速度变慢对样本数量要求也更高。我在多个人脸数据集上试过radius1, neighbors8, grid_x8, grid_y8这个默认组合在样本量为每人2050张时表现最稳。如果每人只有10张样本我建议把grid_x和grid_y调成6x6降低特征维度能减少过拟合。4. 核心模块拆解从训练到识别的完整调用链4.1 数据预处理灰度转换、尺寸统一与样本质量人脸识别系统的效果上限在数据采集阶段就已经决定了。模型再强喂进去的是模糊、偏色、人脸位置偏斜的图片训练出来的特征也是“歪的”。这套源码的数据预处理部分做了三件事灰度化、人脸对齐、尺寸归一化。灰度化是必须的因为LBPH的特征提取本身基于灰度值纹理关系彩色信息不仅没用还会增加计算量。先用cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)把摄像头帧转成灰度图。人脸对齐这一步在源码里可能做得比较轻——只检测人脸框不检测五官关键点。这一步带来的影响在样本质量高的时候不明显但如果你采集时喜欢歪头我建议手动加一步用cv2.resize把人脸区域统一到200x200的正方形至少保证尺寸一致。一个容易被忽略的点是图片的存储格式。OpenCV的imwrite默认保存为BGR顺序但如果你的原始灰度图在预处理时用了PIL库读取再转存很容易出现通道顺序问题。在这套项目里统一采用灰度图存储能避免这个问题。我一般会在保存前加一段校验代码face_img gray[y:yh, x:xw] face_img cv2.resize(face_img, (200, 200)) assert face_img.shape (200, 200), 图像尺寸不符合预期这段断言代码会在图像尺寸不对时直接抛异常避免脏数据混进训练集。跨过这段校验后才允许imwrite写入文件。4.2 训练脚本走读读取数据集、打标签、训练模型训练阶段是整个系统里最像“黑匣子”的部分很多人跑通了却不知道里面发生了什么。我把train.py的核心逻辑拆出来逐段解释import cv2 import os import numpy as np dataset_dir dataset recognizer cv2.face.LBPHFaceRecognizer_create(radius1, neighbors8, grid_x8, grid_y8) images [] labels [] label_map {} # 姓名 - 数字标签 current_label 0 for person_name in os.listdir(dataset_dir): person_dir os.path.join(dataset_dir, person_name) if not os.path.isdir(person_dir): continue label_map[current_label] person_name for img_name in os.listdir(person_dir): img_path os.path.join(person_dir, img_name) img cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) img cv2.resize(img, (200, 200)) images.append(img) labels.append(current_label) current_label 1 recognizer.train(images, np.array(labels)) recognizer.save(trainer/trainer.yml) # 保存姓名与标签的映射关系 import json with open(trainer/label_map.json, w, encodingutf-8) as f: json.dump({str(k): v for k, v in label_map.items()}, f, ensure_asciiFalse) print(f训练完成共{len(images)}张图片识别{len(label_map)}个人)代码逻辑说明程序遍历dataset目录下的每个人名文件夹文件夹名就是人的姓名文件夹里的每张图片对应一个训练样本。训练时把人名映射成数字标签因为OpenCV的FaceRecognizer只接受整数标签。训练完成后模型保存到trainer.yml标签映射关系单独存成json文件这样主程序加载模型时才能把数字标签翻译回姓名。参数说明recognizer.train(images, np.array(labels))要求images是list格式labels是numpy数组两者长度必须一致。labels的类型必须是int32如果传了字符串会直接报错。保存模型用save()方法路径的目录需要提前存在否则会静默失败——这是OpenCV的一个坑不会报错但识别阶段会发现model文件根本没生成。整个训练过程在CPU上跑50张图片基本是秒级完成。如果训练时间异常长先检查图片尺寸是不是调成了800x800以上这会导致特征维度爆炸式增长。4.3 实时识别流程摄像头取帧、人脸检测、置信度过滤训练完模型最后一步是在视频流里实时识别。这个环节的工程细节最多直接决定了答辩现场的表现。以下是main.py里识别部分的核心代码import cv2 import json import os # 加载训练好的模型和标签映射 recognizer cv2.face.LBPHFaceRecognizer_create() recognizer.read(trainer/trainer.yml) with open(trainer/label_map.json, r, encodingutf-8) as f: label_map {int(k): v for k, v in json.load(f).items()} face_detector cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml) cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: break gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces face_detector.detectMultiScale(gray, scaleFactor1.2, minNeighbors5, minSize(100, 100)) for (x, y, w, h) in faces: face_region cv2.resize(gray[y:yh, x:xw], (200, 200)) label, confidence recognizer.predict(face_region) # confidence值越小表示距离越近置信度越高 if confidence 55: name label_map.get(label, Unknown) color (0, 255, 0) else: name Unknown color (0, 0, 255) cv2.rectangle(frame, (x, y), (xw, yh), color, 2) cv2.putText(frame, f{name} ({confidence:.1f}), (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 2) cv2.imshow(Face Recognition, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()逻辑说明主程序先把训练好的模型和标签映射读进内存然后进入无限循环读取一帧摄像头画面检测人脸对每张人脸区域调用predict方法。predict返回两个值——label是数字标签confidence是当前人脸特征与模型已知特征之间的距离。距离越小代表越相似confidence0表示完全相同实际使用中几乎不可能达到。参数说明confidence 55这个阈值是我在这个项目上调出来的一个经验值。LBPH的confidence数值受图片尺寸、光照、样本数量影响很大不同环境下的“合理阈值”不同必须实测调整。阈值设太低真实用户会被频繁识别为陌生人设太高陌生人会被乱认成熟人。建议先跑一段时间的摄像头识别打印出多次识别同一人的confidence值分布然后取该分布的中间偏高值设为阈值。注意一个细节label_map存储时把键转换成了字符串因为json的key只能是字符串读取时再转回int。这个转换逻辑如果漏掉会出现“识别框显示数字标签而不是姓名”的问题。5. 毕设人脸识别最常见的六个坑现象、原因、解决办法5.1 摄像头打不开、画面全黑或报错现象运行main.py后程序不报错但cv2.imshow的窗口全黑或者直接抛cv2.error: Could not open camera。原因大概率是摄像头编号错误。cv2.VideoCapture(0)里的0表示笔记本内置摄像头但如果你外接了USB摄像头有时设备编号是1或2。另一个常见原因是在虚拟机或远程桌面环境下物理摄像头没有映射到系统设备列表里。解决先写一个三行的脚本遍历摄像头编号import cv2 for i in range(5): cap cv2.VideoCapture(i) ret, frame cap.read() print(f摄像头{i}: {正常 if ret else 不可用}) cap.release()运行后看到哪些编号返回正常就把main.py里的序号改成那个值。血泪经验不要因为设备管理器里显示摄像头存在就跳过这一步OpenCV对摄像头驱动的兼容性有时很玄学。5.2 识别框乱跳同一个人的confidence值忽高忽低现象同一张脸在画面里不动识别结果却在两个标签之间来回横跳confidence值一会在30多一会在80多。原因检测框大小和位置不稳定。detectMultiScale每一帧返回的人脸框可能差几个像素这导致裁剪出来的人脸区域在连续帧里有细微偏移。LBPH对图像的像素级变化比较敏感细微偏移就会被放大成特征差异。另一个原因是画面里有反光或背光灰度图在局部区域的明暗关系发生了突变。解决把识别逻辑改成“连续N帧取平均”——每帧只做检测不立即判识别人脸身份只有连续3帧以上检测到人脸才在最后一帧的位置做一次predict然后用这多次predict的置信度平均值做最终判断。这种做法能显著提升实时识别的稳定性。另外在采集阶段让样本包含一定角度的侧脸比全部正脸更容易泛化。5.3 训练时接口报错module cv2 has no attribute face现象运行train.py时抛出AttributeError: module cv2 has no attribute face但cv2的其他功能都正常。原因环境里只装了opencv-python没装opencv-contrib-python。cv2.face模块从OpenCV 3.0之后就移到了contrib包里基础安装不包含它。这个问题在PyCharm的虚拟环境里尤其常见——换了解释器环境但依赖没有重新安装。解决执行pip install opencv-contrib-python4.8.1.78安装完重启Python解释器。注意版本必须和opencv-python完全一致否则两个包的文件会互相覆盖出现各种诡异的链接错误。我通常一次性安装两个包并用pip show opencv-python opencv-contrib-python检查版本号是否匹配。5.4 陌生人被识别成已知用户现象一个完全不在训练集里的人出现在摄像头前系统却显示为张三而且confidence值只有40多。原因置信度阈值设置得太宽松。LBPH的识别机制本质上是“找最近的距离不管距离有多远”所以如果不设阈值它永远会给你一个结果。这在小样本场景下非常危险——一个没见过的人脸只要它和任一已知人脸的特征距离在阈值范围内就会被误认。解决先用测试数据统计阈值。具体做法是让一个陌生人站在摄像头前做10次识别记录每次的confidence值再让每个已知用户各做10次识别记录对应confidence值。取陌生人confidence值的最小值和已知用户的最大值阈值设置在两者之间。我在这套项目上的经验数据是正常识别自己30左右陌生人通常在80以上阈值取55左右比较合适。如果发现陌生人confidence也低于60说明样本质量太差或样本量不够应该补充训练数据而不是继续调阈值。5.5 训练报错train() missing 1 required positional argument labels现象调用recognizer.train(images, labels)时报错提示labels参数缺失或格式错误。原因train()方法的签名要求train(samples, labels)如果labels是普通list而不是numpy数组或者数组的dtype不是int32OpenCV会给出一个不太直观的报错信息让人误以为是参数名写错。另一个隐蔽原因是images列表里的图片尺寸不一致OpenCV在组装训练矩阵时因为维度对不上把异常吞成了labels的问题。解决确保每个样本先resize到相同尺寸labels用np.array(labels, dtypenp.int32)转换。给images列表加一个断言检查确认所有图片shape一致for img in images: assert img.shape (200, 200), f图片尺寸不一致: {img.shape}用这句断言卡住之后再调用train就不会遇到让人摸不着头脑的维度错了。5.6 打包exe后运行时找不到模型或xml文件现象项目在PyCharm里跑得挺好用PyInstaller打包成exe后双击运行却提示找不到trainer.yml或haarcascade xml文件。原因PyInstaller打包时不会自动包含项目里的非代码文件而源码里的路径是相对路径——在开发环境下相对的是项目根目录在exe运行环境下相对的是exe所在目录。如果模型文件和exe的存放位置不一致或者模型文件压根没被打进包里运行时就会因为找不到文件而中断。解决用PyInstaller的--add-data参数把模型文件打包进去同时代码里用sys._MEIPASS处理路径。常见的做法是这样import sys import os def resource_path(relative_path): base_path getattr(sys, _MEIPASS, os.path.abspath(.)) return os.path.join(base_path, relative_path) model_path resource_path(trainer/trainer.yml) cascade_path resource_path(haarcascade_frontalface_default.xml)PyInstaller命令加上--add-data trainer/trainer.yml;trainer和--add-data haarcascade_frontalface_default.xml;.。在Windows上分隔符是分号Linux和macOS是冒号这个细节我写过错后来干脆在项目里放了一个build.bat脚本把打包命令固定下来再也没翻过车。6. 答辩加分技巧用一个测试脚本量化识别准确率毕业设计答辩最怕的就是老师问“你怎么验证你的系统是可靠的”。如果只靠现场演示结果好就是好结果差就说不出个所以然来。我强烈建议你写一个独立的验证脚本在答辩前对系统做一次定量评测把准确率数据带进论文和PPT里。最简方案是离线测试从每个已知人的样本里留出20%的图片不参与训练这些图片作为测试集用训练好的模型逐张预测统计预测正确率import cv2 import os import numpy as np recognizer cv2.face.LBPHFaceRecognizer_create() recognizer.read(trainer/trainer.yml) test_dir dataset total 0 correct 0 for person_name in os.listdir(test_dir): person_dir os.path.join(test_dir, person_name) if not os.path.isdir(person_dir): continue for img_name in os.listdir(person_dir): img cv2.imread(os.path.join(person_dir, img_name), cv2.IMREAD_GRAYSCALE) img cv2.resize(img, (200, 200)) label, confidence recognizer.predict(img) predicted_name label_map.get(label, ) if predicted_name person_name and confidence 55: correct 1 total 1 print(f准确率: {correct}/{total} {correct/total*100:.2f}%)运行这个脚本得到准确率后在论文里的写法可以更硬气“系统在自建人脸数据集上的识别准确率达到97.5%在光照充足、正脸朝向的条件下识别平均响应时间低于0.5秒。”有了量化指标老师的提问方向会从“你的系统行不行”变成“你的准确率受哪些因素影响”后者的回答难度低得多。再往前走一步我给你两个小改进方向都可以作为论文的创新点展开第一个是在采集阶段引入人脸关键点对齐。用dlib的68点人脸检测器定位双眼位置通过仿射变换把人脸旋转到标准姿态。这样处理后抬头、低头、侧脸情况下的人脸识别率会明显提升。边界是dlib需要单独安装且模型文件较大但作为加分项足够有区分度。第二个是把LBPH换成OpenCV的深度学习人脸识别模块cv2.dnn.readNetFromCaffe配合预训练的SqueezeNet人脸识别模型。这个方案的精度远高于LBPH但模型初始化时间长、CPU推理速度慢框架代码也要改动较多。如果你时间充裕可以尝试时间紧张先保LBPH跑通即可。最后分享一个我自己的教训当年做毕设时我在采集阶段偷懒觉得多拍点就行没有检查样本质量结果训练出来的模型在答辩现场把一个老师误识别成了实验室同学场面相当尴尬。从那以后我每次跑人脸识别项目都会强制走一遍“样本清洗 → 预处理 → 训练 → 离线准确率验证”的完整流程识别准确率没验证过绝不直接上摄像头。希望这个习惯也能帮到你祝答辩顺利。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →