6 Stimmen

EigenObjectRecognizer verwenden

Ich versuche, eine Gesichtserkennung mit EmguCV durchzuführen. Ich habe mich gefragt, ob ich EigenObjectRecognizer für diese Aufgabe verwenden kann? Kann mir jemand erklären, wie man es benutzt? Denn wenn es keine no-match Foto gibt, gibt es auch einen Wert zurück. Hier ist ein Beispiel:

    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);

Aber wenn ich das Foto in testimage ändere, wird auch ein Name oder sogar Brad zurückgegeben. ist es gut für die Gesichtserkennung, diese Methode zu verwenden? Oder gibt es eine bessere Methode?

1voto

Ercan Punkte 2659

Ich habe ein wenig geübt und festgestellt, dass es eine leere Zeichenkette zurückgibt, wenn es nicht gefunden wird. Wenn man den Wert 5000 auf 1000 ändert, kommt man dem Wert näher, aber wenn man eine Webcam benutzt, muss das Foto in der Datenbank fast gleich sein.

0voto

Run CMD Punkte 2709

Nun, ich kenne Emgu Cv nicht, aber ich denke, was Robert Harvey sagt, ist richtig. Sie müssen Ihr neuronales Netz trainieren. Außerdem werden neuronale Netze immer ein Ergebnis liefern, egal was passiert. Wenn das Ergebnis falsch ist, bedeutet das, dass Sie Ihr Netz nicht ausreichend trainiert haben.

0voto

recognizer.Recognize(testImage) RETURN EigenObjectRecognizer.RecognitionResult

Sie können es also versuchen:

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

0voto

twobob Punkte 304

Sie könnten die Funktion Recognize von Emgu.CV.EigenObjectRecognizer wie folgt überladen:

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;
      }

Idee konstruiert auf Overload Snippet von Codeproject

und erhalten auf diese Weise eine laufende letzte abgeleitete Entfernung wie

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

So erhalten Sie eine bessere Vorstellung von dem Wert, den Sie eingeben müssen

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);

durch einfaches Verlegen der Pipeline zu einem Etikett und die Betrachtung des Wertebereichs.

3 or 4 thousand maybe...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X