基于 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

GTE文本向量模型实战:基于Python的文本相似度计算与排序

GTE文本向量模型实战:基于Python的文本相似度计算与排序 1. 为什么你需要GTE模型——从实际问题出发 你有没有遇到过这样的情况:手头有几百条用户反馈,想快速找出哪些内容高度相似,避免重复处理?或者在做客服系统时,需要把新问题和历史知识库里的问答自动匹配,但用关键词搜索总是漏掉语义相近却用词不同的条目?又或者正在搭建一个内部文档检索工具,发现传统方法对"服务器响应慢"和"后端接口超时"这类表达完全无法识别为同一类问题? 这些问题背后,其实都指向同一个技术需求:让机器真正理解文字的含义,而不是只看字面是否相同。GTE模型就是为解决这类问题而生的——它能把一段话变成一串数字(向量),而语义越接近的句子,它们对应的数字串在数学空间里就越靠近。 我第一次用GTE处理公司产品文档时,原本需要人工比对三天的工作,用几行代码就完成了。最让我意外的是,它居然能准确识别出"APP闪退"和"应用崩溃"是同一类问题,这种语义层面的理解能力,远超简单的关键词匹配。 2. 环境准备:三步搞定本地部署 GTE模型的部署比想象中简单得多,

By Ne0inhk

Python 代码打包为 EXE 完全指南

Python 代码打包为 exe 完全指南(2025–2026 年最新实用版) 目前最主流、最稳定的几种打包方式对比(按推荐顺序): 排名工具优点缺点/坑点适合场景推荐指数 (2026)1PyInstaller兼容性最好、社区最大、文档最全生成的 exe 偏大、启动稍慢几乎所有场景(首选)★★★★★2Nuitka启动速度最快、文件体积较小、接近原生性能编译时间长、对依赖处理更严格对启动速度敏感的项目★★★★☆3cx_Freeze跨平台支持好、配置灵活社区活跃度低、文档较老需要高度自定义打包逻辑★★★☆☆4PyOxidizer极致体积优化、Rust 底层配置复杂、生态不成熟极致追求小体积的场景★★☆☆☆5Shiv / PEX生成 .pex 文件(类似 jar),不生成 exe需要 Python 环境才能运行服务器/内部工具分发(非桌面程序)★★☆☆☆ 绝大多数人(尤其是 Windows 桌面程序)2026 年仍然首选:

By Ne0inhk
C语言游戏开发:Pygame、SDL、OpenGL深度解析

C语言游戏开发:Pygame、SDL、OpenGL深度解析

C语言游戏开发:Pygame、SDL、OpenGL深度解析 一、前言:为什么游戏开发是C语言开发的重要技能? 学习目标 * 理解游戏开发的本质:编写程序实现游戏逻辑、图形渲染、用户交互 * 明确游戏开发的重要性:支撑游戏产业的发展,成为游戏开发者的必备技能 * 掌握本章学习重点:Pygame、SDL、OpenGL的开发方法、避坑指南、实战案例分析 * 学会使用C语言开发游戏,实现游戏逻辑和用户交互 重点提示 💡 游戏开发是C语言开发的重要技能!随着游戏产业的发展,游戏开发的需求越来越大,C语言的高性能和可移植性使其在游戏开发中具有重要地位。 二、模块1:Pygame游戏开发基础 2.1 学习目标 * 理解Pygame的本质:基于SDL的Python游戏库,简化游戏开发 * 掌握Pygame的核心架构:窗口管理、事件处理、图形渲染、音频播放 * 掌握Pygame的开发方法:使用Pygame库进行游戏开发 * 掌握Pygame的避坑指南:避免窗口创建失败、避免图形渲染错误、避免事件处理错误 * 避开Pygame使用的3大常见坑 2.

By Ne0inhk
Python 多线程日志错乱:logging.Handler 的并发问题

Python 多线程日志错乱:logging.Handler 的并发问题

Python 多线程日志错乱:logging.Handler 的并发问题 🌟 Hello,我是摘星! 🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。 🦋 每一个优化都是我培育的花朵,每一个特性都是我放飞的蝴蝶。 🔬 每一次代码审查都是我的显微镜观察,每一次重构都是我的化学实验。 🎵 在编程的交响乐中,我既是指挥家也是演奏者。让我们一起,在技术的音乐厅里,奏响属于程序员的华美乐章。 目录 Python 多线程日志错乱:logging.Handler 的并发问题 摘要 1. 问题现象与复现 1.1 典型的日志错乱场景 2. logging模块的线程安全机制分析 2.1 Handler级别的线程安全 2.2 锁竞争的性能影响分析 3. 深入源码:竞态条件的根本原因 3.1 Handler.emit()方法的竞态分析 3.2 I/O操作的原子性问题

By Ne0inhk