我正在使用C ++和OpenCV 3.3.1
我尝试使用OpenCV训练SVM,我的步骤是:
现在我的问题是: 假设我的图片是128 x 128,提取特征后我得到了一个Mat 重塑后有16行和128列,我得到了1行和2048列,现在使用这种大小的行和列对SVM进行了训练。当我尝试使用SVM进行预测时,我遇到了一个问题,即SVM需要相同大小的特征Mat(1行和2048列),但是我的prediciton图像具有与学习图像相比更多的特征,因此用于预测的Mat是一种方法根据需要更大。
与我用于学习的图像相同的预测效果很好,所以我猜SVM可以工作。
如何使用SVM获得更大的图像?
答案 0 :(得分:1)
通过将SURF / SIFT描述符设为1X 2048功能来使用它并不是一个好主意,原因有二:
您正在限制每个图像的有用功能数量(= 16),并且如果功能数量不同于16,则会出现错误。即使您每次强制使用16个功能,也可能最终失去了功能,因此结果会降低
您正在训练2048维的SVM分类器,而无需利用提取的特征描述符之间的任何关系。
更强大,更标准的方法是使用“语言袋”。 您可以使用单词袋和直方图方法从SIFT功能中获得K维描述符,然后在该K维描述符上训练SVM分类器,每幅图像的信息都是相同的。
此链接可能对您有帮助,
https://www.codeproject.com/Articles/619039/Bag-of-Features-Descriptor-on-SIFT-Features-with-O
如果要使用MATLAB;然后vlfeat具有整个管道的实现。