我正在使用OpenCV FaceRecognizer
类型的LBP
进行双面比较工作。我的问题是如何计算百分比格式预测置信度?提供以下代码(javacv
):
int n[] = new int[1];
double p[] = new double[1];
personRecognizer.predict(mat, n, p);
int confidence = p[0];
但信心是双重值,how
我应该convert
将percentage %
值设为probability
吗?
是否有现有公式?
很抱歉,如果我没有以明确的方式陈述我的问题。好的,这是场景:
我想比较两张脸部图像,并得出两张脸的可能性,例如输入约翰的照片和他的同学汤姆的照片,让我们说可能性是30%;然后输入约翰的照片和他的兄弟杰克的照片,可能性是80%。 这两个可能性因素表明,杰克更像是他的兄弟约翰,而不是汤姆...所以百分比格式的可能性因素是我想要的,更多的价值意味着两个输入面的更多可能性。 目前我通过使用opencv函数FaceRecognizer.predict计算输入的置信度值来做到这一点,但置信度值实际上代表了特征向量空间中输入之间的距离,因此如何将距离(置信度)扩展为可能性百分比格式?
答案 0 :(得分:4)
你的问题正在深入挖掘。好吧,根据OpenCV文档:
predict()
预测给定的标签和相关置信度(例如距离) 输入图像
我不确定你在这里找什么,但这个问题并不容易回答。人物内部变形(同一人的变化)是巨大的,并且人际面部变化(来自不同人的面部)可以更紧凑(例如,当面向前面而人体内第二面部图像是轮廓时)所以这是一个期待答案的整个主题。
可能你应该有一个基本的事实(即一些已经知道标签的面孔)并从此设置中扣除你想要将距离与标签相关联的百分比。虽然这也常常是不准确的,因为距离与你的相似性感觉不一致(如人与人之间的面孔差异很大)。
编辑:
首先,人类对面部相似性的看法并不普遍。在另一半,大多数人会认出一个面对各种姿势和姿势的同一个人的脸。 这里的大多数字很重要。当你施加压力时,人类的感知将开始分化,例如:当被要求多年来认出一张脸时,时间跨度变得非常大(儿童与青春期对老人)。
你要求计算鼻子/眼睛等的相似性?如果是这样,我认为最好的方法是找到属于同一个人的一组鼻子/眼睛并对其进行训练,然后在不同的人的不同设置上检查你的表现。
我所知道的常用方法是使用包含正样本和负样本的图像对进行训练和测试。正样本是属于同一人的一对图像,而负片样本是属于两个不同的图像对。
我不确定你究竟在问什么,也许你可以查看link。
希望它有所帮助。
编辑2:
好吧,因为你想要将你得到的距离转换为以百分比表示的相似度,你可以以某种方式反转距离以获得相似性。这里出现了一些问题:
dis = 0;
或等效相似度为sim = 100%
,但没有明确表示总不匹配的值:dis = infinite
所以sim = 0%
。另一方面,逆进展具有明确的边界0% - 100%
。 您可以轻松地将1.0
(或100%
与相似性)分配给绝对匹配,但您要采取的是因为总不匹配不明确。您可以将任意高值视为0.0
(因为您没有太大差异,例如在使用距离10000到11000时我猜)并且所有高于此值的值(即距离值)都要考虑{{1} }。
要找出应该是哪个值,我建议比较两个完全不同的图像,并使用它们之间的距离为0.0。
我们假设此值为0.0
和disMax = 250.0;
然后一个简单的方法可能是:
double sim = simMax - simMax / disMax * dis;
给出0距离的100.0相似度和250距离的0.0。大于250的值将给出负相似度值,应该被视为0.0。