2014-09-26 4 views
9

Ich möchte den SVM-Klassifikator für die Gesichtsausdruckserkennung verwenden. Ich weiß, Opencv hat eine SVM-API, aber ich habe keine Ahnung, was die Eingabe sein sollte, um den Klassifikator zu trainieren. Ich habe bis jetzt viele Papiere gelesen, die alle nach Gesichtsmerkmalserkennung den Klassifikator trainieren.Wie trainiert man einen Support Vector Machine (SVM) Klassifikator mit openCV mit Gesichtsmerkmalen?

so weit, was ich tat,

  1. Gesichtserkennung,
  2. 16 Gesichts-Berechnungspunkte in jedem Rahmen. unten ist eine Ausgabe von Gesichtsmerkmalserkennung [image description
  3. Ein Vektor, here

Beachten Sie die Funktionen Punkte Pixeladresse hält eingeben: Ich weiß, wie ich die SVM nur mit positiven und negativen Bilder trainieren können, ich sah diesen Code here, aber ich weiß nicht, wie ich die Gesichtsmerkmalsinformationen damit verbinde.

Kann jemand bitte mir helfen, die Klassifizierung mit Svm zu starten.

a. Was sollte die Beispieleingabe sein, um den Klassifikator zu trainieren?

b. Wie trainiere ich den Klassifikator mit diesen Gesichtspunkten?

Grüße,

+0

hey, bringen die Punkte auf dem Gesicht zurück;) (die opencv Version Sie verwenden) – berak

Antwort

15

Die Maschine Lernalgorithmen in opencv alle kommen mit einer ähnlichen Schnittstelle. Um es zu trainieren, übergeben Sie eine NxM Mat-Eigenschaft (N Reihen, jede Eigenschaft eine Reihe mit Länge M) und eine Nx1 Mat mit den Klassen-Etiketten. dies wie:

//traindata  //trainlabels 

f e a t u r e 1 
f e a t u r e -1 
f e a t u r e 1 
f e a t u r e 1 
f e a t u r e -1 

für die Vorhersage, können Sie eine Matte mit 1 Reihe in der gleichen Art und Weise füllen, und es wird die vorhergesagte Label

so, sagen wir mal, Ihre 16 Gesichtspunkte werden gespeichert in einer Rück Vektor, würden Sie tun, wie:

Mat trainData; // start empty 
Mat labels; 

for all facial_point_vecs: 
{ 
    for(size_t i=0; i<16; i++) 
    { 
     trainData.push_back(point[i]); 
    } 
    labels.push_back(label); // 1 or -1 
} 
// now here comes the magic: 
// reshape it, so it has N rows, each being a flat float, x,y,x,y,x,y,x,y... 32 element array 
trainData = trainData.reshape(1, 16*2); // numpoints*2 for x,y 

// we have to convert to float: 
trainData.convertTo(trainData,CV_32F); 

SVM svm; // params omitted for simplicity (but that's where the *real* work starts..) 
svm.train(trainData, labels); 


//later predict: 
vector<Point> points; 
Mat testData = Mat(points).reshape(1,32); // flattened to 1 row 
testData.convertTo(testData ,CV_32F); 
float p = svm.predict(testData); 
+0

Hallo Break Danke für Ihre Antwort, aber ich habe eine Frage- -wie stelle ich das Bild und die Feature-Punkte zusammen? Bedeutet, nehme ich an haben 50 positive Bilder und 20 negative Bilder und jedes Bild hat 16 Feature-Point, also wie füge ich die Informationen, die Belog zu welchem ​​Bild? Was sollte ich push_back in den trainData in diesem Fall? - warum ich multilyply 16 mit 2 in der 'Umgestalten' Zeile? – MMH

+0

hmm, als ich anfing hier zu tippen, sah es aus, als wolltest du Emotionserkennung machen, wie glücklich /traurig. jetzt haben Sie es ein paar Mal bearbeitet, und es scheint mehr, dass Sie Gesichtserkennung/Personenidentifikation wollen, die ein anderes Paar Schuhe ist. Könntest du das klären? – berak

