我正在做一个个人项目,试图找到一个人的外观相似的数据库,其他人的照片都以一致的方式拍摄 - 人们直视镜头,中性表情,不倾向于头部(认为护照照片)。
我有一个用于在面部放置二维坐标标记的系统,我想知道是否有任何已知的方法可以找到这种方法看起来像这样的面孔?
我找到了以下面部识别算法: http://www.face-rec.org/algorithms/
但是没有人处理找到相似的具体任务。
感谢您的时间。
答案 0 :(得分:6)
我相信您也可以尝试搜索“面部验证”,而不仅仅是“面部识别”。这可能会为您提供更相关的结果。
严格来说,2在科学文献中实际上是不同的东西,但有时候会被人脸识别。有关它们的差异和一些示例代码的详细信息,请查看此处:http://www.idiap.ch/~marcel/labs/faceverif.php
然而,就你的目的而言,爱德华和阿里等其他人所建议的也会有所帮助。基本上他们建议使用K最近邻风格的人脸识别分类器。 首先,您可以尝试一下。首先,为数据库中的每个面部图像计算特征向量。使用的一个可能的特征是局部二进制模式(LBP)。您可以通过Google搜索找到代码。对查询图像执行相同操作。现在,循环遍历所有特征向量,并使用欧几里德距离将它们与查询图像进行比较,并返回K最近的特征向量。
虽然上面的方法很容易编码,但它通常不会像一些更复杂的方法那样健壮,因为它们通常在面部未对齐时会严重失败(称为无约束姿势。搜索“野外的标记面孔” “看看这个问题的最新技术成果。”或在不同的环境条件下拍摄。但是,如果数据库中的面对齐并在您提到的类似条件下进行,那么它可能正常工作。如果它们未对齐,您可以使用您提到的能够计算的面部关键点来对齐面。通常,比较未对齐的面部是计算机视觉中非常困难的问题,并且仍然是非常活跃的研究领域。但是,如果你只考虑看起来相似并且姿势相似(即姿势和外观相似)的面孔,那么这应该不是问题。
您提供的网站链接到Eigenfaces和Fisherfaces的代码。这些基本上是两种计算脸部图像特征向量的方法。通过对数据库中的面部进行K最近邻搜索来识别面,其中使用最接近查询图像的特征向量(分别使用PCA和LDA计算)。
我可能还应该提到,在Fisherfaces方法中,您需要为数据库中的面具有“标签”以识别面。这是因为线性判别分析(LDA),即Fisherfaces中使用的分类方法,需要这些信息来计算投影矩阵,该投影矩阵将投射相似面部的特征向量并且相距很远。然后对这些投影矢量进行比较。这就是面部识别和面部验证之间的区别:对于识别,您需要在数据库中“标记”您的训练图像,即您需要识别它们。 为了验证,您只是试图判断任何2个给定的面是否属于同一个人。通常,您不需要传统意义上的“标记”数据(尽管某些方法可能会使用辅助训练数据来帮助进行面部验证)。
如果你使用它,可以在OpenCV中使用计算Eigenfaces和Fisherfaces的代码。
作为旁注: 特征向量实际上只是线性代数意义上的向量。它只是n个数字打包在一起。单词“特征”指的是类似“统计”的东西,即特征向量是包含表征其所代表的对象的统计数据的向量。例如,对于面部识别的任务,最简单的特征向量将是面部的灰度图像的强度值。在这种情况下,我只是将2D数组重新整形为n行1列向量,每个条目包含一个像素的值。这里的像素值是“特征”,像素值的n×1矢量是特征向量。在LBP的情况下,粗略地说,它计算图像中小像素块的直方图,并将这些直方图连接成一个直方图,然后将其用作特征向量。因此局部二进制模式是统计数据,并且直方图连接在一起是特征向量。他们一起描述了你脸上的“纹理”和面部图案。
希望这有帮助。
答案 1 :(得分:0)
这两个似乎是同等的问题,但我不在现场工作。你基本上有以下两个问题:
面部识别:取一张脸并尝试将其与一个人匹配。
找到相似的面孔:拿一张脸,试着找到相似的面孔。
这些不等同吗?在(1)中,您从要与所有者匹配的图片开始,并将其与您知道的每个人的参考图片数据库进行比较。在(2)中,您在参考数据库中选择一张图片,然后针对该图片中的其他图片运行(1)。
由于这些算法似乎能够衡量两张图片属于同一个人的可能性,因此在(2)中您只需按降序对这些度量进行排序,然后选择热门点击。
答案 2 :(得分:0)
我假设您应该首先使用您正在使用的方法分析数据库中的所有图片。然后,您应该为每张图片设置一组指标,您可以将这些指标与特定图片进行比较,并在统计上找到最接近的匹配。
例如,如果您可以测量眼睛之间的距离,则可以找到距离相同的面部。然后,您可以找到具有总体最接近匹配的面并返回该面。