【问题标题】:Algorithms for finding a look alike face?寻找相似面孔的算法?
【发布时间】:2016-08-10 01:21:33
【问题描述】:

我正在做一个个人项目,试图找到一个人的相似之处,给定一个以一致方式拍摄的其他人照片的数据库——人们直视相机,表情中性,头部不倾斜(想想护照照片)。

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

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

但没有人处理寻找相似的具体任务。

感谢您的宝贵时间。

【问题讨论】:

  • 我怀疑你会找到任何你想做的算法。您将需要弄清楚如何确定面部何时“看起来相似”并构建一个算法来做到这一点。如果幸运的话,您创建的用于描述人脸的二维坐标网格将成为该算法的核心。

标签: algorithm computer-vision


【解决方案1】:

我相信您也可以尝试搜索“人脸验证”而不仅仅是“人脸识别”。这可能会为您提供更相关的结果。

严格来说,这两者在科学文献中实际上是不同的东西,但有时会被归为人脸识别。有关它们的差异和一些示例代码的详细信息,请查看此处: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 的情况下,粗略地说,它在图像中的小块像素处计算直方图,并将这些直方图连接在一起形成一个直方图,然后将其用作特征向量。所以局部二进制模式是统计量,连接在一起的直方图是特征向量。他们一起描述了您脸部的“纹理”和面部图案。

希望这会有所帮助。

【讨论】:

  • 你能多解释一下特征向量吗?我正在阅读有关矢量压缩的信息,您也需要选择颜色的特征向量。
  • @phpdevpad 我添加了一段来阐明特征向量的部分。我认为对于您的情况,特征向量可能只是包含 RGB 值的 3 x 1 向量,图像中的每个像素为 1。在向量压缩/量化中,您将这些特征向量聚类以形成 K 个集群的码本/字典(通常使用 K 均值),然后将每个像素替换为其最接近的集群的集群中心。希望这会有所帮助。
  • 很抱歉,这是关于反极聚类的。我给了某人这个答案:stackoverflow.com/questions/13288571/antipole-clustering,因为在对极聚类中,您选择了 27 个 rgb 值的特征向量。这是否意味着你只是总结它们?用你的话 n x 27??在矢量压缩中,我写了一个矢量 f(x,y) 是当前像素值 c(x,y) - 右侧的相邻像素 r(x1,y1) 和底部的相邻像素 b(x2,y2) ?
  • @Phpdevpad 我在您的单独帖子中回答了您的问题。希望它有所帮助:)。
  • 非常感谢您的精彩解释!我会试试你的建议。作为后续问题,您知道我如何扩展您的方法以能够解释“为什么”这些面孔相似。例如:前两个结果匹配,因为鼻子相似 80%,眼睛相似 20%,嘴相似 40% 等等。?只是对特征进行分组并对人脸的这些子组进行 k-最近搜索吗?
【解决方案2】:

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

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

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

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

由于算法似乎可以衡量两张照片属于同一个人的可能性,因此在 (2) 中,您只需按降序对衡量标准进行排序,然后选择最热门的照片。

【讨论】:

  • 我认为问题不一样,在识别任务中,你是在尝试识别哪些其他照片与当前照片匹配,而寻找相似的面孔更像是拥有一组照片并试图分类它们基于相似性。应该有一种更快的方法来做后者而不是做n^2 识别。
  • 嗯,网站上的一些算法似乎计算了一些可用于分类的指标,而另一些则通过比较两个图像来工作。前者可用于预先计算指标以加快分类速度。
  • 另一方面,OP 没有指定数据库包含多少图片。
  • @LieRyan 即使在执行最近邻比较时,也有一些方法可以对数据库进行一些预处理以加快 K 最近邻计算而不会达到 O(n^2),例如AESA 等。我相信这就是 Edvard 所指的。此外,虽然特征向量的维数将发挥作用,但仍有近似最近邻可以用于更快的搜索...
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2010-09-09
    • 2012-03-16
    • 2015-02-14
    • 1970-01-01
    • 2012-06-21
    • 2012-04-27
    • 1970-01-01
    • 2012-12-12
    • 2015-06-09
    相关资源
    最近更新 更多