菜单

KNN分类

相关源文件

目的与范围

本文档介绍了 face_recognition 库中提供的 K-近邻 (KNN) 分类功能。它涵盖了当您需要从大量已知个体中识别面孔时如何使用 KNN 进行面部识别。KNN 在准确性和性能之间取得了良好的平衡,尤其是在处理许多已知面孔时。

有关不使用 KNN 的基本面部识别的信息,请参阅 基本面部识别。有关实时识别技术,请参阅 实时识别

来源: examples/face_recognition_knn.py1-16 examples/facerec_ipcamera_knn.py1-16

什么是 KNN 分类?

K-近邻是一种简单但有效的机器学习算法,用于分类。在面部识别的背景下

  1. 该算法首先在标记的(已知的)人脸数据集上进行训练
  2. 对于要识别的每一张新面孔,它会在训练集中查找 K 个最相似的面孔
  3. 它对这 K 个邻居进行多数投票以确定身份
  4. 使用距离阈值来判断一张面孔是否为“未知”

face_recognition 库中的实现使用加权投票系统,其中较近的邻居(具有更相似特征的面孔)对最终预测的影响更大。

来源: examples/face_recognition_knn.py8-16 examples/facerec_ipcamera_knn.py8-16

face_recognition 库中的 KNN 工作流程

KNN 架构图

来源: 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 函数,该函数

  1. 处理训练目录结构中的每个图像
  2. 提取每个图像的面部编码
  3. 创建并训练一个 KNeighborsClassifier

train 函数的关键参数

参数类型描述
train_dir字符串包含按人物分组的训练图像的目录
model_save_path字符串(可选) 保存训练模型的路径
n_neighborsint(可选) KNN 的邻居数量,默认为 sqrt(n)
knn_algo字符串(可选) KNN 的算法,默认为 'ball_tree'
verbosebool(可选) 是否打印详细信息

来源: examples/face_recognition_knn.py46-108 examples/facerec_ipcamera_knn.py51-113

预测过程

预测过程使用训练好的 KNN 模型来识别新图像中的面孔

predict 函数的关键参数

参数类型描述
X_img_path 或 X_framestring/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) 演示了

  1. 使用已知人脸目录训练 KNN 分类器
  2. 使用训练好的模型识别测试图像中的人物
  3. 以视觉方式显示结果

实时 IP 摄像头识别

IP 摄像头示例(examples/facerec_ipcamera_knn.py) 演示了

  1. 训练相同的 KNN 分类器
  2. 将其应用于 IP 摄像头的实时视频流
  3. 以较低的速率处理帧以提高性能(每 30 帧)
  4. 显示带有标签的已识别面孔

来源: 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

预测实现

预测过程包含以下关键步骤

  1. 查找图像中的面孔位置
  2. 获取每张面孔的面部编码
  3. 使用 KNN 模型查找训练集中最相似的面孔
  4. 应用距离阈值以过滤不确定的匹配
  5. 返回带有姓名和面孔位置的预测结果

关键行是

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

最佳实践

性能考量

  1. 邻居数量:默认是 sqrt(n),其中 n 是训练样本的数量,但您可以根据您的具体数据集进行调整。

  2. 处理频率:对于实时应用,请考虑仅处理部分帧(例如,每 30 帧)以提高性能。

  3. 图像缩放:在处理之前缩放大型图像以提高速度。

  4. 距离阈值:调整 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