+0

oh !! Ich möchte nur Emotionserkennung machen. für jetzt nur glücklich und traurig. – MMH

3

Gesicht Gestenerkennung ist ein weit erforscht Problem und die entsprechenden Funktionen, die Sie benötigen, durch eine sehr gründliche Untersuchung der vorhandenen Literatur zu verwenden, gefunden werden können. Sobald Sie den Feature-Deskriptor haben, den Sie für gut halten, trainieren Sie den SVM mit diesen. Nachdem Sie die SVM mit den optimalen Parametern trainiert haben (die Sie über die Kreuzvalidierung gefunden haben), testen Sie das SVM-Modell mit ungesehenen Daten und melden die Genauigkeit. Das ist im Allgemeinen die Pipeline.

Jetzt ist der Teil über SVM:

SVM ist eine binäre classifier- es zwischen zwei Klassen unterscheiden kann (obwohl es auch auf mehrere Klassen erweitert werden kann). OpenCV hat ein eingebautes Modul für SVM in der ML-Bibliothek. Die SVM-Klasse hat zunächst zwei Funktionen: train(..) und predict(..). Um den Klassifikator zu trainieren, geben Sie wie bei der Eingabe eine sehr große Anzahl von Beispiel-Feature-Deskriptoren zusammen mit ihren Klassenbezeichnungen (normalerweise -1 und +1) an. Merken Sie sich das Format, das OpenCV unterstützt: Jedes Trainingssample muss ein Zeilenvektor sein. Und jede Zeile hat eine entsprechende Klassenbezeichnung im Etikettenvektor. Also, wenn Sie einen Deskriptor der Länge n haben, und Sie m solche Beispieldeskriptoren haben, wäre Ihre Trainingsmatrix m x n (m Zeilen, jeweils der Länge n), und die Etiketten Vektor wäre von Länge m. Es gibt auch ein Objekt SVMParams, das Eigenschaften wie SVM-Typ und Werte für Parameter wie C enthält, die Sie angeben müssen.

Sobald trainiert, extrahieren Sie Features aus einem Bild, konvertieren Sie es in ein einzelnes Zeilenformat und geben Sie predict() und es wird Ihnen sagen, zu welcher Klasse es gehört (+1 oder -1).

Es gibt auch eine train_auto() mit ähnlichen Argumenten mit einem ähnlichen Format, das Ihnen die optimalen Werte der SVM-Parameter gibt.

Überprüfen Sie auch dieses detailed SO answer, um ein Beispiel zu sehen.

EDIT: Vorausgesetzt Sie haben eine Merkmalbeschreibung, die einen Vektor von Funktionen zurückgibt, würde der Algorithmus so etwas wie:

Mat trainingMat, labelsMat; 
for each image in training database: 
    feature = extractFeatures(image[i]); 
    Mat feature_row = alignAsRow(feature); 
    trainingMat.push_back(feature_row); 
    labelsMat.push_back(-1 or 1); //depending upon class. 
mySvmObject.train(trainingMat, labelsMat, Mat(), Mat(), mySvmParams); 

Ich nehme nicht, dass extractFeatures() und alignAsRow() sind bestehende Funktionen, die Sie benötigen um sie selbst zu schreiben.

+0

Vielen Dank für Ihre reply..As ich in meiner Frage erwähnte ich weiß theoretisch, was? Ich muss ... machen. Ich weiß, nach der Merkmalsextraktion muss ich den SVM-Klassifikator trainieren. Ich weiß auch, dass ich nach dem Training mit previous() den Gesichtsausdruck vorhersagen kann. Meine Hauptfrage ist, wie verwende ich diese Feature-Punkte, um den SVM-Klassifikator zu trainieren? wenn du ein Code-Snip geben kannst, hilft das auch. – MMH

+0

Überprüfen Sie Änderungen, hoffe, dass das hilft. –

+0

Danke nochmal, aber stelle ich nur die Features zur Verfügung? nicht verwandte Bilder? Wie wird es dann aussehen, welche Merkmale zu welchem ​​Bild gehören? – MMH

Verwandte Themen