OpenCV 3.1.0: Speichern und laden von SVMs trainiert

Im moment bin ich versucht zu trainieren, verschiedene SVMs für die Anerkennung der verschiedenen Emotionen. So zum Beispiel zu erkennen, die emotion glücklich ich trainiere eine SVM mit Bildern von glücklichen Menschen als positiv und Bilder, in denen Menschen zum Ausdruck bringen, andere Emotionen wie Wut, Angst, Ekel, ... als negative. Die Bilder werden in einer Datenbank gespeichert, die habe ich partitioniert in einem Bereich training und testen Abschnitt.

Wenn ich ausgebildet haben, die SVMs, die ich sofort verwenden Sie zum testen der Genauigkeit auf die test-Bilder von der Datenbank und das funktioniert gut. Aber ich Hebe auch die trainierten SVMs, weil ich möchte, um Sie in einem anderen programm und nicht umschulen Sie jedes mal, wenn ich das andere Programm zu starten.

Also lud ich die SVMs in das andere Programm, aber die Ergebnisse waren sehr schlecht. Die Genauigkeit wurde in der Nähe von null Prozent. Also habe ich versucht zu sparen und immedialty laden Sie die SVMs in der Ausbildung, aber auch hier ist die Genauigkeit war nun in der Nähe von null Prozent.

Suche nach einer Weile fand ich heraus, dass ich, wenn ich geladen haben SVMs und ich drucken der Typ SVM, kernel-Typ und supportvectors, dass Sie die gleichen wie in den SVM .xml-Datei. Also ich denke, dass das problem ist, dass die Vorhersage wird nicht ausgeführt, in der richtigen Weise. Ich weiß auch nicht, ob ich meine SVMs und laden Sie Sie in geeigneter Weise.

Im moment habe ich versucht, auf der Suche nach einer Lösung, aber ohne Erfolg. Einige der links, die ich ausprobiert habe sind:

Zug SVM, und speichern Sie es mit OpenCV 3.0

Gewusst wie: laden Sie die zuvor gespeicherte svm Klassifikator?

Laden Trainierten SVM – Emgu CV

opencv 3 (C++) auto trainierten SVM laden Problem

Den code, ich benutze zum trainieren der SVMs und testen Sie Sie sofort ohne Sie zu laden ist wieder:

trainData = ml::TrainData::create(training_mat, ROW_SAMPLE, label_mat);
svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::RBF);
svm->trainAuto(trainData);
svm->save(svmSaveNames[i]);

//Test SVMs
data_file.open(filenameLabelsTestingImages[i]);
data_file << "Number\n";
startTest = stopTest;
stopTest  = startTest + emotionCountersTesting[i];
int numberRightClassified = 0;
int numberClassified = 0;

for (int j = 0; j < numberOfTestImg; j++)
{
    cv::Mat testing_one_image_mat(1, numberOfFeatures, CV_32F);
    for (int k = 0; k < numberOfFeatures; k++)
    {
        testing_one_image_mat.at<float>(0, k) = testing_mat.at<float>(j, k);
    }

    int value_svm = svmNew->predict(testing_one_image_mat);

    if (value_svm == 1)
    {   
        if (j >= startTest && j < stopTest)
        {
            numberRightClassified++;
        }
        numberClassified++;
    }
    data_file << value_svm << endl;
}
data_file.close();

Damit dies funktioniert gut, bis ich den code zum speichern der SVMs und erst dann wieder laden, die für die Vorhersage wie folgt

trainData = ml::TrainData::create(training_mat, ROW_SAMPLE, label_mat);
svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::RBF);
svm->trainAuto(trainData);
svm->save(svmSaveNames[i]);

Ptr<SVM> svmNew = SVM::create();
svmNew = SVM::load<SVM>(svmSaveNames[i]);
//cout << "The type is " << svmNew->getType() << endl;
//cout << "The kernel type is " << svmNew->getKernelType() << endl;
//cout << "The support vectors are " << svmNew->getSupportVectors() << endl;

//Test SVMs
data_file.open(filenameLabelsTestingImages[i]);
data_file << "Number\n";
startTest = stopTest;
stopTest  = startTest + emotionCountersTesting[i];
int numberRightClassified = 0;
int numberClassified = 0;

for (int j = 0; j < numberOfTestImg; j++)
{
    cv::Mat testing_one_image_mat(1, numberOfFeatures, CV_32F);
    for (int k = 0; k < numberOfFeatures; k++)
    {
        testing_one_image_mat.at<float>(0, k) = testing_mat.at<float>(j, k);
    }

    //int value_svm = svm -> predict(testing_one_image_mat);
    int value_svm = svmNew->predict(testing_one_image_mat);

    if (value_svm == 1)
    {   
        if (j >= startTest && j < stopTest)
        {
            numberRightClassified++;
        }
        numberClassified++;
    }
    data_file << value_svm << endl;
}
data_file.close();

Array svmSaveNames enthält strings mit den Namen für die Speicherung der verschiedenen SVMs wie svm_anger.xml, svm_contempt.xml, ...

Verwende ich die variable data_file zu erstellen .txt-Datei für jede SVM, die getestet wird. Also erstmal ich trainieren und testen der SVM zu erkennen, zum Beispiel die emotion Zorn und während der Prüfung dieser SVM nutze ich die test-Bilder. Also die Vorhersage von all diesen Bildern (1 = positiv, -1 = negativ) geschrieben, um eine Textdatei.

Parameter startTest und stopTest verwendet werden, um zu überprüfen, ob sich die positiven Bilder, die Vorhersage ergibt sich der Wert 1, wird im Bereich der Bilder, die benötigt werden, um erkannt werden als positive. In der Prüfung anzeigen der Datenbank bestellte ich alle die Bilder, indem es Emotionen also zuerst Wut, dann Verachtung,...

Der 2D-matrix-testing_mat die Daten enthält, die von allen test-Bildern, das die SVM zur Vorhersage der emotion.

Also mein problem ist, dass, nachdem ich geladen habe die SVMs sind Sie nicht geben Sie mir die richtige Vorhersage.

InformationsquelleAutor Plzzz | 2016-05-09
Schreibe einen Kommentar