2

我正在尝试找到两张面孔相似度的度量。我使用 OpenCV。为此,我用 1000 个不同人的 1000 张照片训练 Eigenfaces / Fisherfaces(所以每个人 1 张照片)。所以我在训练集中也有 1000 个标签。

现在我可以使用预测方法来获得最相似的人脸。

我想输入 2 个未知的人脸图像,以查找它们是否都与训练集中的相同人脸向量相似。

这是返回最相似标签(距离最短)的 openCV 代码。

for(size_t sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) {
    double dist = norm(_projections[sampleIdx], q, NORM_L2);
    if((dist < minDist) && (dist < _threshold)) {
        minDist = dist;
        minClass = _labels.at<int>((int)sampleIdx);
    }

问题:

  1. 谁能告诉我如何重写它以输出前 10 个面孔而不仅仅是前 1 个?我正在考虑将它们推入优先队列,但也许有更简单的方法?!

  2. 在训练中:我应该把所有的脸都放在同一个标​​签上还是放在不同的标签上?那么我应该有 1 个标签还是 1000 个?

干杯

4

2 回答 2

2

这就是我所做的。注意我非常擅长 perl,非常擅长 C++(事实上,这是我的第一个 c++ 项目!)所以我向命令行输出了很多内容并用 perl 解析它。

我像你一样去了 facerec.cpp,我将 for 循环的内容更改为:

for(size_t sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) {
    double dist = norm(_projections[sampleIdx], q, NORM_L2);
    int labelClass = _labels.at<int>((int)sampleIdx);
    cout << dist << " " << labelClass << endl;
    if((dist < minDist) && (dist < _threshold)) {
        minDist = dist;
        minClass = _labels.at<int>((int)sampleIdx);
    }
}

现在输出每个人脸的距离和标签。由于 predict 函数似乎所做的只是拍摄距离最短(数字最小)的图片并将其作为答案返回,因此您现在可以获取结果列表,对其进行排序,然后获取前 10 个结果。或者你可以取前十个标签或其他什么。这只是让您可以访问所有数据,而不是第一个 X 结果。

我还添加了

#include <iostream>

using namespace std;

到文件的顶部,这样我就可以使用 cout.

于 2013-03-26T07:32:18.380 回答
0

Q1:: 由于 OpenCV 不提供默认功能,您必须通过创建具有距离和标签的向量来创建自己的功能。您可以如下编写自己的函数,并将距离和标签存储在向量中。这里需要重建opencv。

virtual void predict(InputArray src, int &label, double &confidence,  Vector <variable>) const = 0;
于 2013-01-22T12:21:07.570 回答