【问题标题】:labeling data in SVM opencv c++在SVM opencv c ++中标记数据
【发布时间】:2012-04-07 11:19:36
【问题描述】:

我正在尝试在 opencv 中为我使用 SIFT 提取特征的特征实现 SVM。我已经提取了 2 个不同对象的特征(每个对象都有 10 个不同图像的特征,我总共为一个对象获得了 3000 多个特征)并将这些特征放在一个文件中(yaml 文件)..

我的问题是:我不知道如何标记它们?所以我需要标记这两个文件(正如我所说的每个文件都是 yaml 的类型,它包含矩阵 3260*128,第二个对象的第二个 yaml 文件是 3349*128)...

所以请帮我告诉我如何标记这些文件以便以后训练它们......我正在使用 openCV c++.. 顺便说一下,SVM 的 openCV 代码是基于 LIBSVM 的

在此感谢您

【问题讨论】:

  • 试用 opencv 示例附带的 letter-recog.cpp 示例
  • 在 letter-recog.cpp 中,数据已经被标记并且它们都在同一个文件中,就我而言;我有 2 个文件,每个文件对应一个对象

标签: c++ opencv svm libsvm


【解决方案1】:

假设您正确获取了矩阵,并且每一行代表一个样本,您可以做的类似于 Lakesh 建议的:

Cv::Mat anger, disgust;
// Load the data into anger and disgust
...
// Make sure anger.cols == disgust.cols 
// Combine your features from different classes into one big matrix
int numPostives = anger.rows, numNegatives = disgust.rows;
int numSamples = numPostives+numNegatives;
int featureSize = anger.cols;
cv::Mat data(numSamples, featureSize, CV_32FC1) // Assume your anger matrix is in float type
cv::Mat positiveData = data.rowRange(0, numPostives);
cv::Mat negativeData = data.rowRange(numPostives, numSamples);
anger.copyTo(positiveData);
disgust.copyTo(negativeData);
// Create label matrix according to the big feature matrix
cv::Mat labels(numSamples, 1, CV_32SC1);
labels.rowRange(0, numPositives).setTo(cv::Scalar_<int>(1));
labels.rowRange(numPositives, numSamples).setTo(cv::Scalar_<int>(-1));
// Finally, train your model
cv::SVM model;
model.train(data, labels, cv::Mat(), cv::Mat(), cv::SVMParams());

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    标签很容易。只需将其中一个类/对象标记为 1,另一个标记为 -1。

                      case 'Anger'
                         CVTrainLabel = [CVTrainLabel;1];
                         Hist = UniformLBP2(I1);
                         CVTrainVec = [CVTrainVec;Hist];
                         continue;
                     case 'Disgust'
                        CVTrainLabel = [CVTrainLabel;-1];
                         Hist = UniformLBP2(I1);
                         CVTrainVec = [CVTrainVec;Hist];
    

    【讨论】:

    • 你有代码示例吗.. 别忘了我这里有 2 个文件,每个文件都包含某个对象的功能
    • 嘿lakesh,我没明白你的意思:(....假设我有一个文件是Anger.yaml(其中包含第一个对象的特征)和第二个文件哪个是 Disgust.yaml(包含第二个对象特征),那么在这种情况下该怎么做呢?我已经使用函数 filestorage 加载它,我可以正确读取这些文件中的矩阵...
    • 这是我的建议:编写一个单独的代码来加载功能,同时分配标签作为示例。当你加载愤怒文件时,在现有标签上加1,当你厌恶时,在现有标签上加-1...
    • 我认为你的代码是 python,因为我看不出它接近 c++.. 或者我求你提供更多关于它的细节,因为我真的很困惑
    猜你喜欢
    • 2015-09-26
    • 2016-01-08
    • 2015-04-18
    • 2015-08-14
    • 2014-05-21
    • 1970-01-01
    • 2015-03-15
    • 2015-04-20
    • 2011-06-25
    相关资源
    最近更新 更多