De *_*eng 3 c++ java opencv face-recognition javacv
OpenCV FaceRecognizer我正在使用类型进行两张面孔的比较工作LBP。我的问题是如何计算百分比格式预测置信度?给出以下代码(javacv):
int n[] = new int[1];
double p[] = new double[1];
personRecognizer.predict(mat, n, p);
int confidence = p[0];
Run Code Online (Sandbox Code Playgroud)
但信心是一个双值,how我应该convert把它变成一个percentage %值吗probability?有现成的公式吗?
抱歉,如果我没有清楚地表达我的问题。好的,这是场景:
我想比较两张人脸图像,得到两张脸的相似度,例如输入约翰的照片和他同学汤姆的照片,假设相似度是30%;然后输入John的照片和他弟弟Jack的照片,得出的可能性是80%。这两个可能性因子表明杰克比汤姆更像他的兄弟约翰......所以百分比格式的可能性因子就是我想要的,值越大意味着两个输入面孔的可能性越大。目前,我通过使用 opencv 函数 FaceRecognizer.predict 计算输入的置信度值来做到这一点,但置信度值实际上代表特征向量空间中输入之间的距离,那么我如何将距离(置信度)缩放到可能性百分比格式?
你的问题挖得太深了。好吧,根据 OpenCV 文档:
predict()
预测给定输入图像的标签和相关置信度(例如距离)
我不确定您在这里寻找什么,但这个问题并不容易回答。人内脸部变化(同一个人的变化)是巨大的,而人与人之间的脸部变化(来自不同人的脸部)可以更紧凑(例如,当两个人都面对正面而人内第二面部图像是侧面时),所以这是整个话题都期待着答案。
也许您应该有一个基本事实(即一些带有已知标签的面孔),并从该集合中扣除您想要将距离与标签关联起来的百分比。尽管这通常也是不准确的,因为距离与您对相似性的感知不一致(正如前面提到的,人与人之间的面孔可能会有很大差异)。
编辑:
首先,人类对于人脸相似度并没有普遍的认知。另一方面,大多数人会认出属于同一个人的不同姿势和姿势的面孔。这里的大多数词都很重要。当你施加压力时,人类的感知将开始出现分歧,例如,当被要求多年来识别一张脸时,时间跨度变得相当大(儿童、青少年、老年人)。
您要求计算鼻子/眼睛等的相似度?如果是这样,我认为最好的方法是找到一组属于同一个人的鼻子/眼睛并对其进行训练,然后检查您在不同人的不同组上的表现。
据我所知,通常的方法是使用包含正样本和负样本的图像对进行训练和测试。正样本是属于同一个人的一对图像,而负样本是属于两个不同人的图像对。
我不确定您到底在问什么,所以也许您可以查看此链接。
希望有帮助。
编辑2:
好吧,由于您想将获得的距离转换为以百分比表示的相似度,因此您可以通过某种方式反转距离来获得相似度。但这里出现了一些问题:
dis = 0;或等效相似度是sim = 100%,但没有明确的完全不匹配值:dis = infiniteso sim = 0%。另一方面,逆进展有明确的界限0% - 100%。您可以轻松分配1.0(或100%相似性)对应于绝对匹配,但您将采取什么作为完全不匹配尚不清楚。您可以将任意高值视为0.0(因为我猜使用距离 10000 到 11000 没有太大差异),并且所有高于此值(即距离值)的值都将被考虑0.0。
为了找到应该是哪个值,我建议比较两个完全不同的图像并将它们之间的距离设置为 0.0。
假设这个值为 ,disMax = 250.0;那么simMax = 100.0;
一个简单的方法可以是: double sim = simMax - simMax/disMax*dis;
对于 0 距离,相似度为 100.0;对于 250 距离,相似度为 0.0。大于 250 的值将给出负相似度值,应将其视为 0.0。
| 归档时间: |
|
| 查看次数: |
7930 次 |
| 最近记录: |