OpenCV SVM分类器图像识别

时间:2019-03-25 09:12:01

标签: c++ svm opencv3.0

我正在使用C ++和OpenCV 3.3.1
我尝试使用OpenCV训练SVM,我的步骤是:

  1. 预处理图像
  2. 使用SURF进行特征提取
  3. 创建数据集以学习正负图像
  4. 重塑“图像1行1”功能
  5. 使用-1表示负数,用+1表示正数创建labels
  6. 学习SVM
  7. 预测

现在我的问题是: 假设我的图片是128 x 128,提取特征后我得到了一个Mat 重塑后有16行和128列,我得到了1行和2048列,现在使用这种大小的行和列对SVM进行了训练。当我尝试使用SVM进行预测时,我遇到了一个问题,即SVM需要相同大小的特征Mat(1行和2048列),但是我的prediciton图像具有与学习图像相比更多的特征,因此用于预测的Mat是一种方法根据需要更大。

与我用于学习的图像相同的预测效果很好,所以我猜SVM可以工作。

如何使用SVM获得更大的图像?

1 个答案:

答案 0 :(得分:1)

通过将SURF / SIFT描述符设为1X 2048功能来使用它并不是一个好主意,原因有二:

  1. 您正在限制每个图像的有用功能数量(= 16),并且如果功能数量不同于16,则会出现错误。即使您每次强制使用16个功能,也可能最终失去了功能,因此结果会降低

  2. 您正在训练2048维的SVM分类器,而无需利用提取的特征描述符之间的任何关系。

更强大,更标准的方法是使用“语言袋”。 您可以使用单词袋和直方图方法从SIFT功能中获得K维描述符,然后在该K维描述符上训练SVM分类器,每幅图像的信息都是相同的。

此链接可能对您有帮助,

https://www.codeproject.com/Articles/619039/Bag-of-Features-Descriptor-on-SIFT-Features-with-O

如果要使用MATLAB;然后vlfeat具有整个管道的实现。