4

我正在做一个项目,我应该设计一个应用程序来检测路过的人的所有面孔......我有一个非常大的数据库,其中包含几个已知的人......我已经使用 EigenObjectRecognizer 来识别图像网络摄像头捕获的帧......但问题是有时它会错误地识别某些人......所以如果得到这个面部匹配的置信度值......那么我可以编写一个条件循环,如果它大于 75 %,那就只检测他,否则不要。另外我知道基于PCA的识别是基本的,我一定会继续研究其他新算法。但是由于项目的截止日期,我应该尽快提交......所以请告诉我如何获得此 EigenObjectRecognizer 面部识别的置信度值....

4

1 回答 1

7

没有确切的置信度值,但是可以使用可变尺度并大致解释为特征距离。

分类为良好匹配的值会根据您拥有的数据量和训练参数而变化,因此您必须使用不同的面孔测试这些值以计算出您的阈值。

您必须向 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;

希望这可以解决问题,

干杯,

克里斯

于 2012-02-27T14:25:15.680 回答