Обучите SVM и сохраните его с OpenCV 3.0

Я использую Visual Studio 2010 с OpenCV 3.0. Я пытаюсь обучить SVM и сохранить его в файл, но у меня проблемы.

Моя цель — извлечь HOG-функции из некоторых изображений и обучить их работе с SVM. Все кажется правильным, но когда я пытаюсь сохранить модель в файле XML, я получаю следующую ошибку:

Необработанное исключение в 0x000007fefd9bb16d (KernelBase.dll) в TrainSVM.exe: Исключение de MICROSOFT C ++: cv :: Исключение в ячейке памяти 0x0026e1b0.

И тогда это показано в консоли:

Ошибка OpenCV: ошибка анализа (данные модели SVM неверны, проверьте sv_count, var_ * an
d теги class_count) в cv :: ml :: SVMImpl :: write, файл C: \ builds \ master_PackSlave-w
in64-vc12-shared \ opencv \ modules \ ml \ src \ svm.cpp, строка 2027

Кажется, что ошибка появляется, когда SVM не был обучен должным образом, но я не понимаю, где я потерпел неудачу, потому что линия

svm-> поезд (auxResult)

имеет «истину» как результат.

Я проверил изображения и они загружены правильно, кто-нибудь может мне помочь?

Заранее спасибо.

Вот код:

    String imagesPathPos = "Positivas/*.jpg"; // it has filters, too !
vector<String> fp;
glob(imagesPathPos, fp);
int tamaño = fp.size();

std::vector<cv::Point> positions;
positions.push_back(cv::Point(0,0));
std::vector<float> descriptor;
Ptr<TrainData> auxResult;

for (size_t i=0; i<fp.size(); ++i)
{
string nameFile = fp[i];
Mat img = imread(fp[i]);
cv::Mat grayImg;
cvtColor( img, grayImg, COLOR_BGR2GRAY );

hog.compute(grayImg,descriptor,winStride,trainingPadding,positions);

Mat auxDescriptor = cv::Mat(descriptor);
Mat descriptorMat(1,auxDescriptor.rows,CV_32FC1);
transpose(auxDescriptor, descriptorMat);
trainingData.push_back(descriptorMat);
trainingLabels.push_back(labelPositive);
}

String imagesPathNeg = "Negativas/*.jpg";
vector<String> fn;
glob(imagesPathNeg, fn, true);
for (size_t i=0; i<fn.size(); i++)
{
Mat img = imread(fn[i]);
cv::Mat grayImg;
cvtColor( img, grayImg, COLOR_BGR2GRAY );
hog.compute(grayImg,descriptor,Size(),Size(),positions);

Mat auxDescriptor = cv::Mat(descriptor);
Mat descriptorMat(1,auxDescriptor.rows,CV_32FC1);
transpose(auxDescriptor, descriptorMat);
trainingData.push_back(descriptorMat);
trainingLabels.push_back(labelPositive);
}

auxResult = TrainData::create(trainingData, type, trainingLabels);

svm->train(auxResult);

svm->save("output.xml");

1

Решение

Вы определяете «labelPositive», даже если изображения негативные. Возможно, ошибка в цикле через вектор сноска:

trainingLabels.push_back (labelPositive);

Вы должны использовать параметр с именем «labelNegative», определенный как -1.

0

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

Других решений пока нет …

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