有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在使用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把它转换成percentage %probability值吗? 是否存在现有的公式

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

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


共 (1) 个答案

  1. # 1 楼答案

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

    Predicts a label and associated confidence (e.g. distance) for a given input image

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

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

    编辑:

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

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

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

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

    希望有帮助

    编辑2:

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

    • 绝对匹配有一个值,即dis = 0;或等效相似性为sim = 100%,但总不匹配没有明确的值:dis = infinitesosim = 0%。另一方面,反向进程有明确的边界0% - 100%
    • 由于极值包括0和无穷大,因此必须进行比简单反演更聪明的转换

    您可以很容易地将1.0(或100%分配给相似性)对应于绝对匹配,但您将要将什么视为总不匹配尚不清楚。你可以考虑任意高的值作为^ {< CD9> }(因为你没有很大的区别,例如在使用10000到11000的距离,我猜)和所有的值都高于这个(被认为是距离值){{CD9}}。

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

    让我们假设这个值是disMax = 250.0;simMax = 100.0; 那么一个简单的方法就是: 双sim=simMax-simMax/DISAX*dis

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