计算机视觉-寻找相似面孔的算法



我正在做一个个人项目,试图在一个数据库中找到一个人的相似之处,这些照片都是以一致的方式拍摄的——人们直视镜头,表情中立,没有倾斜头部(想想护照照片)。

我有一个系统,用于在面部上放置2d坐标标记,我想知道是否有任何已知的方法可以找到给定这种方法的面部外观相似?

我发现了以下面部识别算法:http://www.face-rec.org/algorithms/

但是没有一个处理寻找相似的特定任务。

感谢您的宝贵时间。

我相信你也可以尝试搜索"人脸验证"而不仅仅是"人脸识别"。这可能给你更多相关的结果。

严格来说,这两者在科学文献中实际上是不同的东西,但有时被归为面部识别。有关它们的差异和一些示例代码的详细信息,请查看这里:http://www.idiap.ch/~marcel/labs/faceverif.php

然而,对于你的目的,其他人如爱德华和阿里的善意建议也会起作用。基本上,他们提出了一个k近邻式的人脸识别分类器。首先,你可以尝试一下。首先,为数据库中的每张人脸图像计算一个特征向量。一个可能使用的特性是局部二进制模式(LBP)。你可以通过谷歌搜索找到代码。对您的查询图像执行相同的操作。现在,循环遍历所有特征向量,并使用欧几里德距离将它们与查询图像的特征向量进行比较,并返回最近的K个特征向量。

虽然上面的方法很容易编码,但它通常不会像一些更复杂的方法那样健壮,因为它们通常在面部未对齐时严重失败(称为无约束姿势)。搜索"野外有标签的面孔",查看这个问题的最新进展)或在不同环境条件下拍摄的结果。但是,如果您的数据库中的面孔是在您提到的类似条件下对齐和采取的,那么它可能只是工作。如果它们没有对齐,您可以使用您提到的能够计算的面关键点来对齐面。一般来说,比较不对齐的人脸是计算机视觉中一个非常困难的问题,也是一个非常活跃的研究领域。但是,如果你只考虑看起来相似且姿势相同的脸是相似的(即姿势和外观相似),那么这应该不是一个问题。

你给的网站有链接到特征面和渔场的代码。这基本上是计算面部图像特征向量的两种方法。通过使用与查询图像最接近的特征向量(分别使用PCA和LDA计算)对数据库中的人脸进行K近邻搜索来识别人脸。

我可能还应该提到,在fishfaces方法中,您将需要为数据库中的面部提供"标签"以识别面部。这是因为在fishfaces中使用的分类方法线性判别分析(LDA)需要这些信息来计算一个投影矩阵,该矩阵将为相近的人脸和相距较远的人脸投影特征向量。然后对这些投影向量进行比较。这就是人脸识别和人脸验证之间的区别:为了识别,你需要在数据库中"标记"你的训练图像,即你需要识别它们。为了验证,你只需要判断任意两张给定的脸是否来自同一个人。通常,您不需要传统意义上的"标记"数据(尽管有些方法可能会使用辅助训练数据来帮助进行人脸验证)。

计算特征面和渔场面的代码在OpenCV中可用,如果你使用它。

作为旁注:特征向量实际上就是线性代数意义上的向量。它只是n个数字组合在一起。"特征"一词指的是类似于"统计"的东西,即特征向量是包含表征其所代表对象的统计信息的向量。例如,对于人脸识别任务,最简单的特征向量就是人脸灰度图像的强度值。在这种情况下,我只是将2D数字数组重塑为n行乘1列的向量,每个条目包含一个像素的值。这里的像素值就是"feature",像素值的n × 1向量就是feature向量。在LBP的情况下,粗略地说,它在图像中的小块像素处计算直方图,并将这些直方图连接在一起成为一个直方图,然后将其用作特征向量。因此,局部二值模式是统计量,直方图连接在一起是特征向量。他们一起描述了你脸部的"纹理"和面部模式。

这两个问题似乎是等价的,但我不在这个领域工作。你基本上有以下两个问题:

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

  2. 查找相似的面孔:选取一张面孔并尝试查找相似的面孔。

这些不是相等的吗?在(1)中,你从一张你想要与主人匹配的照片开始,并将其与你认识的每个人的参考照片数据库进行比较。在(2)中,您从参考数据库中选择一张图片,并对数据库中的其他图片运行(1)。

由于算法似乎给了你两张照片属于同一个人的可能性的度量,在(2)中,你只需按降序对度量进行排序并选择最热门的。

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

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

相关内容

  • 没有找到相关文章

最新更新