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

How to calculate percentage format prediction confidence of face recognition using opencv?

本文关键字:格式 百分比 opencv 何使用 计算 人脸识别      更新时间:2023-10-16

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

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

但置信度是一个双值,how应该将convert转换为probabilitypercentage %值吗?是否存在现有公式?

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

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

你的问题太深了。根据OpenCV文档:predict()

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

我不确定你在这里找什么,但这个问题真的不容易回答。人内面部变化(同一个人的变化)是巨大的,而人间面部变化(来自不同人的面部)可以更紧凑(例如,当两个面部都正面,而人内第二个面部图像是轮廓时),所以这是一个期待答案的整个主题。

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

编辑:

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

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

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

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

希望它能有所帮助。

编辑2:

好吧,既然你想把你得到的距离转换成用百分比表示的相似性,你可以以某种方式反转距离来得到相似性。不过,这里也出现了一些问题:

  • 绝对匹配有一个值,即dis = 0;,或者等效地相似性是sim = 100%,但完全不匹配没有明确的值:dis = infinite所以sim = 0%。另一方面,逆过程具有明确的边界CCD_ 13
  • 由于极值包括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。