繁体   English   中英

训练SVM并使用OpenCV 3.0保存

[英]Train SVM and save it with OpenCV 3.0

我正在使用带有OpenCV 3.0的Visual Studio 2010。 我正在尝试训练SVM并将其保存到文件中,但是出现问题。

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

TrainSVM.exe中的0x000007fefd9bb16d(KernelBase.dll)中未处理的异常:MICROSOFT C ++异常:cv ::内存位置0x0026e1b0处的异常。

然后在控制台中显示:

OpenCV错误:cv :: ml :: SVMImpl :: write,file C:\\ builds \\ master_PackSlave-w in64-vc12-shared \\ opencv中的解析错误(SVM模型数据无效,检查sv_count,var_ *和class_count标签) \\ modules \\ ml \\ src \\ svm.cpp,第2027行

如果SVM的训练不当,似乎会出现错误,但是我不知道我哪里失败了,因为

svm->列车(auxResult)

结果为“ true”。

我已经检查了图像并且它们已正确加载,有人可以帮助我吗?

提前致谢。

这是代码:

    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(labelPositive);

您应该使用一个名为“ labelNegative”的参数定义为-1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM