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

Java 如何使用opencv计算人脸识别的百分比格式预测置信度?,java,c++,opencv,javacv,face-recognition,Java,C++,Opencv,Javacv,Face Recognition,我正在使用LBP类型的OpenCV人脸识别器进行两张脸的比较工作。我的问题是如何计算预测置信度的百分比?给出以下代码(javacv): 但是置信度是一个双值,我应该如何将它转换成概率的百分比%值? 是否存在现有的公式 对不起,如果我没有把我的问题说清楚。好的,下面是场景: 我想比较两张人脸图像,得出两张人脸的相似性,例如输入John的照片和他的同学Tom的照片,假设相似性为30%;然后输入约翰的照片和他哥哥杰克的照片,得到的概率是80%。 这两个相似性因素表明杰克比汤姆更像他的兄弟约翰。。。所以

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

但是置信度是一个双值,
我应该如何将它转换成
概率的
百分比%
值? 是否存在现有的公式

对不起,如果我没有把我的问题说清楚。好的,下面是场景:

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

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

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

我不知道你在这里寻找什么,但这个问题并不容易回答。人内人脸变化(同一人的变化)很大,人间人脸变化(来自不同人的人脸)可能更紧凑(例如,当两张脸都在前面,而人内第二张人脸图像是轮廓时),因此这是一个需要答案的完整主题

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

编辑:

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

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

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

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

希望有帮助

编辑2:

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

  • 绝对匹配有一个值,即
    dis=0或等效相似性为
    sim=100%
    ,但对于总不匹配没有明确的值:
    dis=infinite
    so
    sim=0%
    。另一方面,反向进度有明确的边界
    0%-100%
  • 由于极值包括0和无穷大,因此必须进行比简单反演更聪明的转换
您可以很容易地将对应于绝对匹配的
1.0
(或
100%
分配给相似度),但您要将什么视为总不匹配尚不清楚。你可以考虑任意高的值作为<代码> 0 <代码>(因为你没有很大的区别,例如在使用距离10000到11000,我猜)和所有的值高于这个(距离值是)被认为是代码> 0 < /代码> 为了找到应该是哪个值,我建议比较两个完全不同的图像,并使用它们之间的距离为0.0

假设该值为
disMax=250.0
simMax=100.0
那么一个简单的方法就是:
双sim=simMax-simMax/DISAX*dis


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

双精度值代表什么?它的比例是多少?可能是@EdChum的重复项双值置信度应该是从opencv识别器中获取的距离值。predict()函数。@blgt是的,我要寻找的是,如果是LBP类型识别器,则该公式是您引用的链接。对于LBP,它可能类似于:100.0*distance/(gridx*gridy*256)比@Eypros,我刚刚更新了我的问题,希望能清楚地说明我的问题。谢谢你的建议,看起来很有意义。但是你假设simValue和distanceValue是线性的,这总是正确的吗?我想不是,但这是一个简单的方法。如果你有证据表明,这是应该遵循其他关系,然后遵循这个。但如果你不这样做,我建议你坚持线性。
int n[] = new int[1];
double p[] = new double[1];
personRecognizer.predict(mat, n, p);
int confidence = p[0];