Entrenamiento SVM personalizado para utilizar con HOGDescriptor en OpenCV

Estoy tratando de entrenar mi propio detector para utilizarlo con OpenCV :: HOGDescriptor, pero tengo problemas para hacer que HOGDescriptor funcione con mi SVM recién capacitada.

He calculado las características de HOG para las imágenes de entrenamiento positivas y negativas, las he etiquetado y he entrenado la SVM usando CvSVM. Los parámetros que he usado son:

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

Luego calculo la Forma Primaria de los vectores de soporte para que solo obtenga un vector en lugar de muchos y establezca el vector de soporte calculado usando HOGDescriptor.setSVMDetector (vector);

Esta es la Forma Primaria

Cuando uso CvSVM.predict () puedo clasificar objetos correctamente con SVM, pero HOGDescriptor.detect () o detectMultiScale () siempre devuelve muchas coincidencias positivas y no proporciona predicciones precisas.

CvSVM.predict () usa los vectores de soporte originales para la clasificación, por lo que puede haber algún problema con la forma en que estoy calculando la forma primaria.

¿Hay alguien que haya entrenado su propio detector que pueda orientarme en la dirección correcta?

Escribí una clase hija de CvSVM para extraer la forma primaria después de entrenar un svm lineal. Las muestras positivas se etiquetan como 1 y las muestras negativas se etiquetan como -1. Es extraño que tenga que poner un signo negativo delante de alfas y dejar el signo de rho sin cambios para obtener los resultados correctos de 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); } 

Estaba luchando con el mismo problema. Buscando en los foros que he encontrado, que el detector no puede ser entrenado usando CvSVM (no sé el motivo). Usé LIBSVM para entrenar el detector. Aquí está el código para extraer el detector para HOGDescriptor.setSVMDetector (w): para obtener más información, consulte la documentación / encabezado de LIBSVM. Hice todo el entrenamiento en C ++, completando los datos de entrenamiento de LIBSVM de CV a LIBSVM; el siguiente código extrae el vector detector necesario para cv :: HOGDescriptor. El parámetro w es 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]); 

Espero que esto ayude…

De lo que leí en el artículo de Dalal sobre el detector de HOG, él sugiere que para eliminar los falsos positivos, tenemos que volver a entrenar a nuestro modelo. La readaptación se realiza aplicando un modelo preliminar (su modelo que da muchos falsos positivos) y luego detecta objetos en todas las imágenes de muestra negativas. Todos los rectangularjs devueltos definitivamente positivos falsos.

Luego, agregue todos estos falsos positivos a sus imágenes de muestra negativas (conjunto de datos negativos), haga el entrenamiento una vez más. El modelo resultante, como se sugiere en el documento, devolverá menos falsos positivos.

Lamentablemente, lo intenté (volver a entrenar), pero el modelo resultante simplemente no reconoce nada, incluso en muestras de imagen positivas. Pero creo que vale la pena intentarlo porque eso fue lo que se sugirió en el artículo del inventor sobre el detector HOG