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 楼答案
你的问题太深奥了。根据OpenCV文档:
predict()
我不知道你在这里寻找什么,但这个问题并不容易回答。人内人脸变化(同一人的变化)很大,人间人脸变化(来自不同人的人脸)可能更紧凑(例如,当两张脸都在前面,而人内第二张人脸图像是轮廓时),因此这是一个需要答案的完整主题
可能您应该有一个基本事实(即,一些带有已知标签的面),并从该集合中扣除您希望将距离与标签关联的百分比。虽然这也常常是不准确的,因为距离与你对相似性的感知不一致(正如前面提到的,人与人之间的面孔可能会有很大的差异)
编辑:
首先,人类对面孔相似性的感知并不普遍。另一半,大多数人会在不同的姿势和姿势下认出属于同一个人的脸<这里的大多数单词都很重要。当你对极限施加压力时,人类的感知将开始分化,例如,当多年来被要求识别一张脸时,时间跨度变得相当大(儿童、青少年和老人)
您要求计算鼻子/眼睛等的相似性?如果是这样的话,我认为最好的方法是找到属于同一个人的一组鼻子/眼睛,并进行训练,然后检查你在不同不同人的另一组上的表现
据我所知,通常的方法是使用包含阳性和阴性样本的成对图像进行训练和测试。阳性样本是属于同一个人的一对图像,而阴性样本是属于两个不同的人的一对图像
我不确定你到底在问什么,所以也许你可以看看这个link
希望有帮助
编辑2:
既然你想把你得到的距离转换成一个以百分比表示的相似性,那么你可以通过某种方式反转距离来得到相似性。不过,这里出现了一些问题:
dis = 0;
或等效相似性为sim = 100%
,但总不匹配没有明确的值:dis = infinite
sosim = 0%
。另一方面,反向进程有明确的边界0% - 100%
李>您可以很容易地将
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