基于 Python 和 Dlib 的人脸相似度对比实现
概述
人脸识别是人工智能领域的重要应用之一。通过提取人脸的特征向量,我们可以计算两张图片中人脸的相似度。本文将介绍如何使用 Python 和 Dlib 库实现一个简易版的人脸相似度对比程序。
环境准备
在开始之前,请确保已安装以下依赖:
-
Python 3.x:建议使用 3.6 及以上版本。
-
C++ 编译器:Dlib 需要编译,Windows 用户建议安装 Visual Studio Build Tools,Linux/Mac 用户需安装 g++ 或 clang。
-
第三方库:
pip install dlib opencv-python scikit-image numpy glob -
模型文件:
shape_predictor_68_face_landmarks.dat:用于检测人脸关键点(眼睛、嘴巴等)。dlib_face_recognition_resnet_model_v1.dat:用于生成人脸特征值(128 维)。
模型文件可从 Dlib 官方 GitHub 仓库下载,并放置于项目根目录。
核心原理
1. 人脸关键点检测
首先使用 Haar 级联分类器或 HOG 特征结合线性 SVM 来定位图像中的人脸区域。随后利用形状预测器(Shape Predictor)检测出人脸上的 68 个关键点坐标。
2. 特征值提取
Dlib 提供了一个预训练的 ResNet 网络,能够将人脸图像映射为一个 128 维的浮点数向量(Descriptor)。这个向量包含了人脸的独特特征信息。对于同一个人的不同照片,其生成的特征向量距离应该非常近;而对于不同的人,距离则较远。
3. 相似度计算
通常使用欧几里得距离(L2 Norm)来衡量两个特征向量之间的差异。公式如下:
$$\text{Distance} = \sqrt{\sum_{i=1}^{128} (x_i - y_i)^2}$$
距离越小,表示两张图片中的人脸越相似。在实际应用中,一般认为距离小于 0.6 为同一人,大于 0.6 为不同人(阈值可根据具体场景调整)。
代码实现
第一步:导入模型与配置路径
import os
import dlib
import glob
import numpy as np
from skimage import io
# 配置路径
predictor_path = "shape_predictor_68_face_landmarks.dat"
face_rec_model_path = "dlib_face_recognition_resnet_model_v1.dat"
faces_folder_path = 'train_images' # 训练集文件夹
def load_models():
"""加载 Dlib 模型"""
detector = dlib.get_frontal_face_detector()
sp = dlib.shape_predictor(predictor_path)
facerec = dlib.face_recognition_model_v1(face_rec_model_path)
detector, sp, facerec


