我正在尝试找到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);
}
问题:
有谁能告诉我如何重写这个以输出前10个面而不仅仅是前1个?我正在考虑将它们推入优先队列,但也许有更容易的东西?!
在培训中:我应该将所有面孔放在同一标签上还是放在不同的标签上?我应该有1个标签还是1000个?
干杯
答案 0 :(得分:1)
这就是我的所作所为。注意我非常擅长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);
}
}
现在输出每张脸的距离和标签。由于所有预测功能似乎都是以最短距离(最小数字)拍摄并将其作为答案返回,因此您现在可以获取结果列表,对其进行排序,并获取前10个结果。或者你可以采取前十个标签或其他。这只是让您访问所有数据而不是前X个结果。
我还添加了
#include <iostream>
using namespace std;
到文件的顶部,所以我可以使用cout。
答案 1 :(得分:0)
Q1 ::由于OpenCV不提供默认功能,您必须通过创建具有距离和标签的矢量来创建自己的功能。您可以按如下所示编写自己的函数,并将距离和标签存储在矢量中。在这里,您需要重建opencv。
virtual void predict(InputArray src, int &label, double &confidence, Vector <variable>) const = 0;