OpenCV SVM 分类器图像识别

OpenCV SVM Classifier Image Recognition

本文关键字:图像识别 分类器 SVM OpenCV      更新时间:2023-10-16

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

  1. 预处理图像
  2. 使用 SURF 进行特征提取
  3. 创建用于学习正图像和负图像的数据集
  4. 重塑图像 1 行 1 特征
    的形状
  5. 创建标签,-1 表示负数,+1 表示正数
  6. 学习支持向量机
  7. 预测

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

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

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

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

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

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

更健壮和标准的方法是使用单词袋。 您使用词袋和直方图方法从 SIFT 特征中获得 K 维描述符,然后在此 K 维描述符上训练 SVM 分类器,wchih 将为每个图像相同。

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

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

如果你想使用MATLAB;那么vlfeat可以实现整个管道。