scikit learn 中 SVM 的 SURF 功能

Posted

技术标签:

【中文标题】scikit learn 中 SVM 的 SURF 功能【英文标题】:SURF features for SVM in scikit learn 【发布时间】:2015-08-13 06:27:13 【问题描述】:

我一直在尝试使用 SURF 功能来制作带有 sklearn SVM 的分类器(以识别一类对象)。 我一直遇到特征向量维度的问题。 我已经生成了一个特征对象数组和一个描述符数组,但是我用什么作为特征向量呢? 我尝试将特征和描述符直接作为参数传递,如下所示:

sd = cv2.FeatureDetector_create("SURF")
keypoints = sd.detect(img)
kp,des = surf.compute(img, keypoints)
model = svm.SVC()
model.fit(des,['type1'])

我是否必须提取特征对象或描述符数组的属性才能得到最终的特征向量?特征向量的维度应该是多少?不应该是一个向量数组(一个向量代表一个关键点)吗?

【问题讨论】:

为什么不尝试任何你能做的,看看有什么效果呢?我可能会从关键点数组开始。 好吧,我尝试将点特征的角度和坐标放入向量列表中,但似乎每个向量都需要一个标签。我收到一条错误消息,提示“X 和 y 的形状不兼容”。我的问题是:为什么每个向量都有一个标签?我们不应该为向量列表设置一个标签吗(因为整个向量列表代表一张图像)? 输入到 SVM 的每个向量都是一个单独的训练项。因此,您对相关图像的所有了解都需要放入一个向量中。然后你需要给它很多向量,代表很多图像。我认为您对图像特征和 SVM 特征有一些基本的误解,这就是您目前困惑的原因。 你是对的。我试图以某种方式将单个关键点的图像特征与 NLP 中用于整个文档的 TF/IDF 联系起来,结果完全搞糊涂了。不过现在明白了。 【参考方案1】:

我解决了。问题是将多维描述符“展平”为描述整个关键点集的单维向量。我将图像的大小调整为标准的行数和列数,并将二维像素网格展平为一维数组。数组中的每个元素唯一标识一个像素并取值 1 或 0(1 表示它是一个关键点)。如果我想为每个关键点添加更多描述性特征,我可以用类似的格式扩展数组(扩展中数组元素的值将是描述性特征的值)。这使得一个单维向量包含整个图像所需的特征信息。

【讨论】:

以上是关于scikit learn 中 SVM 的 SURF 功能的主要内容,如果未能解决你的问题,请参考以下文章

目标的缩放导致 Scikit-learn SVM 回归崩溃

scikit-learn 在管道中使用多个类预处理 SVM

在手写数字示例中使用 scikit-learn 实现 SVM 的特征提取器

如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python

使用 scikit-learn 重新拟合 SVM

带有 SVM 回归的 Scikit-learn 网格搜索