在SVM opencv c ++中标记数据
Posted
技术标签:
【中文标题】在SVM opencv c ++中标记数据【英文标题】:labeling data in 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 个文件,每个文件对应一个对象 【参考方案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++.. 或者我求你提供更多关于它的细节,因为我真的很困惑以上是关于在SVM opencv c ++中标记数据的主要内容,如果未能解决你的问题,请参考以下文章
CollectionViewCell 中标签中的数据有时会在重新加载时刷新,有时则不会
新数据,芯成绩丨龙芯中科在多地市中标,多行业信息化项目取得重要突破
vue中如何在子组件添加类似于watch属性监听父组件数据,数据变化时子组件做出相应的动作