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