本文档介绍了 face_recognition 库中提供的 K-近邻 (KNN) 分类功能。它涵盖了当您需要从大量已知个体中识别面孔时如何使用 KNN 进行面部识别。KNN 在准确性和性能之间取得了良好的平衡,尤其是在处理许多已知面孔时。
有关不使用 KNN 的基本面部识别的信息,请参阅 基本面部识别。有关实时识别技术,请参阅 实时识别。
来源: examples/face_recognition_knn.py1-16 examples/facerec_ipcamera_knn.py1-16
K-近邻是一种简单但有效的机器学习算法,用于分类。在面部识别的背景下
face_recognition 库中的实现使用加权投票系统,其中较近的邻居(具有更相似特征的面孔)对最终预测的影响更大。
来源: examples/face_recognition_knn.py8-16 examples/facerec_ipcamera_knn.py8-16
来源: examples/face_recognition_knn.py46-150 examples/facerec_ipcamera_knn.py46-150
KNN 分类器需要特定的目录结构来进行训练数据
每个子目录的名称用作其中所有图像的标签(人物姓名)。
来源: examples/face_recognition_knn.py54-68 examples/facerec_ipcamera_knn.py54-68
该库提供了一个 train 函数,该函数
train 函数的关键参数
| 参数 | 类型 | 描述 |
|---|---|---|
| train_dir | 字符串 | 包含按人物分组的训练图像的目录 |
| model_save_path | 字符串 | (可选) 保存训练模型的路径 |
| n_neighbors | int | (可选) KNN 的邻居数量,默认为 sqrt(n) |
| knn_algo | 字符串 | (可选) KNN 的算法,默认为 'ball_tree' |
| verbose | bool | (可选) 是否打印详细信息 |
来源: examples/face_recognition_knn.py46-108 examples/facerec_ipcamera_knn.py51-113
预测过程使用训练好的 KNN 模型来识别新图像中的面孔
predict 函数的关键参数
| 参数 | 类型 | 描述 |
|---|---|---|
| X_img_path 或 X_frame | string/array | 要分析的图像路径或图像数组 |
| knn_clf | 对象 | (可选) 训练好的 KNN 分类器对象 |
| model_path | 字符串 | (可选) 已保存的 KNN 模型路径 |
| distance_threshold | 浮点数 | (可选) 匹配的最大距离,默认为 0.6 |
来源: examples/face_recognition_knn.py111-150 examples/facerec_ipcamera_knn.py116-150
基础 KNN 示例(examples/face_recognition_knn.py) 演示了
IP 摄像头示例(examples/facerec_ipcamera_knn.py) 演示了
来源: examples/face_recognition_knn.py184-206 examples/facerec_ipcamera_knn.py190-214
训练函数使用 scikit-learn 创建 KNN 分类器
实现中的关键一行是
knn_clf = neighbors.KNeighborsClassifier(n_neighbors=n_neighbors, algorithm=knn_algo, weights='distance')
knn_clf.fit(X, y)
这创建了一个 KNN 分类器,该分类器在投票过程中更看重较近的邻居。
来源: examples/face_recognition_knn.py99-106 examples/facerec_ipcamera_knn.py104-111
预测过程包含以下关键步骤
关键行是
closest_distances = knn_clf.kneighbors(faces_encodings, n_neighbors=1)
are_matches = [closest_distances[0][i][0] <= distance_threshold for i in range(len(X_face_locations))]
这会获取每个面孔到最近邻居的距离,并应用阈值来确定面孔是否匹配。
来源: examples/face_recognition_knn.py146-150 examples/facerec_ipcamera_knn.py146-150
邻居数量:默认是 sqrt(n),其中 n 是训练样本的数量,但您可以根据您的具体数据集进行调整。
处理频率:对于实时应用,请考虑仅处理部分帧(例如,每 30 帧)以提高性能。
图像缩放:在处理之前缩放大型图像以提高速度。
距离阈值:调整 distance_threshold 参数(默认为 0.6)以平衡
要使用 KNN 功能,您需要安装额外的依赖项
pip install scikit-learn
pip install numpy
pip install opencv-contrib-python # For camera examples
来源: examples/face_recognition_knn.py28-30 examples/facerec_ipcamera_knn.py28-32
KNN示例建立在核心 face_recognition API 函数之上
load_image_file:用于加载用于训练和测试的图像face_locations:用于在图像中检测人脸face_encodings:用于从人脸提取特征向量这些核心函数通过 KNN 特有的功能进行了扩展,用于对大量已知人员进行分类。
来源: examples/face_recognition_knn.py43-44 examples/facerec_ipcamera_knn.py43-44