如何使用opencv计算人脸识别的百分比格式预测置信度?

De *_*eng 3 c++ java opencv face-recognition javacv

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

int n[] = new int[1];
double p[] = new double[1];
personRecognizer.predict(mat, n, p);
int confidence = p[0];
Run Code Online (Sandbox Code Playgroud)

但信心是一个双值,how我应该convert把它变成一个percentage %值吗probability?有现成的公式吗?

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

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

Eyp*_*ros 5

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

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

我不确定您在这里寻找什么,但这个问题并不容易回答。人内脸部变化(同一个人的变化)是巨大的,而人与人之间的脸部变化(来自不同人的脸部)可以更紧凑(例如,当两个人都面对正面而人内第二面部图像是侧面时),所以这是整个话题都期待着答案。

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

编辑:

首先,人类对于人脸相似度并没有普遍的认知。另一方面,大多数人会认出属于同一个人的不同姿势和姿势的面孔。这里的大多数词都很重要。当你施加压力时,人类的感知将开始出现分歧,例如,当被要求多年来识别一张脸时,时间跨度变得相当大(儿童、青少年、老年人)。

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

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

我不确定您到底在问什么,所以也许您可以查看此链接

希望有帮助。

编辑2:

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

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

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

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

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

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