使用 OpenCV 进行图像分类的 K-均值聚类

之前的教程中,我们探讨了将 k-means 聚类算法作为一种无监督机器学习技术,该技术旨在将相似数据分组到不同的簇中,以发现数据中的模式。 

到目前为止,我们已经看到了如何将 k-means 聚类算法应用于包含不同簇的简单二维数据集以及图像颜色量化问题。 

在本教程中,您将学习如何应用 OpenCV 的 k-means 聚类算法进行图像分类。 

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

  • 为什么 k-means 聚类可以应用于图像分类。 
  • 将 k-means 聚类算法应用于 OpenCV 中的数字数据集进行图像分类。 
  • 如何减少由于倾斜导致的数字变化,以提高 k-means 聚类算法在图像分类中的准确性。 

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


让我们开始吧。

使用 OpenCV 进行图像分类的 K-均值聚类
图片由 Jeremy Thomas 拍摄,保留部分权利。

教程概述

本教程分为两部分;它们是

  • 作为无监督机器学习技术的 k-Means 聚类回顾
  • 将 k-Means 聚类应用于图像分类

作为无监督机器学习技术的 k-Means 聚类回顾

之前的教程中,我们介绍了 k-means 聚类作为一种无监督学习技术。 

我们已经看到,这种技术涉及将数据自动分组到不同的组(或簇)中,其中每个簇内的数据彼此相似,但与其他簇中的数据不同。它旨在发现聚类之前可能不明显的数据模式。 

我们已将 k-means 聚类算法应用于包含五个簇的简单二维数据集,以相应地标记属于每个簇的数据点,随后应用于颜色量化任务,我们使用此算法来减少表示图像的不同颜色的数量。 

在本教程中,我们将再次利用 k-means 聚类的强大功能,通过将其应用于图像分类任务来发现数据中的隐藏结构。 

对于此类任务,我们将使用之前教程中介绍的 OpenCV 数字数据集,我们将尝试以无监督方式(即不使用真实标签信息)对相似手写数字图像进行分组。 

将 k-Means 聚类应用于图像分类

我们首先需要加载 OpenCV 数字图像,将其分成许多子图像,这些子图像包含从 0 到 9 的手写数字,并创建相应的真实标签,这将使我们能够稍后量化 k-means 聚类算法的性能。

返回的 imgs 数组包含 5,000 个子图像,按行组织成扁平的一维向量形式,每个向量包含 400 个像素。

随后可以为 k-means 算法提供与我们用于颜色量化示例的输入参数相同的输入参数,唯一的例外是我们需要将 imgs 数组作为输入数据传递,并且我们将把 K 簇的值设置为 10(即我们可用的数字数量)。

kmeans 函数返回一个 centers 数组,该数组应包含每个簇的代表性图像。返回的 centers 数组的形状为 10×400,这意味着我们需要先将其重塑回 20×20 像素图像,然后才能进行可视化。

聚类中心的代表性图像如下所示:

k-Means 算法发现的聚类中心的代表性图像

值得注意的是,k-means 算法生成的聚类中心确实与 OpenCV 数字数据集中包含的手写数字相似。 

您可能还会注意到,聚类中心的顺序不一定遵循数字 0 到 9 的顺序。这是因为 k-means 算法可以将相似数据聚类在一起,但对其顺序没有概念。然而,这在比较预测标签和真实标签时也会产生问题。这是因为真实标签已生成以对应图像中显示的数字。但是,k-means 算法生成的聚类标签不一定遵循相同的约定。为了解决这个问题,我们需要*重新排序*聚类标签。

现在我们准备好计算算法的准确性,通过查找与真实值对应的预测标签的百分比。

到此为止的完整代码如下:

现在,让我们打印出混淆矩阵,以更深入地了解哪些数字被误认为是其他数字。

混淆矩阵应按以下方式解释:

解释混淆矩阵

对角线上的值表示正确预测的数字数量,而对角线外的值表示每个数字的错误分类。我们可以看到,性能最好的数字是*0*,对角线值最高,误分类非常少。性能最差的数字是*9*,因为它与许多其他数字(主要是 4)的误分类数量最多。我们还可以看到,*7* 主要被误认为是 4,而*8* 主要被误认为是*3*。 

这些结果并不令人意外,因为如果我们查看数据集中的数字,我们会发现几个不同数字的曲线和倾斜导致它们彼此相似。为了研究减少数字变化的效果,让我们引入一个函数 deskew_image(),它根据从图像矩计算的倾斜度量对图像应用仿射变换。

去倾斜功能对某些数字有以下影响:

第一列显示原始数据集图像,第二列显示经过倾斜校正的图像

值得注意的是,当数字的倾斜度降低时,准确性提高到 70.92%,同时聚类中心更能代表数据集中的数字。

k-Means 算法发现的聚类中心的代表性图像

该结果表明,倾斜是导致我们在未进行校正时准确性下降的一个重要因素。 

您还能想到哪些可以提高准确性的预处理步骤?

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

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

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

进一步阅读

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

书籍

网站

总结

在本教程中,您学习了如何将 OpenCV 的 k-means 聚类算法应用于图像分类。

具体来说,你学到了:

  • 为什么 k-means 聚类可以应用于图像分类。 
  • 将 k-means 聚类算法应用于 OpenCV 中的数字数据集进行图像分类。 
  • 如何减少由于倾斜导致的数字变化,以提高 k-means 聚类算法在图像分类中的准确性。 

你有什么问题吗?

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

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

Machine Learning in OpenCV

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

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

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

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

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


查看内容

, , ,

使用 OpenCV 进行图像分类的 K-Means 聚类 的 2 条回复

  1. shincheng 2023年11月1日 下午5:56 #

    对于此类任务,我们将使用“之前的教程”中介绍的 OpenCV 数字数据集。

    “之前的教程”中嵌入的链接无效。

    • James Carmichael 2023年11月2日 上午10:46 #

      感谢您的反馈,shincheng!

发表回复

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