基于 Python + OpenCV 的人脸识别项目实战(SFaceEmbedding + GUI 一键训练 + 测试评估)

基于 Python + OpenCV 的人脸识别项目实战(SFaceEmbedding + GUI 一键训练 + 测试评估)

基于 Python + OpenCV 的人脸识别项目实战(SFaceEmbedding + GUI 一键训练 + 测试评估)

目录

1. 项目简介

这是一个本地可运行的人脸识别 Python 项目,完整实现了从训练集准备到图形界面识别的全流程,适合课程设计、毕业设计、OpenCV 学习、Python 实战项目展示。

项目主要能力:

  1. 训练集管理(按“姓名/图片”目录组织)
  2. 自动划分训练集 / 测试集(split
  3. 人脸预处理(prepare,支持检测/裁剪/统一尺寸)
  4. 模型训练(默认 SFaceEmbedding,兼容 LBPH
  5. 单张图片识别(GUI / 命令行)
  6. 批量评估测试集准确率
  7. 图形界面(支持一键训练、选图识别、进度条)
  8. 图片抓取下载 GUI(按关键词下载训练图)
  9. 中文路径 / 中文姓名标签支持(Windows 场景)

2. 项目效果展示(可放截图)

2.1 主识别 GUI(训练 + 测试 + 识别)

  • 一键训练(split -> prepare -> train
  • 测试集目录切换
  • 识别结果预览
  • 日志与 JSON 结果展示

2.2 图片抓取下载 GUI(补充训练集)

  • 输入关键词(如:薛之谦、胡歌)
  • 指定保存目录(如 dataset/raw_lfw/人物名
  • 指定下载数量
  • 支持原图优先、缩略图回退
  • 支持下载日志与进度条

3. 技术方案说明(核心原理)

本项目支持两种识别后端:

3.1 默认方案:SFaceEmbedding(推荐)

当前默认使用 SFaceEmbedding 路线,整体流程如下:

  1. 使用 YuNet 进行人脸检测(DNN)
  2. 使用 SFace 提取人脸 embedding(特征向量)
  3. 将新图的人脸向量与训练库中的向量做相似度匹配(cosine distance)
  4. 根据阈值判断是否为已知人物或 unknown

特点:

  1. 对彩色自然照片更稳
  2. 比传统 LBPH 更适合真实场景(网络图片、手机照片)
  3. 不需要从零训练神经网络(使用预训练模型做特征提取)

3.2 兼容方案:LBPH(传统方法)

项目中也保留了 LBPH 路线,适合作为传统方法对照学习。

特点:

  1. 实现简单
  2. 对规整、已裁剪人脸图可用
  3. 对真实场景图片的鲁棒性通常不如 SFace

4. 项目目录结构

view/ artifacts/ # 模型、标签映射、报告、ONNX 模型缓存 face_embedding_gallery.npz # 默认 SFace 特征库模型 lbph_face_model.yml # LBPH 模型(备用) label_map.json # 标签映射(id -> 姓名) model_meta.json # 模型元信息(后端、阈值、尺寸等) dataset_summary.json # 预处理统计 eval_report.json # 批量评估报告 models/ face_detection_yunet_*.onnx # YuNet 模型(自动下载) face_recognition_sface_*.onnx # SFace 模型(自动下载) dataset/ raw/ # 原始数据集(按姓名分目录) raw_lfw/ # LFW 彩色样例数据(推荐) processed/ # 预处理后人脸图(LBPH 使用) splits/ train_raw/ # 划分后的训练集原图 test_raw/ # 划分后的测试集原图 train_processed/ # 划分后训练集预处理结果(LBPH) outputs/ gui/ # GUI 识别结果图 eval/ # 批量评估标注图 scripts/ download_sample_dataset.py # 下载样例数据集(LFW/Olivetti) download_images_gui.py # 图片抓取下载 GUI(新增) split_dataset.py # 划分训练集/测试集 prepare_dataset.py # 预处理(检测/裁剪/缩放) train_model.py # 训练(默认 SFace,兼容 LBPH) recognize_image.py # 单图识别 evaluate_testset.py # 批量评估 gui_app.py # 主识别 GUI src/face_pipeline/ # 核心逻辑 requirements.txt # 依赖 README.md # 项目说明 

5. 环境安装(Windows / PowerShell)

建议使用虚拟环境:

python -m venv .venv .\.venv\Scripts\activate python -m pip install -r requirements.txt 

5.1 国内镜像(清华源)

如果网络较慢,可以使用清华源安装依赖:

python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt 

6. 样例数据集(推荐使用 LFW 彩色数据)

项目提供了样例数据集下载脚本,支持:

  1. LFW(彩色,推荐)
  2. Olivetti(灰度,较老,仅做流程验证)

6.1 下载 LFW 到新目录(不覆盖自己的数据)

.\.venv\Scripts\python scripts\download_sample_dataset.py --dataset lfw --output-dir dataset\raw_lfw --clean --lfw-min-faces 20 --per-person 10 --shuffle --seed 42 

下载后目录名会是:

  1. Angelina_Jolie
  2. George_W_Bush
  3. Colin_Powell

7. 使用自己的图片训练(重点)

7.1 数据集组织方式

按“人名目录”组织图片,文件夹名就是标签名:

dataset/ raw/ 邓紫棋/ 001.jpg 002.png 003.jpg 胡歌/ 001.jpg 002.jpg 

支持格式:

  1. .jpg
  2. .jpeg
  3. .png
  4. .bmp
  5. .webp

7.2 是否需要手动改成 200x200?

不需要。

对普通原图,项目会自动完成:

  1. 人脸检测
  2. 人脸裁剪
  3. 尺寸归一化(LBPH 路线需要)

8. 主 GUI 使用方法(推荐)

启动 GUI:

.\.venv\Scripts\python scripts\gui_app.py 

8.1 一键训练(GUI)

GUI 左侧已按流程调整顺序:

  1. 一键训练(split + prepare + train
  2. 测试集目录与识别设置
  3. 测试图片列表
  4. 日志区域

训练步骤:

  1. 设置“训练原图目录”
  2. 设置每人训练/测试张数(例如 8 / 2
  3. 根据数据类型决定是否勾选 训练预处理跳过检测
  4. 点击 一键训练(split + prepare + train)
  5. 等待进度条完成(支持 split / prepare / train 步骤状态显示)

8.2 识别单张图片(GUI)

  1. 从左侧测试集列表双击图片
  2. 或点击“浏览文件”选择任意本地图片
  3. 点击“识别当前图片”

当前 GUI 识别结果展示方式:

  1. 图片中只画人脸框(避免小图文字过小/截断)
  2. 识别文本固定显示在结果图下方(固定字号)
  3. 日志区域显示完整 JSON 结果(含 bbox、name、confidence、unknown)

9. 图片抓取下载 GUI(新增功能)

为了方便补充训练集,我额外做了一个独立界面:

.\.venv\Scripts\python scripts\download_images_gui.py 

9.1 功能说明

  1. 输入关键词(如:薛之谦 / 胡歌
  2. 自动生成人物子目录名
  3. 下载指定数量图片到 dataset/raw_lfw/人物名
  4. 支持尺寸过滤、字节数过滤
  5. 支持“下载前清空目标目录”
  6. 支持“缩略图回退”(仅在原图失败时回退,不再重复保存缩略图)

9.2 关于重复图片问题(踩坑记录)

初版实现中会出现“大图 + 474x 缩略图”成对重复,原因是每条结果同时下载了:

  1. 原图链接(murl
  2. 缩略图链接(turl

当前已修复为:

  1. 优先下载原图
  2. 原图失败时才回退缩略图
  3. 日志显示来源标记([orig] / [thumb]

10. 命令行方式(CLI)完整流程

10.1 划分训练集 / 测试集

.\.venv\Scripts\python scripts\split_dataset.py --clean --source-dir dataset\raw_lfw --train-per-person 8 --test-per-person 2 --shuffle --seed 42 

10.2 预处理(已裁剪人脸图可跳过检测)

.\.venv\Scripts\python scripts\prepare_dataset.py --clean --skip-detect--raw-dir dataset\splits\train_raw --processed-dir dataset\splits\train_processed 

10.3 训练模型(默认 SFaceEmbedding)

.\.venv\Scripts\python scripts\train_model.py --backend sface --raw-dir dataset\splits\train_raw 

10.4 单图识别

.\.venv\Scripts\python scripts\recognize_image.py --image path\to\photo.jpg 

10.5 批量评估测试集

.\.venv\Scripts\python scripts\evaluate_testset.py --test-dir dataset\splits\test_raw 

11. 多人脸图片是否支持分别识别?

支持。

前提:

  1. 识别时不要勾选 跳过检测(已裁剪人脸图)
  2. 使用普通照片进行识别
  3. 图片中的人脸不要太小、太模糊

程序会:

  1. 检测图中多张人脸
  2. 对每张人脸分别提取特征并匹配
  3. 返回多个结果(results 列表)

12. 阈值说明(SFace 和 LBPH 不能混用)

12.1 SFaceEmbedding(默认)

  1. confidence 表示 cosine distance(距离)
  2. 数值越小越像
  3. 默认阈值 0.62
  4. 常见调参范围 0.55 ~ 0.75

12.2 LBPH

  1. confidence 表示 LBPH 距离
  2. 数值越小越像
  3. 默认阈值 70
  4. 常见调参范围 50 ~ 120

13. 典型问题与解决方案(实战踩坑)

13.1 cv2.face 不存在(module 'cv2' has no attribute 'face'

原因:

  1. 安装了 opencv-python 而不是 opencv-contrib-python
  2. IDE 运行按钮使用了错误解释器(不是 .venv

解决:

.\.venv\Scripts\python -m pip uninstall -y opencv-python opencv-contrib-python .\.venv\Scripts\python -m pip install -r requirements.txt 

并确认 IDE 解释器为:

  • ...\view\.venv\Scripts\python.exe

13.2 中文路径图片读取/写入失败(Windows)

例如微信截图名、中文人物名目录。

项目已做兼容处理:

  1. 中文路径读图(imdecode + Python 文件 IO)
  2. 中文路径写图(imencode + Python 文件 IO)
  3. 中文姓名标签绘制(Pillow)

13.3 识别成功但结果图预览空白

原因通常是:

  • 结果图刚写完就读取失败
  • 中文路径导致旧版写盘路径异常

当前 GUI 已处理:

  1. 结果图预览重试
  2. 失败时回退显示原图并记录日志
  3. 识别结果本身仍有效(名字和 bbox 已算出)

14. 项目亮点总结

这个项目完整做成了一个可操作、可展示、可扩展的小型人脸识别系统,包含:

  1. GUI 一键训练流程
  2. 彩色样例数据集支持(LFW)
  3. 自定义数据集训练
  4. 中文路径/中文标签兼容
  5. 批量评估与结果输出
  6. 独立图片抓取下载工具
  7. 多后端(SFaceEmbedding / LBPH)对比学习

15. 注意事项

  1. 本项目仅用于学习与技术交流
  2. 使用他人照片请注意授权与隐私
  3. 图片抓取结果建议人工筛选,避免误抓、重复图、多人图影响训练效果

Read more

前端 + agent 开发学习路线

背景:团队启动Agent项目,从零开始学习工程化AI开发 感谢ai老师写的学习指南。存档! 引言:从困惑到清晰 最近团队要启动Agent项目,我第一次接触这个概念时,只停留在“接入大模型API+优化Prompt”的浅层理解。经过大量学习和实践探索,我才发现工程化Agent开发是系统化的架构设计,而不仅仅是API调用。 这篇文章记录我从前端视角出发,探索Agent工程化开发的学习路径和实践经验。如果你也是前端/全栈开发者,想要在AI时代找到自己的定位,这篇指南应该能帮到你。 一、认知重塑:什么是工程化Agent? 1.1 我的错误认知 vs 现实 我原来的理解: Agent = 大模型API + Prompt优化 实际上的工程化Agent: Agent = 系统架构 + 可控执行 + 安全审查 + 领域适配 + 可观测性 1.2 Agent的分层架构(医疗场景示例) 你的主战场 任务分解器 工具路由器 记忆管理器 状态监控器

By Ne0inhk
《Web 自动化测试入门:从概念到百度搜索实战全拆解》

《Web 自动化测试入门:从概念到百度搜索实战全拆解》

一、自动化的核心概念 1. 定义:通过自动方式替代人工操作完成任务,生活中常见案例(自动洒水机、自动洗手液、超市闸机)体现了 “减少人力消耗、提升效率 / 质量” 的特点。 2. 软件自动化测试的核心目的: * 用于回归测试:软件迭代新版本时,验证新增功能是否影响历史功能的正常运行。 3. 常见面试题解析: * 自动化测试不能完全取代人工测试:需人工编写脚本,且功能变更后需维护更新,可靠性未必优于人工。 * 自动化测试不能 “大幅度降低工作量”:仅能 “一定程度” 减少重复工作,需注意表述的严谨性。 二、自动化测试的分类 自动化是统称,包含多种类型,核心分类及说明如下: 分类说明接口自动化针对软件接口的测试,目的是验证接口的功能、性能、稳定性等。UI 自动化 针对软件界面的测试,包含: 1. 移动端自动化:通过模拟器在电脑上编写脚本,测试手机应用;稳定性较差(受设备、

By Ne0inhk
想快速给前端加个AI小助手?这个CopilotKit神器,跟着一步步实战,感觉比想象中简单多了!

想快速给前端加个AI小助手?这个CopilotKit神器,跟着一步步实战,感觉比想象中简单多了!

最近你可能听过一个新的AG-UI(Agent-User InteractionProtocol)协议:定义了前端UI和后端Agent之间的集成标准。不过与MCP/A2A协议不同的是,AG-UI是从实际产品中提炼出来的标准。这个产品就是CopilotKit:一个强大的、用来集成前端UI与后端Agent的开源神器,也是AG-UI协议的参考实现。 本篇将结合实例,为你深入展示 CopilotKit 的核心能力。你不仅能掌握这一实用新工具,更能真正理解 AG-UI 协议的落地应用,摆脱停留在表面的概念认知。 * CopilotKit与AG-UI初探 * 构建一个CopilotKit的演示Demo * CopilotKit能力之:前后端State共享 * CopilotKit能力之:调用前端“工具” * CopilotKit能力之:基于Agent的生成式UI * CopilotKit能力之:HITL(人类参与流程) * 其他与总结 我们分成两篇一步步介绍(源代码见文末)。 开始前,欢迎了解本号重磅新作 01CopilotKit与AG-UI初探 【挑战在哪里】 MCP

By Ne0inhk

AI Skills:前端新的效率神器!

近来,AI 领域有个火爆的话题:Skills。 Github 上被疯狂 star 的仓库,很多都是和 skills 有关的。 有的仓库仅仅上线三个月就获得了快 50K 的 star,Skills 的火热可见一斑。 不管是大模型,还是 Cursor、Codex、Claude、Trae、Copilot 等编程 IDE 都在争先支持 Skills。 围绕 Skills,它们在做的就是为了完成一件事情:技能是通过学习和反复练习获得的,而 Skills 是把经验和最佳实践沉淀为 AI 能力,将“知道”转化为“做到”的本领。 详解什么是 Skills 要说清楚什么是 Skills,先来了解一下关于 AI 的 2

By Ne0inhk