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

2026年最新版Python安装和PyCharm安装教程(图文详细 附安装包)

2026年最新版Python安装和PyCharm安装教程(图文详细 附安装包)

2026年最新版Python安装和PyCharm安装教程 * 前言:安装前友好提示 * 一、Python安装 * 1、 下载python安装包 * 2、 安装python * 3、验证安装成功 * 二、 安装Pycharm * 1、Pycharm介绍 * 2、Pycharm安装 * 3、Pycharm使用 前言:安装前友好提示 (1) 避免安装路径有中文 / 空格; (2) 如果非指定版本建议安装最新版; (3) 无特殊要求随便选一个python版本(建议3.11.9) (4)pycharm无特殊要求建议选择2025版本 一、Python安装 1、 下载python安装包 Python-Pycharm安装包:https://pan.quark.cn/s/6878d7cc5460 安装包我已经下载好了,点击上面网盘链接直接获取就行 2、 安装python 双击下载好的 .exe

By Ne0inhk
Python深度挖掘:openpyxl和pandas的使用详细

Python深度挖掘:openpyxl和pandas的使用详细

文章目录 * 一、Excel处理在数据分析中的重要性 * 二、openpyxl基础与核心功能 * 2.1 openpyxl简介与安装 * 2.2 工作簿与工作表的基本操作 * 创建新工作簿 * 打开已有工作簿 * 工作表操作 * 2.3 单元格操作详解 * 基本单元格操作 * 批量操作单元格 * 特殊单元格操作 * 2.4 样式与格式设置 * 字体样式 * 对齐方式 * 边框设置 * 填充颜色 * 数字格式 * 2.5 公式与计算 * 2.6 图表与图像操作 * 创建图表 * 插入图像 * 2.7 高级功能 * 数据验证 * 条件格式 * 保护工作表 * 冻结窗格 * 三、pandas基础与核心功能 * 3.1 pandas简介与安装 * 3.2

By Ne0inhk
Windows 上用 pyenv-win 玩转多版本 Python:安装、国内源、常用命令与版本切换

Windows 上用 pyenv-win 玩转多版本 Python:安装、国内源、常用命令与版本切换

想在一台机器上优雅地共存多个 Python 版本?在 Windows 上,pyenv-win 是最轻量也最“懂开发者”的选择。本文带你用命令行完成安装、配置国内源/加速、掌握常用命令,顺手装好指定版本并实现一键切换。 一、安装 pyenv-win(命令行) 优先推荐 PowerShell 一键脚本; * PowerShell 一键安装(官方推荐) Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"

By Ne0inhk
Python入门:Python3 pyecharts模块全面学习教程

Python入门:Python3 pyecharts模块全面学习教程

Python入门:Python3 pyecharts模块全面学习教程 Python入门:Python3 pyecharts模块全面学习教程,这篇 pyecharts 学习教程围绕 Python 数据可视化展开,先介绍 pyecharts 基于 ECharts、Python 友好、支持交互式操作、图表类型丰富且高可定制的核心优势;接着详解其安装方法(主流的 pip 一键安装与备用的源码安装)及版本验证方式,并提供常用图表 “类型 - 类名 - 导入方式” 速查表;随后以月度销售额柱状图为案例,演示从数据准备、图表创建到渲染的基础流程,进阶部分通过 set_global_opts 配置标题、坐标轴、工具箱等让图表更专业,还讲解 10 + 内置主题(如亮色系 LIGHT、暗色系 DARK)的切换技巧,最后给出尝试其他图表、

By Ne0inhk