一、项目简介
本项目基于 YOLOv3 + FaceNet 构建端到端的人脸检测与识别系统。
-
首先使用 Fine-tuned YOLOv3 模型(在 WIDER FACE 数据集上微调)进行人脸区域检测;
-
然后利用 FaceNet 提取人脸特征向量(128维或512维);
-
最后通过 SVM 分类器 对特征向量进行分类,实现对已知人员的身份识别。
整个流程支持图片和视频输入,可快速部署用于小规模人脸识别场景(如门禁、考勤、访客识别等)。
二、项目结构
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技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!