Как получить значение доверия в распознавании лиц с помощью EMGU CV? - PullRequest
4 голосов
/ 27 февраля 2012

Я работаю над проектом, в котором я должен разработать приложение, которое может распознавать все лица проходящих мимо людей ... У меня очень большая база данных, состоящая из нескольких известных людей ... Я использовал EigenObjectRecognizer для распознать кадр изображения, снятый веб-камерой ... Но проблема в том, что иногда он неправильно распознает некоторых людей .... Так что, если получить достоверность этого совпадения лица ... Тогда я могу написать условный цикл, чтобы, если это больше чем 75%, тогда только обнаруживают его, иначе не делают. Также я знаю, что основанное на PCA распознавание является основным, я определенно перейду к другим новым алгоритмам. Но из-за крайнего срока проекта, я должен представить его быстро .. .. Так скажите, пожалуйста, как получить значение достоверности распознавания лица EigenObjectRecognizer ....

1 Ответ

7 голосов
/ 27 февраля 2012

Точного значения достоверности нет, однако существует переменная шкала, которую можно использовать и грубо интерпретировать как таковую, которая является Собственным расстоянием.

Значение, которое классифицируется как хорошее совпадение, изменяется в зависимости от количества имеющихся у вас данных и параметров обучения, поэтому вам придется проверять значения с разными лицами, чтобы определить свой порог.

Вам нужно будет добавить функцию в класс Eigen, чтобы получить это значение.Сначала мы перезапишем используемый нами EigenObjectRecognizer.Это действительно просто - заархивируйте файл EigenObjectRecognizer.cs, он находится в установочном каталоге \ EMGU \ Emgu.CV, или где бы вы ни распаковали файлы, вы должны иметь возможность скрыть его, так как он находится в той же папке, что и папка bin со всемииспользуемые вами .dll.

Добавьте файл в проект, щелкнув правой кнопкой мыши имя проекта в обозревателе решений в Visual Studion и выбрав Добавить> Существующий элемент ... Перейдите к файлу и добавьте его.Ваш проект будет автоматически использовать это, а не тот, который содержится в 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;

Вы можете удалить с плавающей точкой eigenDistance;строка, но я хотел бы убедиться, что она перезаписана значением, которое я могу наблюдать за ошибкой, поскольку она всегда должна быть положительной, если распознавание применено правильно.Вы заметите, что следующий раздел кода содержит:

FindMostSimilarObject(image, out index, out eigenDistance, out label);
  • index
  • eigenDistance
  • label

Все выходыдоступны для использования с небольшим дополнительным кодированием.

Нам не нужно указывать переменную распознавателя Eigen на запись:

Emgu.Custom.EigenObjectRecognizer recognizer;

Теперь мы можем получить EigenDistance с помощью этого вызова функции:

float EigenDistance = recognizer.GetEignenDistance;

Надеюсь, это прояснит ситуацию,

Приветствия,

Крис

...