3

在 OpenCV 中,有一个 CvSVM 类,它接收一个样本矩阵来训练 SVM。矩阵是二维的,样本在行中。

我创建了自己的方法来从视频源中生成方向梯度 (HOG) 的直方图。为此,我创建了一个 9 通道矩阵来存储 HOG,其中每个通道对应一个方向箱。所以最后我有一个 40x30 类型的矩阵CV_32FC(9)

还为 HOG 做了一个可视化,它正在工作。

我看不出我应该如何将此矩阵输入 OpenCV SVM,因为如果我将其展平,我看不出 SVM 应该如何从 1D 输入数据中学习 9D 超平面。

4

1 回答 1

4

SVM 总是在每个特征向量中接收一行数据。因此,特征向量的维数就是行的长度。如果您正在处理 2D 数据,那么每个特征向量有 2 个项目。二维数据示例在此网页上:

http://www.csie.ntu.edu.tw/~cjlin/libsvm/

OpenCV 中的等效演示代码http://sites.google.com/site/btabibian/labbook/svmusingopencv

关键是即使您将直方图视为具有 9 个单元格的 2D,但特征向量实际上是其扁平化版本。所以把它展平成一个长的特征向量是正确的。对我来说,结果是一个长度为 2304 (16x16x9) 的特征向量,我在一个小测试集上获得了 100% 的预测准确度(即它可能略低于 100%,但它的工作非常好)。

之所以可行,是因为 SVM 正在研究特征向量的每个项目的权重系统。所以它与问题的维度没有任何关系,超平面总是与特征向量在同一维度。另一种看待它的方法是忘记超平面,而只是将其视为特征向量中每个项目的一堆权重。在这种情况下,它需要对每个项目进行一个加权,然后将每个项目乘以其权重并输出结果。

于 2011-07-21T23:02:00.400 回答