Ich versuche, meine eigenen Detektor für den Einsatz mit OpenCV :: HOGDescriptor zu trainieren, aber ich habe Probleme mit dem bestehenden HOGDescriptor arbeiten mit meiner neu ausgebildeten SVM.Training benutzerdefinierte SVM mit HOGDescriptor in OpenCV
Ich habe HOG-Funktionen für positive und negative Trainingsbilder berechnet, beschriftet und die SVM mit CvSVM trainiert. Die Parameter, die ich verwendet habe, sind:
CvSVMParams params;
params.svm_type =CvSVM::EPS_SVR;
params.kernel_type = CvSVM::LINEAR;
params.C = 0.01;
params.p = 0.5;
Dann I Urform der Stützvektoren berechnen, so dass ich nur statt vielen einen Vektor erhalten und stelle den berechneten Support-Vektor unter Verwendung von HOGDescriptor.setSVMDetector (Vektor);
Wenn ich CvSVM.predict() Ich bin in der Lage, richtig Objekte mit dem SVM zu klassifizieren, aber HOGDescriptor.detect() oder detectMultiScale() gibt immer viele positive Begegnungen und nicht genau geben Vorhersagen.
CvSVM.predict() verwendet die Original-Support-Vektoren für die Klassifizierung, so dass möglicherweise etwas falsch mit der Art bin, wie ich die ursprüngliche Form berechne.
Gibt es jemanden, der seinen eigenen Detektor trainiert hat, der mir in die richtige Richtung zeigen kann?
Es scheint, als ob ein Fehler von libsvm vererbt wurde, in dem die Reihenfolge der Etiketten durcheinander geraten. Die Vorhersagefunktion kennt die Reihenfolge und schaut nach, welches Label welches ist und funktioniert somit gut. Ich habe das Problem gelöst, indem ich mein + ve-Label auf eine Zahl kleiner als meine -ve gesetzt habe, d. H. Pos = 1, neg = 2. Andernfalls müssen Sie möglicherweise Ihr Modell durch Multiplikation mit -1 invertieren. (Deshalb hat die angenommene Antwort das seltsame negative Zeichen). Ich habe mich entschieden, es nicht so zu machen, wenn sie den Fehler beheben (es ist nicht wirklich ein Fehler, wenn Sie vorhersagen, aber sie könnten es ändern) – QED