教師なし画像分類とは?とその実践!

python

教師なし画像分類は、ラベル付けされていない画像データをクラスタリングする手法です。このアプローチでは、画像の類似性に基づいてデータをグループ化します。具体的には、以下の手順で行います。

データのベクトル化

画像をベクトルに変換します。例えば、64×64ピクセルのRGB画像をベクトルとして扱います。

k-means法の適用

  • 初期化: クラスタ数だけ重心点をサンプルデータから求めます。
  • クラスタ構築: 各サンプルから最も近い距離にあるデータを計算によって求め、クラスタを構成します。
  • 反復処理: 上記ステップを設定した回数分繰り返し、データを分類します。

実装例

以下は、Pythonで教師なし画像分類を行う例です。使用するライブラリは以下の通りです。

  • pandas
NumPy
  • numpy
scikit-learn
  • scikit-learn (sklearn)
matplotlib
  • matplotlib
  • Pillow
  • opencv-python
  • glob

これらのライブラリがインストールされていない場合は、pipを使用してインストールしてください。

import os
import numpy as np
import cv2
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

def extract_features(image_folder):
    features = []
    for filename in os.listdir(image_folder):
        img = cv2.imread(os.path.join(image_folder, filename))
        if img is not None:
            # 画像を特徴ベクトルに変換
            feature_vector = img.flatten()
            features.append(feature_vector)
    return np.array(features)

def perform_clustering(features, num_clusters=3):
    # 特徴ベクトルを標準化
    scaler = StandardScaler()
    scaled_features = scaler.fit_transform(features)

    # 主成分分析 (PCA) を適用して次元削減
    pca = PCA(n_components=50)
    reduced_features = pca.fit_transform(scaled_features)

    # k-meansクラスタリング
    kmeans = KMeans(n_clusters=num_clusters, random_state=42)
    kmeans.fit(reduced_features)

    return kmeans.labels_

# 画像データのフォルダを指定
image_folder_path = 'path/to/your/image/folder'
image_features = extract_features(image_folder_path)
cluster_labels = perform_clustering(image_features)

print("クラスタリング結果:")
for i, label in enumerate(cluster_labels):
    print(f"画像{i+1}はクラスタ{label+1}に所属")

このコードは、指定したフォルダ内の画像をクラスタリングして表示します。類似する果物画像が分類される傾向がありますが、誤分類もあることに注意してください。

まとめ

教師なし画像分類は、様々なデータに対して応用できる強力な手法です。ぜひ試してみてください!

コメント