训练 SVM 并使用 OpenCV 3.0 保存它

Train SVM and save it with OpenCV 3.0

本文关键字:保存 OpenCV SVM 训练      更新时间:2023-10-16

我正在使用Visual Studio 2010和OpenCV 3.0。我正在尝试训练 SVM 并将其保存到文件中,但我遇到了问题。

我的目的是提取一些图像的 HOG 特征并用它们训练 SVM。一切似乎都是正确的,但是当我尝试将模型保存在xml文件中时,出现以下错误:

TrainSVM.exe 中 0x000007fefd9bb16d (KernelBase.dll) 中的未处理异常:Exception de MICROSOFT C++: cv::Exception at memory location 0x0026e1b0.

然后这显示在控制台中:

OpenCV 错误:解析错误(SVM 模型数据无效,检查sv_count,var_* d class_count 标签) in cv::ml::SVMImpl::write, 文件 C:\builds\master_PackSlave-w in64-VC12-shared\OpenCV\modules\ML\SRC\SVM.cpp,第 2027 行

当 SVM 未正确训练时,似乎会出现错误,但我不明白我在哪里失败了,因为该行

svm->train(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");

即使图像是负的,您也在定义"labelPositive"。错误可能存在于通过向量 fn 的循环中:

trainingLabels.push_back(标签阳性);

您应该使用定义为 -1 的名为"labelNegative"的参数。