Formazione di SVM personalizzato da utilizzare con HOGDescriptor in OpenCV

Sto cercando di addestrare il mio rilevatore per l’uso con OpenCV :: HOGDescriptor ma sto riscontrando problemi nel far funzionare l’HOGDescriptor esistente con il mio SVM appena formato.

Ho calcolato le caratteristiche di HOG per le immagini di addestramento positive e negative, le ho etichettate e ho addestrato l’SVM usando CvSVM. I parametri che ho usato sono:

CvSVMParams params; params.svm_type =CvSVM::EPS_SVR; params.kernel_type = CvSVM::LINEAR; params.C = 0.01; params.p = 0.5; 

Quindi calcolo la forma primitiva dei vettori di supporto in modo da ottenere solo un vettore anziché molti e impostare il vettore di supporto calcolato utilizzando HOGDescriptor.setSVMDetector (vector);

Questa è la Forma Primordiale

Quando utilizzo CvSVM.predict () sono in grado di classificare correttamente gli oggetti con SVM, ma HOGDescriptor.detect () o detectMultiScale () restituisce sempre molte corrispondenze positive e non fornisce previsioni accurate.

CvSVM.predict () usa i vettori di supporto originali per la classificazione, quindi potrebbe esserci qualcosa di sbagliato nel modo in cui sto calcolando la forma primaria.

C’è qualcuno che ha addestrato il proprio rilevatore che può indicarmi la giusta direzione?

Ho scritto una class figlia di CvSVM per estrarre la forma originaria dopo che è stata addestrata una svm lineare. I campioni positivi sono etichettati 1 e quelli negativi sono etichettati -1. È strano che io debba mettere un segno negativo davanti agli alfa e lasciare invariato il segno di rho per ottenere risultati corretti da HogDescriptor.

LinearSVM.h

 #ifndef LINEAR_SVM_H_ #define LINEAR_SVM_H_ #include  #include  class LinearSVM: public CvSVM { public: void getSupportVector(std::vector& support_vector) const; }; #endif /* LINEAR_SVM_H_ */ 

LinearSVM.cc

 #include "linear_svm.h" void LinearSVM::getSupportVector(std::vector& support_vector) const { int sv_count = get_support_vector_count(); const CvSVMDecisionFunc* df = decision_func; const double* alphas = df[0].alpha; double rho = df[0].rho; int var_count = get_var_count(); support_vector.resize(var_count, 0); for (unsigned int r = 0; r < (unsigned)sv_count; r++) { float myalpha = alphas[r]; const float* v = get_support_vector(r); for (int j = 0; j < var_count; j++,v++) { support_vector[j] += (-myalpha) * (*v); } } support_vector.push_back(rho); } 

Stavo lottando con lo stesso problema. Cercando nei forum ho scoperto che il rivelatore non può essere addestrato usando CvSVM (non ne conosco il motivo). Ho usato LIBSVM per addestrare il rilevatore. Ecco il codice per estrarre il rilevatore per HOGDescriptor.setSVMDetector (w): Per i dettagli dei dati vedere la documentazione / intestazione di LIBSVM. Ho fatto tutto il training in C ++, riempiendo i dati di addestramento LIBSVM da CV a LIBSVM; il codice sottostante estrae il vettore del rivelatore necessario per cv :: HOGDescriptor. Il parametro w è std::vector w

  const double * const *sv_coef = model.sv_coef; const svm_node * const *SV = model.SV; int l = model.l; model.label; const svm_node* p_tmp = SV[0]; int len = 0; while( p_tmp->index != -1 ) { len++; p_tmp++; } w.resize( len+1 ); for( int i=0; iindex != -1 ) { w[p->index-1] += float(svcoef * p->value); p++; } } w[len] = float(-model.rho[0]); 

Spero che questo ti aiuti…

Da quello che ho letto sul giornale di Dalal sul rivelatore HOG, suggerisce che per rimuovere i falsi positivi, abbiamo bisogno di riqualificare il nostro modello. La riqualificazione viene eseguita applicando il modello preliminare (il modello che fornisce molti falsi positivi), quindi rileva gli oggetti in tutte le immagini campione negative. Tutti i rettangoli restituiti sarebbero sicuramente falsi positivi.

Quindi, aggiungi tutti questi falsi positivi alle immagini del campione negativo (set di dati negativo), esegui nuovamente l’allenamento. Il modello risultante, come suggerito nel documento, restituirà molto meno falsi positivi.

Sfortunatamente, però, l’ho provato (ri-allenamento), ma il modello risultante non riconosce nulla, nemmeno su campioni di immagini positive. Ma penso che valga la pena di provare perché era quello che suggeriva nel documento dell’inventore sul rivelatore HOG