2014-09-26 27 views
9

Desidero utilizzare il classificatore svm per il rilevamento di espressioni facciali. So che opencv ha una svm api, ma non ho idea di cosa dovrebbe essere l'input per addestrare il classificatore. Ho letto molti documenti fino ad ora, tutti dicono che dopo il rilevamento del tratto del viso addestrare il classificatore.Come addestrare un classificatore Support Vector Machine (svm) con openCV con caratteristiche facciali?

finora ciò feci,

  1. rilevamento viso,
  2. 16 punti facciali calcolo in ogni fotogramma. sotto è un'uscita di rilevamento caratteristica facciale [inserire descrizione immagine
  3. Un vettore che contiene l'indirizzo PUNTI pixel here

Nota: So come posso formare lo SVM solo immagini positive e negative, io ho visto questo codice here, ma non so come combinare le informazioni sulla funzione facciale con esso.

Qualcuno può aiutarmi a iniziare la classificazione con svm.

a. quale dovrebbe essere l'input del campione per addestrare il classificatore?

b. Come si allena il classificatore con questi punti caratteristica del viso?

saluti,

+0

hey, riportare i puntini sulla faccia;) (quale versione OpenCV stai usando) – berak

risposta

15

gli algos di apprendimento automatico in opencv sono tutti dotati di un'interfaccia simile. per allenarlo, si superano le retinature NxM Mat (N righe, ognuna con una riga di lunghezza M) e una Nx1 Mat con le etichette di classe. in questo modo:

//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 

per la previsione, si riempie una stuoia con 1 fila nello stesso modo, e restituirà l'etichetta previsto

così, diciamo, i tuoi 16 punti del viso vengono memorizzati in una vettore, si dovrebbe fare come:

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

Ciao pausa Grazie per la tua risposta, ma ho una domanda- -come faccio a fornire l'immagine e le caratteristiche punti insieme? Significa, supponiamo che io avere 50 immagini positive e 20 immagini negative e ogni immagine ha 16 punti caratteristica, quindi come faccio a inserire le informazioni che descrivono in quale immagine? cosa dovrei premere in questi dati? - perché faccio mille volte con 2 nella linea 'reshape'? – MMH

+0

hmm, quando ho iniziato a digitare qui, sembrava, come se volessi fare il rilevamento delle emozioni, come felice /triste. ora lo hai modificato un paio di volte, e sembra di più, che vuoi il riconoscimento facciale/identificazione delle persone, che è un paio di scarpe diverse. potresti chiarire? – berak

+0

oh !! Voglio fare solo il rilevamento delle emozioni. per ora solo felice e triste. – MMH

3

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

+0

Grazie per i vostri reply..As che ho citato nella mia interrogazione che conosco in teoria che cosa? Devo fare. So che dopo l'estrazione della funzione dovrò addestrare il classificatore SVM. So anche che dopo l'allenamento posso predire() per predire l'espressione facciale. Quindi la mia domanda principale è come utilizzare questi punti caratteristica per addestrare il classificatore svm ?? se puoi dare un codice snipt che ti aiuterà anche. – MMH

+0

Controlla le modifiche, spero che ti sia d'aiuto. –

+0

Grazie ancora, ma fornisco solo le funzionalità? immagini non correlate? allora come si relazionerà quali caratteristiche appartengono a quale immagine? – MMH