OpenCV SVM分类器图像识别

问题描述 投票:0回答:1

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

  1. 预处理图像
  2. SURF特征提取
  3. 创建用于学习正面和负面图像的DataSet
  4. 重塑图像1行1功能
  5. 使用-1为negativ创建labelsmat,为positiv创建+1
  6. 学习SVM
  7. 预测

现在我的问题:让我说我的图像是128 x 128并且在特征提取后我得到了一个有16行和128列的Mat,重新形状后我得到1行和2048列,现在是用这种大小的行和列训练的SVM。当我尝试使用我的SVM进行预测时,我遇到了SVM需要相同大小的Mat(1行和2048列)的问题但是我的预测图像获得了更多的功能作为学习图像所以预测Mat是一种方式根据需要更大。

使用与我用于学习相同的图像的预测效果很好,所以我猜SVM是有效的。

如何将SVM用于更大的图像?

c++ svm opencv3.0
1个回答
1
投票

使用SURF / SIFT描述符使它们成为1X 2048特征并不是一个好主意,原因有两个:

  1. 您限制每个图像的有用功能数量(= 16),如果功能数量不同于16,则会出现错误。即使您每次强制使用16个功能,最终也可能会丢失功能,因此结果会降低
  2. 您正在训练2048维度的SVM分类器,而不使用提取的特征描述符之间的任何关系。

更加强大和标准的方法是使用Bag of Words。您可以使用词袋和直方图方法从SIFT特征获得K维描述符,然后在此K维描述符上训练SVM分类器,wchih将与每个图像相同。

此链接可能对您有所帮助,

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

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

© www.soinside.com 2019 - 2024. All rights reserved.