在OpenCV中,有一个CvSVM类,它接受一个样本矩阵来训练SVM。矩阵是二维的,样本在行中。
我创建了自己的方法来从视频馈送中生成定向梯度直方图(HOG)。为此,我创建了一个9通道矩阵来存储HOG,其中每个通道对应一个方向箱。所以最后我得到了一个40x30的CV_32FC(9)
矩阵。
还为HOG做了一个可视化,它正在工作。
我不明白我应该如何将这个矩阵馈送到OpenCV SVM中,因为如果我将它平坦化,我不明白SVM应该如何从1D输入数据中学习9D超平面。
SVM总是每个特征向量取一行数据。特征向量的维数就是行长度。如果你处理的是2D数据,那么每个特征向量就有2个项目。2D数据示例在此网页:
http://www.csie.ntu.edu.tw/cjlin/libsvm/
OpenCV中等效的演示代码http://sites.google.com/site/btabibian/labbook/svmusingopencv关键是,即使你认为直方图是带有9个单元格的2D,但特征向量实际上是它的扁平版本。所以把它平铺成一个长特征向量是正确的。对我来说,结果是一个长度为2304 (16x16x9)的特征向量,我在一个小测试集上得到了100%的预测精度(即它可能略低于100%,但它工作得非常好)。
这样做的原因是支持向量机是在特征向量的每个项目的权重系统上工作的。所以它和问题的维数无关,超平面总是和特征向量在同一个维数上。另一种看待它的方法是忘记超平面,把它看成是特征向量中每一项的权重。在本例中,它需要为每个项设置一个权重,然后将每个项乘以其权重并输出结果。