计算机视觉 - 图像分类

什么是图像分类?

图像分类是根据特定规则对图像中的像素或矢量组进行分类和标记的过程。

它涉及为整个图像分配标签或类别,例如识别图像是否包含猫、狗或任何其他物体。

图像分类的重要性

图像分类对于各种应用都很重要,例如 −

  • 医疗保健:对医学图像进行分类以检测疾病。
  • 安全:识别监控录像中的面部或物体。
  • 零售:对产品进行分类并实现库存管理自动化。
  • 自动驾驶汽车:识别交通标志、行人和道路上的其他物体。

图像分类技术

图像分类有多种技术,它们是−

  • 传统方法
  • 基于机器学习的方法
  • 基于深度学习的方法

传统方法

传统的图像分类方法依赖于图像处理技术和定制特征。

这些方法不如现代基于机器学习的方法准确,但更简单、更快捷。

以下是常用的传统图像分类方法−

  • 模板匹配:将输入图像与一组模板图像进行比较。这种方法简单,但对于复杂图像效果不佳。
  • 特征提取 + 分类器:涉及从图像中提取特征并使用分类器对其进行分类。例如,使用边缘检测和纹理分析,然后使用决策树分类器。

基于机器学习的方法

基于机器学习的方法使用从数据中学习的算法对图像进行分类。这些方法通常涉及从图像中提取特征并在标记数据集上训练分类器。

以下是用于图像分类的常用机器学习方法 −

  • 支持向量机 (SVM):它是一种监督学习模型,可以找到最佳线(或超平面)来分离数据中的不同组。
  • k-最近邻 (k-NN):它是一种简单的方法,通过查看其最近的 k 个邻居并选择其中最常见的类别来对图像进行分类。

以下是如何使用基于机器学习的方法对图像进行分类的示例 −

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 加载数据集
digits = datasets.load_digits()
X = digits.data
y = digits.target

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练 k-NN 分类器
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

# 预测和评估
y_pred = knn.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))

基于深度学习的方法

深度学习方法改变了图像分类,使其更准确,能够处理复杂图像。

这些方法使用卷积神经网络 (CNN) 自动学习特征并对图像进行分类。

以下是用于图像分类的常见深度学习模型−

  • LeNet:它是最早的 CNN 架构之一,旨在识别手写数字。
  • AlexNet:它是一种更深的 CNN,于 2012 年赢得了 ImageNet 竞赛,为图像分类带来了显着的改进。
  • ResNet(残差网络):它使用残差连接来训练非常深的网络,实现顶级性能。

CNN 示例

CNN 或卷积神经网络是一种为处理图像而创建的深度神经网络。它们有几层,可以逐步学习图像的不同特征,而无需手动编程。

您可以按照以下步骤使用 CNN −

  • 步骤 1: 构建 CNN 模型。
  • import tensorflow as tf
    from tensorflow.keras import layer, models
    
    # 构建 CNN 模型
    model = models.Sequential()
    model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    model.add(layers.MaxPooling2D((2, 2)))
    model.add(layers.Conv2D(64, (3, 3), activation='relu'))
    
    model.add(layers.Flatten())
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(10, activation='softmax'))
    
  • 第 2 步: 编译模型。
  • model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
    
  • 第 3 步: 训练模型。
  • # 加载数据集
    mnist = tf.keras.datasets.mnist
    (X_train, y_train), (X_test, y_test) = mnist.load_data()
    X_train, X_test = X_train / 255.0, X_test / 255.0
    
    # 扩展维度以匹配模型的输入形状
    X_train = X_train[..., tf.newaxis]
    X_test = X_test[..., tf.newaxis]
    
    # 训练模型
    model.fit(X_train, y_train, epochs=5, validation_data=(X_test, y_test))
    
  • 步骤 4:评估模型。
  • # 评估模型
    test_loss, test_acc = model.evaluate(X_test, y_test, verbose=2)
    print("Test accuracy:", test_acc)