計算機視覺 - 影像分類



什麼是影像分類?

影像分類是根據特定規則對影像中畫素或向量組進行分類和標記的過程。

它涉及為整個影像分配標籤或類別,例如識別影像中是否包含貓、狗或任何其他物體。

影像分類的重要性

影像分類對於各種應用非常重要,例如:

  • 醫療保健:對醫學影像進行分類以檢測疾病。
  • 安全:識別監控錄影中的人臉或物體。
  • 零售:對產品進行分類並自動化庫存管理。
  • 自動駕駛汽車:識別道路上的交通標誌、行人和其他物體。

影像分類技術

影像分類有多種技術,包括:

  • 傳統方法
  • 基於機器學習的方法
  • 基於深度學習的方法

傳統方法

傳統的影像分類方法依賴於影像處理技術和定製構建的特徵。

這些方法的準確性低於現代基於機器學習的方法,但更簡單、更快。

以下是常用的傳統影像分類方法:

  • 模板匹配:將輸入影像與一組模板影像進行比較。此方法簡單但對於複雜影像不太有效。
  • 特徵提取 + 分類器:涉及從影像中提取特徵並使用分類器對其進行分類。例如,使用邊緣檢測和紋理分析,然後使用決策樹分類器。

基於機器學習的方法

基於機器學習的方法使用從資料中學習的演算法來對影像進行分類。這些方法通常涉及從影像中提取特徵並在標記的資料集上訓練分類器。

以下是常用的機器學習影像分類方法:

  • 支援向量機 (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

# Load dataset
digits = datasets.load_digits()
X = digits.data
y = digits.target

# Split dataset
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Train k-NN classifier
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)

# Predict and evaluate
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 layers, models
    
    # Build the CNN model
    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:訓練模型。
  • # Load dataset
    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
    
    # Expand dimensions to match the input shape of the model
    X_train = X_train[..., tf.newaxis]
    X_test = X_test[..., tf.newaxis]
    
    # Train the model
    model.fit(X_train, y_train, epochs=5, validation_data=(X_test, y_test))
    
  • 步驟 4:評估模型。
  • # Evaluate the model
    test_loss, test_acc = model.evaluate(X_test, y_test, verbose=2)
    print("Test accuracy:", test_acc)
    
廣告