我正在做一个项目,我应该设计一个应用程序来检测路过的人的所有面孔......我有一个非常大的数据库,其中包含几个已知的人......我已经使用 EigenObjectRecognizer 来识别图像网络摄像头捕获的帧......但问题是有时它会错误地识别某些人......所以如果得到这个面部匹配的置信度值......那么我可以编写一个条件循环,如果它大于 75 %,那就只检测他,否则不要。另外我知道基于PCA的识别是基本的,我一定会继续研究其他新算法。但是由于项目的截止日期,我应该尽快提交......所以请告诉我如何获得此 EigenObjectRecognizer 面部识别的置信度值....
1 回答
没有确切的置信度值,但是可以使用可变尺度并大致解释为特征距离。
分类为良好匹配的值会根据您拥有的数据量和训练参数而变化,因此您必须使用不同的面孔测试这些值以计算出您的阈值。
您必须向 Eigen 类添加一个函数才能获得该值。首先,我们将覆盖我们使用的 EigenObjectRecognizer。这真的很简单,找到文件 EigenObjectRecognizer.cs,它位于 \EMGU 安装目录 \Emgu.CV 或者您提取文件的任何位置,您应该能够将其定位,因为它与 bin 文件夹位于同一个文件夹中您使用的 .dll。
通过在 Visual Studion 的解决方案资源管理器中右键单击项目名称并选择 Add>Existing Item... 将文件添加到您的项目中。导航到文件并添加它。您的项目将自动使用它,而不是在您的参考文献中使用 EMGU.CV.dll 保存的那个。
现在在您的项目中打开 EigenObjectRecognizer.cs,不要担心它是原始的副本,因此您所做的任何更改都不会影响原始源。首先,按住 Ctrl 键,然后按 m 键,然后按 o 键使事情变得更容易,这将折叠所有方法字段。
首先,我们需要覆盖我称为 Emgu.Custom 的命名空间。
现在在代码的顶部,在其他变量下面添加以下变量
private float eigenDistance;
将以下方法添加到类中,
/// <summary>
/// Get the calculated Eignen Distance for the last proceessed frame
/// </summary>
public float GetEignenDistance
{
get { return eigenDistance; }
}
你可以把它放在你的任何地方,但显然是在类内和方法外,现在很重要。我们已将 eigenDistance 设为全局,但它是在我们调用 .Recognize(Image image) 方法时私下创建的。
在 EigenObjectRecognizer.cs 中找到此方法并更改
float eigenDistance;
至
eigenDistance = -1;
你可以删除浮动特征距离;行,但我想确保它被一个我可以观察到的错误值覆盖,因为如果正确应用了识别,它应该始终为正。您会注意到以下代码部分包括:
FindMostSimilarObject(image, out index, out eigenDistance, out label);
- 指数
- 特征距离
- 标签
是否所有输出都可以通过一些额外的编码使用。
我们不需要将我们的特征识别器变量指向写一个:
Emgu.Custom.EigenObjectRecognizer recognizer;
我们现在可以通过这个函数调用获得 EigenDistance:
float EigenDistance = recognizer.GetEignenDistance;
希望这可以解决问题,
干杯,
克里斯