2014-09-26 10 views
9

Chcę użyć klasyfikatora svm do wykrywania wyrazu twarzy. Wiem, że opencv ma svm api, ale nie mam pojęcia, co powinno być wejściem do szkolenia klasyfikatora. Do tej pory czytałem wiele artykułów, wszyscy mówią, że po wykryciu cech twarzy uczą klasyfikatora.Jak wyszkolić klasyfikator maszynki wektorowej (svm) z openCV z funkcjami twarzy?

tak daleko, co zrobiłem,

  1. wykrywania twarzy,
  2. 16 Obliczenie punktów twarzy w każdej klatce. Poniżej znajduje się wyjście twarzy wykrywania funkcji [wpisać opis obrazu
  3. wektor, który przechowuje adres cechy punkty piksela here

Uwaga: wiem, jak mogę trenować SVM tylko z pozytywnych i negatywnych obrazów, ja zobaczyłem ten kod here, ale nie wiem, jak połączyć z nim informacje o funkcji twarzy.

Czy ktoś może mi pomóc, aby rozpocząć klasyfikację z svm.

a. jaki powinien być przykładowy wkład do szkolenia klasyfikatora?

b. Jak wyszkolić klasyfikatora z tymi punktami charakterystycznymi twarzy?

Pozdrawiam,

+0

hej, przywrócić kropki na twarzy;) (która wersja OpenCV używasz) – berak

Odpowiedz

15

Algo w uczeniu maszynowym w opencv mają podobny interfejs. aby go wyszkolić, należy podać maty NxM Mat (N wierszy, każda cecha jeden wiersz o długości M) i Mata Nx1 z etykietami klasy. tak:

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

do przewidywania, wypełnić matą z 1 wiersz w taki sam sposób, i nastąpi powrót przewidywany etykietę

więc, powiedzmy, swoje 16 punktów twarzy są przechowywane w wektor, byś jak:

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

Witam Podziękuj za odpowiedź, ale mam pytanie - - jak mogę podać obraz i punkty funkcji razem? Oznacza, załóżmy, że I mieć 50 pozytywnych obrazów i 20 negatywnych obrazów, a każdy obraz ma 16 punktów charakterystycznych, więc jak mogę wstawić informację, która cecha wie, do którego obrazu ?, co powinienem wcisnąć w dane pociągu? - dlaczego mam multyply 16 z 2 w linii "przekształcenia"? – MMH

+0

hmm, kiedy zacząłem pisać tutaj, wyglądało to tak, jakbyś chciał wykryć emocje, jak szczęśliwy /smutny. teraz edytowałeś to kilka razy i wydaje się bardziej, że chcesz rozpoznawania twarzy/identyfikacji ludzi, która jest inną parą butów. czy mógłbyś wyjaśnić? – berak

+0

oh !! Chcę tylko wykrywanie emocji. na razie tylko szczęśliwy i smutny. – MMH

3

rozpoznawanie gestów twarzy jest szeroko zbadane problemem, a odpowiednie funkcje trzeba użyć można znaleźć się bardzo dokładnym badaniu istniejącej literatury. Kiedy już masz deskryptor funkcji, który uważasz za dobry, kontynuujesz szkolenie SVM. Po wyszkoleniu maszyny SVM z optymalnymi parametrami (znalezionymi podczas sprawdzania krzyżowego), rozpoczynasz testowanie modelu SVM na niewidocznych danych i raportujesz dokładność. Na ogół jest to rurociąg.

Teraz część o SVMs:

SVM jest binarnym classifier- może rozróżnić dwie klasy (choć może on być przedłużony do wielu klas, jak również). OpenCV ma wbudowany moduł dla SVM w bibliotece ML. Klasa SVM ma dwie funkcje: train(..) i predict(..). Aby wyszkolić klasyfikator, podajesz jako dane wejściowe bardzo dużą liczbę przykładowych deskryptorów cech, wraz z ich etykietami klas (zazwyczaj -1 i +1). Pamiętaj, że format obsługuje OpenCV: każda próbka treningowa musi być wektorem wiersza. A każdy wiersz będzie miał jedną odpowiednią etykietę klasy w wektorze etykiet. Jeśli więc masz deskryptor o długości n i masz takie deskryptory przykładowe, twoja matryca treningowa będzie m x n (m rzędów, każda o długości n), a wektor etykiet będzie miał długość m. Istnieje również obiekt SVMParams zawierający właściwości, takie jak typ SVM i wartości dla parametrów takich jak C, które należy określić.

Po szkoleniu wyodrębnia się funkcje z obrazu, przekształca je w format jednorzędowy i podaje predict(), aby określić, do której klasy należy (+1 lub -1).

Istnieje również train_auto() z podobnymi argumentami o podobnym formacie, który daje optymalne wartości parametrów SVM.

Sprawdź również ten detailed SO answer, aby zobaczyć przykład.

EDIT: Zakładając, że deskryptor funkcja, która zwraca wektor cech, algorytm będzie coś takiego:

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

nie zakładać, że extractFeatures() i alignAsRow() są istniejące funkcje, może być konieczne napisać je samemu.

+0

Dziękujemy za Twoje reply..As wspomniałem w moim pytaniu znam teoretycznie co? Muszę zrobić. Wiem, że po ekstrakcji cech będę musiał wyszkolić klasyfikator SVM. Również wiem, że po treningu mogę użyć predict(), aby przewidzieć wyraz twarzy. Moje główne pytanie brzmi: jak korzystać z tych cech, aby ćwiczyć klasyfikator svm? jeśli możesz podać jakiś fragment kodu, który również pomoże. – MMH

+0

Sprawdź zmiany, miej nadzieję, że to pomaga. –

+0

Jeszcze raz dziękuję, ale czy zapewniam tylko funkcje? nie powiązane obrazy? jak to się stanie, które funkcje należą do którego obrazu? – MMH

Powiązane problemy