Hu 矩和 SVM 不起作用
Posted
技术标签:
【中文标题】Hu 矩和 SVM 不起作用【英文标题】:Hu moments and SVM does not work 【发布时间】:2014-05-15 02:13:16 【问题描述】:我在尝试使用 SVM 训练数据时遇到了一个问题。 我从人脸图像中得到了一些不同的区域(一组连接的像素),而眼睛的区域非常相似,所以我想使用 Hu 矩进行形状描述和 SVM 进行训练。 但是 SVM 不能正常工作,方法 svm.predict 之后将所有内容评估为非眼睛,此外,在训练阶段标记和使用的相同区域作为眼睛,被评估为非眼睛。 特征数据仅包含 7 个 Hu 矩。稍后我会在这里发布一些源代码示例,在此先感谢:)
附加信息:
输入图像: http://i.stack.imgur.com/GyLO0.png
为 1 张图片设置基本 svm:
int image_regions = 10;
Mat training_mat(image_regions ,7,CV_32FC1); // 7 hu moments
Mat labels(image_regions ,1,CV_32FC1); // for labels 1 (eye) and -1 (non eye)
// computing hu moments
Moments moments2=moments(croppedImage,false);
double hu[7];
HuMoments(moments2,hu);
// putting them into svm traning mat
for (int k=0;k<huCounter;k++)
training_mat.at<float>(counter,k) = hu[k]; // counter is current number of region
if (isEye(...))
labels.at<float>(counter,0)=1.0;
else
labels.at<float>(counter,0)=-1.0;
//I use the following:
CvSVM svm;
CvSVMParams params;
params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, 1e-6);
// ... do the above mentioned phase, and then:
svm.train(training_mat, labels, Mat(), Mat(), params);
【问题讨论】:
7 个幽默可能不足以进行分类的“特征空间” 你只有 10 个特征/幽默来训练? 大家好,我只是在对训练阶段使用的相同数据进行训练后尝试运行 SVM,但我仍然得到 svmpredict() 响应 -1(非眼睛)的结果,甚至在标记为 1(眼睛)的特征上 【参考方案1】:希望下面的建议可以帮到你……..
最简单的任务是使用聚类算法并尝试将数据聚类为两类。如果像“k-means”这样的算法可以完成这项工作,为什么还要使用 SVM 和神经网络来让事情变得复杂。我建议您使用这种技术,因为您的特征向量维度非常小(7 Hu Moments)以及您的样本数量。
执行特征归一化(在第 4 点中指定)以确保值落在有限范围内。
查看“您的数据真的可分离吗?”由于您的数据很小,请从正图像中获取一些样本,从负图像中获取一些样本并绘制特征向量。如果您可以直观地看到差异,那么任何学习算法都可以为您完成这项工作。正如我之前所说,简单的技巧比复杂的数学做得更好。
只有当您决定使用 SVM 时,您才应该了解以下内容:
• 从您的代码中可以看出,您使用的是线性 SVM,可能是您的数据不能被线性内核分离。尝试使用一些多项式内核或其他内核。 openCV 有一个选项 bool CvSVM::train_auto 看看就好。
• 尝试检查你得到的特征向量值是否是正确的值(确保它们不是一些垃圾值)。
• 您还可以在将其用于训练之前执行特征归一化“ZERO MEAN and UNIT VARIENCE”。
• 最重要的是增加训练图像的数量,包括正面和负面标记。
• 最后但同样重要的是,SVM 并不神奇,归根结底,它只是在两组点之间画一条线。所以不要指望它会把你给它的任何东西分类为输入。
如果没有任何效果“只需改进您的特征提取技术”
【讨论】:
以上是关于Hu 矩和 SVM 不起作用的主要内容,如果未能解决你的问题,请参考以下文章