我正在使用 C++ 和 OpenCV 3.3.1
我尝试使用 OpenCV 训练 SVM,我的步骤是:
- 预处理图像
- 使用 SURF 进行特征提取
- 创建用于学习正负图像的数据集
- reshape 图像 1 行 1 特征
- 创建 labelsmat,-1 表示负值,+1 表示正值
- 学习支持 vector 机
- 预测
现在我的问题是: 可以说我的图像是 128 x 128 并且在特征提取之后我得到了一个垫子 reshape 后有 16 行和 128 列,我得到 1 行和 2048 列,现在是用这种大小的行和列训练的 SVM。当我尝试用我的支持 vector 机进行预测时,我遇到了一个问题,即支持 vector 机需要相同大小的特征垫(1 行和 2048 列),但我的预测图像与学习图像相比具有更多特征,因此用于预测的垫是一种方式根据需要变大。
使用与我用于学习的图像相同的图像进行预测效果很好,所以我猜 SVM 有效。
如何使用 SVM 处理更大的图像?
最佳答案
通过使它们成为 1X 2048 特征来使用 SURF/SIFT 描述符并不是一个好主意,原因有两个:
您正在限制每张图片的有用特征数量 (=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 实现了整个流水线。
关于c++ - OpenCV SVM 分类器图像识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55334452/