寻找相似脸的算法?

7
我正在做一个个人项目,尝试在给定一个一致拍摄方式的其他人的照片数据库中找到一个人的相似之处 - 这些人直接看着镜头,表情中性,头部没有倾斜(类似护照照片)。
我有一个在脸部放置2D坐标标记的系统,想知道是否有任何已知方法可以根据这种方法找到一个人的相似之处?
我发现了以下面部识别算法:http://www.face-rec.org/algorithms/,但是没有一个处理特定任务的查找相似之处。
感谢您的时间。

我怀疑你会找不到任何能做到你想要的事情的算法。你需要想办法确定何时面部“相似”,并构建一个算法来实现这一点。如果你很幸运,用于描述面部的二维坐标网格将成为该算法的核心。 - john_science
3个回答

6
我相信你也可以尝试搜索“人脸验证”而不仅仅是“人脸识别”。这可能会给你更相关的结果。
严格来说,在科学文献中,这两者实际上是不同的东西,但有时被归为人脸识别。有关它们的差异和一些示例代码的详细信息,请参见此处: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的情况下,粗略地说,它在图像的小块像素上计算直方图,并将这些直方图连接成一个直方图,然后将其用作特征向量。因此,本地二进制模式是统计数据,连接在一起的直方图是特征向量。它们一起描述了您脸部的"纹理"和面部模式。

希望这有所帮助。


你能再解释一下特征向量吗?我正在阅读关于向量压缩的内容,那里也需要选择一个颜色的特征向量。 - Micromega
对不起,这是关于反极聚类的问题。我给了某人这个答案:http://stackoverflow.com/questions/13288571/antipole-clustering 因为在反极聚类中,你选择一个由27个RGB值组成的特征向量。这是否意味着你只需要将它们相加?用你的话说是 n x 27 吗?在向量压缩中,我写了一个向量 f(x,y) 是当前像素值 c(x,y) 减去右边的相邻像素 r(x1,y1) 和下方的相邻像素 b(x2,y2)。 - Micromega
@Phpdevpad,我在你的独立帖子中回答了你的问题。希望能有所帮助:)。 - lightalchemist
@user257543 从我的经验来看,我认为在找到最接近的匹配项之后,您可以计算每个补丁(眼睛、鼻子等)之间的相似度,并尝试将该值显示为百分比。为此,也许使用余弦相似度会更合适,您可以将“归一化”向量之间的0度差异视为100%匹配,将90度差异视为0%匹配,尽管我应该强调这更多是一个快速的“hack”,即它不需要在数学意义上对应真实概率。 - lightalchemist
@user257543 你是想要衡量在脸上放置的两组2D标记所描述的形状之间的相似度吗?虽然我对EMD本身不太熟悉,但如果你想比较这些标记,可以尝试在谷歌上搜索MB Steigman的《统计形状分析简介》。它介绍了在引入主动形状模型(ASM)和AAM之前,比较点集的方法,而这两种方法你都可以考虑,因为似乎你的2D标记可能提供了额外的信息。Steigman还有其他文章可供搜索。希望对你有所帮助。 - lightalchemist
显示剩余3条评论

0

这两个问题看起来似乎是相同的,但我不在这个领域工作。您基本上有以下两个问题:

  1. 人脸识别:拍摄一张人脸并尝试将其与人匹配。

  2. 寻找相似的面孔:拍摄一张人脸并尝试找到类似的面孔。

这两个问题不是等价的吗?在(1)中,您从要匹配所有者的图片开始,并将其与您所知道每个人的参考图片数据库进行比较。在(2)中,您选择参考数据库中的一张图片,并针对该图片运行(1),然后针对数据库中的其他图片运行(1)。

由于算法似乎会给出两张图片属于同一人的可能性,因此在(2)中,您只需按照递减顺序对度量值进行排序并选择排名靠前的匹配项即可。


我认为问题不同,在识别任务中,您试图确定哪些其他照片与当前照片匹配,而找到相似的面孔更像是拥有一组照片并尝试根据相似性对它们进行分类。应该有一种更快的方法来完成后者,而不是进行n^2次识别。 - Lie Ryan
嗯,网站上的一些算法似乎计算出可用于分类的某些度量,而其他算法则是通过比较两个图像来工作的。前者可用于预先计算度量以实现更快的分类。 - Edvard Fagerholm
另外,原帖作者并没有指定数据库中包含多少张图片。 - Edvard Fagerholm
即使进行最近邻比较时,也有一些在数据库上进行预处理以加速K最近邻计算的方法,而不会达到O(n^2),例如AESA等。我相信这就是Edvard所指的。此外,还有近似最近邻可以利用以实现更快的搜索,尽管特征向量的维数将发挥作用... - lightalchemist

0

我认为你应该首先使用你正在使用的任何方法分析数据库中的所有图片。然后,你应该有每张图片的一组指标,可以将特定图片与之进行比较,并在统计上找到最接近的匹配。

例如,如果你可以测量眼睛之间的距离,你可以找到具有相同距离的脸部。然后,你可以找到整体最接近的匹配的脸部并返回它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接