使用 OpenCV 进行图像分类和检测的支持向量机

之前的教程中,我们探讨了支持向量机(SVM)算法作为OpenCV库中最受欢迎的监督式机器学习技术之一。

到目前为止,我们已经看到了如何将支持向量机应用于我们生成的一个自定义数据集,该数据集由两个类别的二维点组成。

在本教程中,您将学习如何将OpenCV的支持向量机算法应用于解决图像分类和检测问题。 

完成本教程后,您将了解:

  • 支持向量机的几个最重要的特征。
  • 如何将支持向量机应用于图像分类和检测问题。 

通过我的书《OpenCV 机器学习启动您的项目。它提供了带有可用代码自学教程


让我们开始吧。 

使用 OpenCV 进行图像分类和检测的支持向量机
照片由Patrick Ryan拍摄,保留部分权利。

教程概述

本教程分为三个部分;它们是:

  • 支持向量机工作原理回顾
  • 将SVM算法应用于图像分类
  • 使用SVM算法进行图像检测

支持向量机工作原理回顾

之前的教程中,我们介绍了在OpenCV库中使用支持向量机(SVM)算法。到目前为止,我们已将其应用于我们生成的一个自定义数据集,该数据集由两个类别的二维点组成。

我们已经看到,SVM通过计算一个决策边界来将数据点分离到不同的类别,该边界最大化到每个类中最近数据点的间隔,这些最近数据点称为支持向量。通过调整称为C的参数,可以放宽最大化间隔的约束,该参数控制最大化间隔与减少训练数据上的误分类之间的权衡。 

SVM算法可能使用不同的核函数,这取决于输入数据是否是线性可分的。对于非线性可分数据,可以使用非线性核将数据转换为更高维的空间,使其线性可分。这类似于SVM在原始输入空间中找到非线性决策边界。 

将SVM算法应用于图像分类

我们将在此任务中使用OpenCV中的数字数据集,尽管我们开发的代码也可以用于其他数据集。 

想开始学习 OpenCV 机器学习吗?

立即参加我的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

我们的第一步是加载OpenCV数字图像,将其分成包含0到9手写数字的许多子图像,并创建相应的真实标签,以便稍后量化训练的SVM分类器的准确性。对于这个特定的例子,我们将分配80%的数据集图像用于训练集,剩余20%的图像用于测试集。

下一步是创建一个使用RBF核的OpenCV SVM。正如我们在之前的教程中所做的那样,我们必须设置与SVM类型和核函数相关的几个参数值。我们还将包括终止条件,以停止SVM优化问题的迭代过程。

与其在原始图像数据上训练和测试SVM,不如先将每个图像转换为其HOG描述符,如本教程中所述。HOG技术通过利用图像的局部形状和外观,旨在更紧凑地表示图像。在HOG描述符上训练分类器可能会增加其区分不同类别的判别力,同时降低处理数据的计算成本。

最后,我们可以对HOG描述符进行SVM训练,并根据测试数据预测标签,然后计算分类器的准确性。

对于这个特定的例子,Cgamma的值是凭经验设置的。然而,建议采用像网格搜索算法这样的调优技术来研究是否存在更好的超参数组合来进一步提高分类器的准确性。 

完整的代码清单如下

使用SVM算法进行图像检测

可以将我们上面开发的思想从图像分类扩展到图像检测,后者指的是在图像中识别和定位感兴趣的对象。 

我们可以通过在较大图像(我们将称之为测试图像)的不同位置重复上一节开发的图像分类来实现这一点。 

在这个例子中,我们将创建一个包含OpenCV数字数据集中随机选择的子图像的“拼贴画”的图像,然后尝试检测感兴趣数字的任何出现。

让我们先创建测试图像。我们将通过随机选择数据集中均匀分布的25个子图像,对其顺序进行洗牌,并将它们合并成一个 $100\times 100$ 像素的图像。

生成的测试图像如下所示:

图像检测的测试图像

接下来,我们将创建一个新SVM并像上一节那样进行训练。然而,由于我们现在正在处理一个检测问题,因此真实标签不应对应于图像中的数字;相反,它们应该区分训练集中的正样本和负样本。 

例如,假设我们有兴趣在测试图像中检测数字0的两个实例。因此,在数据集的训练部分中包含0的图像被视为样本,并用类别标签1进行区分。属于其他数字的所有其他图像被视为样本,并用类别标签0进行区分。

一旦我们生成了真实标签,就可以继续在训练数据集上创建并训练SVM。

我们将添加到上述代码列表中的最后一部分代码执行以下操作:

  1. 以预定义的步幅遍历测试图像。
  2. 在每次迭代时,从测试图像中裁剪一个大小与包含数字的子图像(即20 x 20像素)相同的图像块。 
  3. 提取每个图像块的HOG描述符。 
  4. 将HOG描述符输入训练好的SVM以获得标签预测。 
  5. 在找到检测结果时存储图像块坐标。
  6. 在原始测试图像上绘制每个检测到的边界框。 

完整的代码清单如下

结果图像显示我们已成功检测到测试图像中的两个0数字实例。

检测0数字的两个实例

我们考虑了一个简单的例子,但同样的思想可以轻松地改编以解决更具挑战性的现实生活问题。如果您计划将上述代码改编到更具挑战性的问题中:

  • 请记住,感兴趣的对象可能以各种大小出现在图像中,因此您可能需要执行多尺度检测任务。 
  • 在生成用于训练SVM的正负样本时,不要陷入类别不平衡问题。我们在本教程中考虑的例子是变化非常小的图像(我们只限制在10个数字,没有尺度、光照、背景等变化),任何数据集的不平衡似乎对检测结果的影响都很小。然而,现实生活中的挑战通常不像这样简单,类别之间的不平衡分布可能导致性能下降。

进一步阅读

如果您想深入了解此主题,本节提供了更多资源。

书籍

网站

总结

在本教程中,您学习了如何将OpenCV的支持向量机算法应用于解决图像分类和检测问题。

具体来说,你学到了:

  • 支持向量机的几个最重要的特征。
  • 如何将支持向量机应用于图像分类和检测问题。

你有什么问题吗?

在下面的评论中提出您的问题,我将尽力回答。

开始使用 OpenCV 进行机器学习!

Machine Learning in OpenCV

学习如何在图像处理项目中使用机器学习技术

...以高级方式使用 OpenCV,超越像素处理

在我的新电子书中探索如何实现
OpenCV 机器学习

它提供带有所有可用 Python 代码自学教程,让您从新手成长为专家。它为您提供了
逻辑回归随机森林支持向量机k 均值聚类神经网络等等……所有这些都使用 OpenCV 中的机器学习模块

通过动手练习开启你的深度学习之旅


查看内容

, , , ,

暂无评论。

留下回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。