Próbuję wykształcić własny detektor do użytku z OpenCV :: HOGDescriptor, ale mam problem z wykonaniem istniejącego HOGDescriptor pracy z moją nowo wyszkoloną maszyną SVM.Szkolenie niestandardowe SVM do użycia z HOGDescriptor w OpenCV
Wyliczyłem funkcje HOG dla pozytywnych i negatywnych obrazów szkoleniowych, oznaczono je etykietami i przeszkoliłem maszynę SVM przy użyciu CvSVM. Parametry jakie stosowane są:
CvSVMParams params;
params.svm_type =CvSVM::EPS_SVR;
params.kernel_type = CvSVM::LINEAR;
params.C = 0.01;
params.p = 0.5;
Potem obliczyć Primal postaci wektorów nośnych tak, że mam tylko jeden wektor zamiast wielu i ustawić obliczoną wektorów nośnych za pomocą HOGDescriptor.setSVMDetector (wektor);
Gdy używam CvSVM.predict() Jestem w stanie poprawnie klasyfikować obiekty z SVM, ale HOGDescriptor.detect() lub detectMultiScale() zawsze zwraca wiele pozytywnych meczów i nie daje dokładne przewidywania.
CvSVM.predict() używa oryginalnych wektorów pomocniczych do klasyfikacji, więc może być coś złego w sposobie obliczania formy pierwotnej.
Czy jest ktoś, kto wytrenował swój własny wykrywacz, który może wskazać mi właściwy kierunek?
wydaje się, że błąd z biblioteki libsvm został odziedziczony, w którym kolejność etykiet zostaje pomieszana. Funkcja przewidywania jest świadoma kolejności i sprawdza, która etykieta jest która, a zatem działa dobrze. Rozwiązałem problem przez ustawienie mojej etykiety + ve na liczbę mniejszą niż moja -ve, tzn. Pos = 1, neg = 2. w przeciwnym razie może zajść potrzeba odwrócenia modelu poprzez pomnożenie przez -1. (dlatego akceptowana odpowiedź ma dziwny znak ujemny). Postanowiłem tego nie robić w ten sposób, na wypadek, gdyby naprawili błąd (nie jest to błąd, jeśli użyjesz funkcji przewidywania, ale mogą to zmienić). – QED