riconoscimento dei gesti viso è un problema ampiamente studiato, e le caratteristiche appropriate è necessario utilizzare possono essere trovati da uno studio molto approfondito della letteratura esistente. Una volta che hai il descrittore di funzione che credi di essere bravo, continui ad allenare l'SVM con quelli. Una volta formato il SVM con parametri ottimali (rilevati attraverso la convalida incrociata), si inizia a testare il modello SVM su dati non visibili e si riporta la precisione. Quello, in generale, è la pipeline.
Ora la parte circa SVM:
SVM è un classifier- binario può distinguere tra due classi (ma può essere estesa a più classi pure). OpenCV ha un modulo integrato per SVM nella libreria ML. La classe SVM ha due funzioni per iniziare: train(..)
e predict(..)
. Per addestrare il classificatore, si fornisce come in input una grande quantità di descrittori di funzioni di esempio, insieme alle loro etichette di classe (di solito -1 e +1). Ricorda il formato supportato da OpenCV: ogni campione di allenamento deve essere un vettore di riga. E ogni riga avrà un'etichetta di classe corrispondente nel vettore delle etichette. Quindi, se si dispone di un descrittore di lunghezza n
e si dispone di m
tali descrittori di esempio, la matrice di allenamento sarebbe m x n
(m
righe, ciascuna di lunghezza n
) e il vettore di etichette sarebbe di lunghezza m
. C'è anche un oggetto SVMParams
che contiene proprietà come tipo SVM e valori per parametri come C
che dovrai specificare.
Una volta formato, si estrae le caratteristiche da un'immagine, la si converte in un formato a riga singola e si fornisce a predict()
e viene indicato quale classe appartiene (+1 o -1).
C'è anche un train_auto()
con argomenti simili con un formato simile che fornisce i valori ottimali dei parametri SVM.
Controllare anche questo detailed SO answer per vedere un esempio.
EDIT: Supponendo di avere un descrittore Caratteristica che restituisce un vettore di caratteristiche, l'algoritmo sarebbe qualcosa di simile:
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);
Non ho la presunzione che extractFeatures()
e alignAsRow()
sono funzioni esistenti, potrebbe essere necessario per scriverli da soli
hey, riportare i puntini sulla faccia;) (quale versione OpenCV stai usando) – berak