【问题标题】:How to calculate percentage format prediction confidence of face recognition using opencv?如何使用opencv计算人脸识别的百分比格式预测置信度?
【发布时间】:2014-10-30 06:25:29
【问题描述】:

我正在使用OpenCV FaceRecognizerLBP 类型进行两面比较工作。我的问题是如何计算百分比格式预测置信度?给出以下代码(javacv):

int n[] = new int[1];
double p[] = new double[1];
personRecognizer.predict(mat, n, p);
int confidence = p[0];

但是置信度是一个双值,how 我应该将convert 它转换成percentage %probability 值吗? 有现成的公式吗?

抱歉,如果我没有清楚地说明我的问题。好的,这是场景:

我想比较两张人脸图像,得到两张人脸的相似度,例如输入约翰的照片和他同学汤姆的照片,假设相似度为30%;然后输入约翰的照片和他哥哥杰克的照片,可能性是80%。 这两个可能性因子表明杰克比汤姆更像他的兄弟约翰......所以百分比格式的可能性因子是我想要的,值越大意味着两个输入面的可能性越大。 目前我通过使用opencv函数FaceRecognizer.predict计算输入的置信度值来做到这一点,但置信度值实际上代表其特征向量空间中输入之间的距离,所以我如何将距离(置信度)缩放为可能性百分比格式?

【问题讨论】:

  • double值代表什么?它的规模是多少?
  • @EdChum 双值置信度应该是从 opencv Recognizer.predict() 函数得到的距离值。
  • @blgt 是的,我正在寻找的是作为 LBP 类型识别器引用的链接的公式。
  • 对于 lbp 它可能是:100.0 * distance / (gridx*gridy*256)

标签: java c++ opencv javacv face-recognition


【解决方案1】:

您的问题挖掘得太深了。好吧,根据 OpenCV 文档: predict()

预测给定标签和相关置信度(例如距离) 输入图像

我不确定您在这里寻找什么,但这个问题并不容易回答。人脸变体(同一个人的变体)很大,而人脸变体(来自不同人的脸)可以更紧凑(例如,当两个人脸都在前面,而人内第二张人脸图像是侧面时),所以这是一个期待答案的完整主题。

您可能应该有一个基本事实(即一些带有已知标签的面孔)并从中扣除您想要将距离与标签相关联的百分比。尽管这通常也不准确,因为距离与您对相似性的感知不一致(如前所述,人与人之间的面孔可能会有很大差异)。

编辑:

首先,人脸相似度没有普遍的人类感知。另一方面,大多数人会以各种姿势和姿势识别出属于同一个人的脸。 大部分字在这里很重要。当您向极限施加压力时,人类的感知将开始发散,例如多年来,当被要求识别一张脸时,时间跨度变得相当大(儿童 vs 青春期 vs 老人)。

您要计算鼻子/眼睛等的相似度吗?如果是这样,我认为最好的方法是找到一组属于同一个人的鼻子/眼睛并对其进行训练,然后检查您在与不同人不同的一组上的表现。

据我所知,通常的方法是使用包含正样本和负样本的图像对进行训练和测试。正样本是属于同一个人的一对图像,而负样本是属于两个不同人的图像对。

我不确定你到底在问什么,所以也许你可以看看这个link

希望对您有所帮助。

编辑 2:

好吧,既然您想将获得的距离转换为以百分比表示的相似度,您可以以某种方式反转距离以获得相似度。但是这里出现了一些问题:

  • 有一个绝对匹配值,即dis = 0; 或等效相似性为sim = 100%,但没有明确的完全不匹配值:dis = infinite 所以sim = 0%。另一方面,逆进度有明确的界限0% - 100%
  • 由于极值包括 0 和无穷大,因此必须进行比简单反转更智能的转换。

您可以轻松地将1.0(或100% 分配给相似性)对应于绝对匹配,但您将把什么视为完全不匹配尚不清楚。您可以将任意高值视为0.0(因为您没有太大区别,例如使用距离 10000 到 11000 我猜)并且所有高于此的值(即距离值)都被视为0.0

要找到应该是哪个值,我建议比较两个完全不同的图像并将它们之间的距离用作 0.0。

假设这个值为disMax = 250.0;simMax = 100.0; 那么一个简单的方法可能是: 双 sim = simMax - simMax/disMax*dis;

对于 0 距离给出 100.0 的相似性,对于 250 距离给出 0.0。大于 250 的值将给出负相似度值,应将其视为 0.0。

【讨论】:

  • 比@Eypros,我刚刚更新了我的问题,希望能清楚地说明我的问题。
  • 感谢您的建议,这似乎是有道理的。但是您假设 simValue 与 distanceValue 成线性关系,这总是正确的吗?
  • 我猜不是,但这是一种简单的方法。如果您有证据表明应该遵循其他关系,请遵循此。但如果你不这样做,那么我建议坚持使用线性。
猜你喜欢
  • 2017-05-03
  • 2014-06-14
  • 2017-09-06
  • 2012-07-04
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 2015-07-05
  • 2015-01-11
相关资源
最近更新 更多