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.
hey, bringen die Punkte auf dem Gesicht zurück;) (die opencv Version Sie verwenden) – berak