Обучение пользовательскому SVM для использования с HOGDescriptor в OpenCV

Я пытаюсь настроить свой собственный детектор для использования с OpenCV :: HOGDescriptor, но у меня возникают проблемы с работой существующего HOGDescriptor с моим недавно обученным SVM.

Я рассчитал характеристики HOG для положительных и отрицательных тренировочных образов, пометил их и обучил SVM с использованием CvSVM. Параметры, которые я использовал:

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

Затем я вычисляю Первичную Форму опорных векторов так, чтобы я получил только один вектор вместо многих и установил вычисленный опорный вектор, используя HOGDescriptor.setSVMDetector (vector);

Это первичная форма

Когда я использую CvSVM.predict (), я могу правильно классифицировать объекты с помощью SVM, но HOGDescriptor.detect () или detectMultiScale () всегда возвращает много положительных совпадений и не дает точных прогнозов.

CvSVM.predict () использует исходные векторы поддержки для классификации, так что может быть что-то не так с тем, как я вычисляю первичную форму.

Есть ли кто-нибудь, кто обучил свой собственный детектор, который может указать мне правильное направление?

4

Решение

Я написал дочерний класс CvSVM для извлечения первичной формы после обучения линейного SVM. Положительные образцы обозначены как 1, а отрицательные образцы обозначены как -1. Странно, что я должен поставить отрицательный знак перед альфа-каналом и оставить знак rо неизменным, чтобы получить правильные результаты из HogDescriptor.

LinearSVM.h

#ifndef LINEAR_SVM_H_
#define LINEAR_SVM_H_
#include <opencv2/core/core.hpp>
#include <opencv2/ml/ml.hpp>

class LinearSVM: public CvSVM {
public:
void getSupportVector(std::vector<float>& support_vector) const;
};

#endif /* LINEAR_SVM_H_ */

LinearSVM.cc

#include "linear_svm.h"void LinearSVM::getSupportVector(std::vector<float>& 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);
}
5

Другие решения

Я боролся с той же проблемой. Поиск на форумах Я обнаружил, что детектор не может быть обучен с использованием CvSVM (я не знаю причину). Я использовал LIBSVM для обучения детектора. Вот код для извлечения детектора для HOGDescriptor.setSVMDetector (w): Для получения подробной информации смотрите документацию / заголовок LIBSVM. Я прошел все обучение на C ++, заполняя данные обучения LIBSVM от CV до LIBSVM; код ниже извлекает вектор детектора, необходимый для cv :: HOGDescriptor. Параметр w std::vector<float> 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; i<l; i++)
{
double svcoef = sv_coef[0][i];
const svm_node* p = SV[i];
while( p->index != -1 )
{
w[p->index-1] += float(svcoef * p->value);
p++;
}
}
w[len] = float(-model.rho[0]);

Надеюсь это поможет…

4

Из того, что я прочитал в статье Далала о детекторе HOG, он предполагает, что для удаления ложных срабатываний нам необходимо переобучить нашу модель. Переподготовка выполняется путем применения предварительной модели (ваша модель дает много ложных срабатываний), а затем обнаруживает объекты на всех изображениях с отрицательным образцом. Все возвращенные прямоугольники будут определенно ложными срабатываниями.

Затем добавьте все эти ложные срабатывания к вашим отрицательным образцам изображений (набор отрицательных данных), повторите обучение. Полученная модель, как предлагается в статье, будет давать гораздо меньше ложных срабатываний.

К сожалению, я попробовал это (переобучение), но полученная модель просто не распознает ничего, даже на положительных образцах изображения. Но я думаю, что стоит попробовать, потому что это было то, что было предложено в статье изобретателя о детекторе HOG

0
По вопросам рекламы [email protected]