离线人脸识别实战:YOLOv3 检测人脸,FaceNet 提特征,SVM 做分类

43 阅读4分钟

一、项目简介

本项目基于 YOLOv3 + FaceNet 构建端到端的人脸检测与识别系统。

  • 首先使用 Fine-tuned YOLOv3 模型(在 WIDER FACE 数据集上微调)进行人脸区域检测;

  • 然后利用 FaceNet 提取人脸特征向量(128维或512维);

  • 最后通过 SVM 分类器 对特征向量进行分类,实现对已知人员的身份识别。

整个流程支持图片和视频输入,可快速部署用于小规模人脸识别场景(如门禁、考勤、访客识别等)。

a55829b950d08ed168dc42eab9dea3b6_164808_5e279300_1295352.png

二、项目结构

project-root/
├── data/
│   ├── baseface/                     # 人脸训练数据集
│   │   ├── 0/                        # 第0个人的人脸图片(tag=0)
│   │   ├── 1/                        # 第1个人的人脸图片(tag=1)
│   │   ├── ...
│   │   ├── n/                        # 第n个人的人脸图片(tag=n)
│   │   ├── map.txt                   # 文件夹ID与真实姓名的映射(空格分隔)
│   │   └── vector.csv                # 所有人脸图片对应的特征向量及标签
│   ├── weights_facenet/              # FaceNet 模型权重
│   ├── weights_yolo/                 # Fine-tuned YOLOv3 人脸检测模型
│   ├── weights_svm/                  # 训练好的 SVM 分类模型(svm.pkl)
│   ├── face-names/                   # 预测类别名称(可选,默认从 map.txt 读取)
│   └── yolo_anchors.txt              # YOLOv3 训练时聚类得到的 anchor 尺寸
├── net/                              # YOLOv3 与 FaceNet 网络定义
├── preprocessing/                    # 预处理工具脚本
├── setting/                          # 模型与运行参数配置
├── utils/                            # 工具函数封装
└── test.py                           # 主程序入口

三、模型文件(权重)

1、YOLO Face 模型

  • 基于原始 YOLOv3,在 WIDER FACE 数据集上进行微调(fine-tuning)。

(密码:qli4

2、FaceNet 模型(推荐使用)

  • model-20180402-114759(输出 512 维向量,识别效果更佳)

(密码:56mh

  • 其他可选模型:

  • model-20170512-110547(128d,效果较差) → 密码:9x2l

  • model-20180408-102900 → 密码:jjf1

⚠️ 注意:早期 128d 模型识别准确率较低,建议使用 512d 版本。

四、关键技术说明

1、YOLOv3 人脸检测

  • 详细训练与预测流程请参考作者另一项目:YOLO_v3_tensorflow

  • 微调时需注意:WIDER FACE 数据集中存在 两个标注框宽或高为 0 的错误样本,必须剔除,否则 NMS 阶段会因除零报错。

2、SVM 分类器训练

  • 训练前必须对特征向量进行 标准化(StandardScaler)

  • 预测时需使用 相同的 scaler 参数 进行转换,否则所有预测结果将趋于一致。

3、数据建议

  • 当前每人仅用 15 张图片训练 SVM,效果有限;

  • 建议:

增加每人样本数量(>30 张,多角度、光照);

或尝试 SVM 调参(如核函数、C 值)、集成方法等优化策略。

五、环境依赖

numpy==1.16.4
pandas==0.24.2
opencv-python==4.1.1
scikit-learn==0.21.2
tensorflow==1.13.1
pillow==6.1.0

建议使用 Python 3.6~3.7 环境,TensorFlow 1.x 兼容性最佳。

六、使用方法

步骤 1:放置模型文件

将下载的 YOLO 和 FaceNet 模型文件放入 data/ 目录对应子文件夹中。

步骤 2:制作自定义人脸数据集

1、在 data/baseface/ 下为每个人创建独立文件夹,命名从 0 开始递增(如 0, 1, 2...);

2、将对应人物的人脸图片放入各自文件夹;

3、编辑 data/map.txt,按行写入 ID 姓名,例如:

0 张三
1 李四
2 王五

步骤 3:生成人脸特征向量

运行以下脚本:

python preprocessing/pre_tools.py

调用其中的 save_vector_csv() 函数,自动:

  • 加载 FaceNet 模型;

  • 提取每张人脸的 512 维特征;

  • 保存为 data/baseface/vector.csv(含标签)。

步骤 4:训练 SVM 分类器

在同一脚本中调用 train_face_svm()

  • 读取 vector.csv

  • 标准化特征;

  • 训练 SVM 并保存模型至 data/weights_svm/svm.pkl

步骤 5:开始测试

5.1 图片测试

1、将待测图片放入 data/test_img/

2、修改 setting/yolo_args.py

detect_object = 'img'
input_image = 'data/test_img/your_image.jpg'
output_image = 'data/output/result.jpg'  # 可选,需确保路径存在

3、运行:

python test.py

5.2 视频测试

1、将视频放入 data/test_video/

2、修改 setting/yolo_args.py

detect_object = 'video'
input_video = 'data/test_video/your_video.mp4'
output_video = 'data/output/result.mp4'  # 可选

3、运行

python test.py

输出结果将包含人脸框、识别姓名及置信度。

七、注意事项

  • 确保所有输出路径的父目录已存在,否则会报错;

  • FaceNet 模型需与 TensorFlow 1.13.1 兼容;

  • 若识别不准,请优先检查:

人脸是否正对、清晰、无遮挡;

训练集是否覆盖足够姿态与光照;

是否使用了 512d 的 FaceNet 模型。

关键词

YOLOv3、FaceNet、人脸识别、人脸检测、SVM分类、特征向量、TensorFlow、WIDER FACE、微调、桌面部署

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!