OpenCV SVM 分类器图像识别
OpenCV SVM Classifier Image Recognition
我正在使用 C++ 和 OpenCV 3.3.1
我尝试用 OpenCV 训练 SVM 我的步骤是:
- 预处理图像
- 使用 SURF 进行特征提取
- 创建用于学习正负图像的数据集
- 重塑图像 1 行 1 特征
- 创建标签垫,-1 表示负值,+1 表示正值
- 学习 SVM
- 预测
现在我的问题是:
可以说我的图像是 128 x 128 并且在特征提取之后我得到了一个垫子
重塑后有 16 行和 128 列,我得到 1 行和 2048 列,现在是用这种大小的行和列训练的 SVM。当我尝试用我的支持向量机进行预测时,我遇到了一个问题,即支持向量机需要相同大小的特征垫(1 行和 2048 列),但我的预测图像与学习图像相比具有更多特征,因此用于预测的垫是一种方式根据需要变大。
使用与我用于学习的图像相同的图像进行预测效果很好,所以我猜 SVM 有效。
如何使用 SVM 处理更大的图像?
通过使描述符成为 1X 2048 特征来使用 SURF/SIFT 描述符并不是一个好主意,原因有两个:
您正在限制每个图像的有用特征数量 (=16),如果特征数量不同于 16,则会出现错误。即使你每次都强制使用 16 个特征,你最终可能会失去特征,因此结果会降低
您正在为 2048 维训练 SVM 分类器,没有利用提取的特征描述符之间的任何关系。
更稳健和标准的方法是使用词袋。
你使用词袋和直方图方法从 SIFT 特征中得到 K 维描述符,然后你在这个 K 维描述符上训练 SVM 分类器,每个图像都相同。
这篇link可能对你有帮助,
https://www.codeproject.com/Articles/619039/Bag-of-Features-Descriptor-on-SIFT-Features-with-O
如果你想使用MATLAB;然后 vlfeat 实现了整个流水线。
我正在使用 C++ 和 OpenCV 3.3.1
我尝试用 OpenCV 训练 SVM 我的步骤是:
- 预处理图像
- 使用 SURF 进行特征提取
- 创建用于学习正负图像的数据集
- 重塑图像 1 行 1 特征
- 创建标签垫,-1 表示负值,+1 表示正值
- 学习 SVM
- 预测
现在我的问题是: 可以说我的图像是 128 x 128 并且在特征提取之后我得到了一个垫子 重塑后有 16 行和 128 列,我得到 1 行和 2048 列,现在是用这种大小的行和列训练的 SVM。当我尝试用我的支持向量机进行预测时,我遇到了一个问题,即支持向量机需要相同大小的特征垫(1 行和 2048 列),但我的预测图像与学习图像相比具有更多特征,因此用于预测的垫是一种方式根据需要变大。
使用与我用于学习的图像相同的图像进行预测效果很好,所以我猜 SVM 有效。
如何使用 SVM 处理更大的图像?
通过使描述符成为 1X 2048 特征来使用 SURF/SIFT 描述符并不是一个好主意,原因有两个:
您正在限制每个图像的有用特征数量 (=16),如果特征数量不同于 16,则会出现错误。即使你每次都强制使用 16 个特征,你最终可能会失去特征,因此结果会降低
您正在为 2048 维训练 SVM 分类器,没有利用提取的特征描述符之间的任何关系。
更稳健和标准的方法是使用词袋。 你使用词袋和直方图方法从 SIFT 特征中得到 K 维描述符,然后你在这个 K 维描述符上训练 SVM 分类器,每个图像都相同。
这篇link可能对你有帮助,
https://www.codeproject.com/Articles/619039/Bag-of-Features-Descriptor-on-SIFT-Features-with-O
如果你想使用MATLAB;然后 vlfeat 实现了整个流水线。