Question

I am trying to do some facial recognition using EmguCV. I was wondering if I can use EigenObjectRecognizer for this task? Can someone can explain me how to use it? Because if there is a no no-match photo, it also returns a value. Here is an example:

    Image<Gray, Byte>[] trainingImages = new Image<Gray,Byte>[5];  
        trainingImages[0] = new Image<Gray, byte>("brad.jpg");
        trainingImages[1] = new Image<Gray, byte>("david.jpg");
        trainingImages[2] = new Image<Gray, byte>("foof.jpg");
        trainingImages[3] = new Image<Gray, byte>("irfan.jpg");
        trainingImages[4] = new Image<Gray, byte>("joel.jpg");
 String[] labels = new String[] { "Brad", "David", "Foof", "Irfan" , "Joel"}
  MCvTermCriteria termCrit = new MCvTermCriteria(16, 0.001); 

    EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
       trainingImages,
       labels,
       5000,
       ref termCrit);
        Image<Gray,Byte> testImage = new Image<Gray,Byte>("brad_test.jpg");

     String label = recognizer.Recognize(testImage);
     Console.Write(label);

It returns "brad" .But if I change photo in testimage it also returns some name or even Brad.Is it good for face recognition to use this method? Or is there any better method?

Was it helpful?

Solution

I made some practice and found that when it does not found it returns empty string. Changing value 5000 to 1000 it gives more close value but ıf you are usıng web cam your photo for testing and in database must be almost same .

OTHER TIPS

Well, I don't know Emgu Cv, but I think what Robert Harvey says is right. You have to train your neural network. Also, neural networks will always return a result, no matter what. If the result is wrong, it means you haven't trained your network enough.

recognizer.Recognize(testImage) RETURN EigenObjectRecognizer.RecognitionResult

so you can try:

EigenObjectRecognizer.RecognitionResult helo = recognizer.Recognize(result);
Console.Write(helo.lable);

You could overload the Recognize function of Emgu.CV.EigenObjectRecognizer like:

public String Recognize(Image<Gray, Byte> image, out float distance)
      {
          int index;
          float eigenDistance;
          String label;
          FindMostSimilarObject(image, out index, out eigenDistance, out label);
          distance = eigenDistance;
          return (_eigenDistanceThreshold <= 0 || eigenDistance < _eigenDistanceThreshold) ? _labels[index] : String.Empty;
      }

Idea constructed on Overload Snippet from Codeproject

and in this way receive a running last derived distance like

float last_distance =0;
label = recognizer.Recognize(testImage, out last_distance);

This would give you a better idea of the value to put in

MCvTermCriteria termCrit = new MCvTermCriteria(trainingImages.count, 0.001);

EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
                       trainingImages.ToArray(),
                       labels.ToArray(),
                       <<good max val derived from last_distance>>,
                       ref termCrit);

via simply piping it to a label and having a look at the range of values.

3 or 4 thousand maybe...

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top