我相信您也可以尝试搜索“人脸验证”而不仅仅是“人脸识别”。这可能会为您提供更相关的结果。
严格来说,这两者在科学文献中实际上是不同的东西,但有时会被归为人脸识别。有关它们的差异和一些示例代码的详细信息,请查看此处:http://www.idiap.ch/~marcel/labs/faceverif.php
但是,出于您的目的,Edvard 和 Ari 等其他人提出的建议也可以。基本上,他们建议使用 K-最近邻风格的人脸识别分类器。
首先,您可以尝试一下。首先,为数据库中的每个人脸图像计算一个特征向量。一种可能使用的特性是本地二进制模式 (LBP)。您可以通过谷歌搜索找到代码。对您的查询图像执行相同的操作。现在,遍历所有特征向量,并使用欧几里德距离将它们与查询图像的特征向量进行比较,并返回 K 个最近的特征向量。
虽然上述方法很容易编码,但它通常不如一些更复杂的方法那么健壮,因为当面部未对齐时(称为无约束姿势),它们通常会严重失败。搜索“Labeled Faces in the Wild” “查看此问题的最新结果。)或在不同的环境条件下拍摄。但是,如果您数据库中的人脸是在您提到的类似条件下对齐并拍摄的,那么它可能会起作用。如果它们未对齐,您可以使用您提到的可以计算的面关键点来对齐面。一般来说,比较未对齐的人脸是计算机视觉中的一个非常困难的问题,并且仍然是一个非常活跃的研究领域。但是,如果您只考虑看起来相似且姿势相同的面孔相似(即姿势和外观相似),那么这应该不是问题。
您提供的网站有指向 Eigenfaces 和 Fisherfaces 代码的链接。这些本质上是为您的面部图像计算特征向量的两种方法。通过对数据库中特征向量(分别使用 PCA 和 LDA 计算)最接近查询图像的人脸进行 K 最近邻搜索来识别人脸。
我可能还应该提到,在 Fisherfaces 方法中,您需要为数据库中的人脸添加“标签”来识别人脸。这是因为线性判别分析 (LDA),Fisherfaces 中使用的分类方法,需要这些信息来计算一个投影矩阵,该矩阵将为靠近在一起的相似面孔和相距很远的不同面孔投射特征向量。然后对这些投影向量进行比较。这就是人脸识别和人脸验证之间的区别:为了识别,您需要在数据库中为您的训练图像添加“标签”,即您需要识别它们。
为了验证,您只是试图判断任何 2 个给定的面孔是否属于同一个人。通常,您不需要传统意义上的“标记”数据(尽管某些方法可能会利用辅助训练数据来帮助进行人脸验证)。
OpenCV 中提供了计算 Eigenfaces 和 Fisherfaces 的代码,以备不时之需。
附带说明:
特征向量实际上只是线性代数意义上的向量。它只是将 n 个数字打包在一起。 “特征”一词指的是类似于“统计”的东西,即特征向量是包含表征其所代表对象的统计数据的向量。例如,对于人脸识别任务,最简单的特征向量将是人脸灰度图像的强度值。在这种情况下,我只是将二维数字数组重塑为 n 行 x 1 列向量,每个条目包含一个像素的值。这里的像素值就是“特征”,像素值的n×1向量就是特征向量。在 LBP 的情况下,粗略地说,它在图像中的小块像素处计算直方图,并将这些直方图连接在一起形成一个直方图,然后将其用作特征向量。所以局部二进制模式是统计量,连接在一起的直方图是特征向量。他们一起描述了您脸部的“纹理”和面部图案。
希望这会有所帮助。