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.
hej, przywrócić kropki na twarzy;) (która wersja OpenCV używasz) – berak