如何在OpenCV 2.4.13中导入经过训练的SVM检测器

时间:2017-06-05 15:42:12

标签: c++ opencv gpu svm

所以我按照本指南训练自己的行人HOG探测器。 https://github.com/DaHoC/trainHOG/wiki/trainHOG-Tutorial

成功生成了4个文件。

  • cvHOGClassifier.yaml
  • descriptorvector.dat
  • features.dat
  • svmlightmodel.dat

有谁知道如何将descriptorvector.dat文件作为向量加载? 我试过这个但是失败了。

    vector<float> detector;
    std::ifstream file;
    file.open("descriptorvector.dat");
    file >> detector;
    file.close();

这是我最终想要使用的东西。

    gpu::HOGDescriptor hog(Size(64, 128), Size(16, 16), Size(8, 8), Size(8, 8),9);
    hog.setSVMDetector(detector);

提前谢谢!

2 个答案:

答案 0 :(得分:0)

如果您已经训练过您的SVM,您可以将权重和截距保存在TXT文件中,然后将其加载到数组/向量中。然后您将按如下方式使用它:

std::vector<float> descriptorsValues;   //A vector to store the computed HoG values
std::vector<cv::Point> locations;
hog.compute(image, descriptorsValues, cv::Size(0, 0), cv::Size(0, 0), locations);
double res = 0;
for (int i = 0; i < svmDimension - 1; i++)
{
    res += w[i] * descriptorsValues.at(i);
}
res = res + w[svmDimension - 1];            
return res;

其中svmDimension是包含SVM权重后跟SVM截距的数组/向量,res是SVM响应

答案 1 :(得分:0)

您可以读取文件并将每个值推回到float的数组中,因此首先声明它:

vector<float> myDescriptorVector;

然后推送每个值:

ifstream infile ("yourFile.dat".c_str());

float number;

while (infile >> number)
    myDescriptorVector.push_back(number);


return myDescriptorVector;

最后,对HOG使用标准初始化,然后将向量传递到SVM检测器,就像您已经猜到的那样:

hog.setSVMDetector(myDescriptorVector);