顔のパッチ辞書をプロットする

Machine LearningMachine LearningBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、scikit - learn APIを使って大規模な顔画像データセットを処理し、顔を表す20x20の画像パッチのセットを学習する方法を示します。この実験の重要なポイントはオンライン学習の使用で、画像を1枚ずつ読み込んで処理し、各画像から50個のランダムなパッチを抽出します。500個のパッチ(10枚の画像から)を蓄積した後、オンラインKMeansオブジェクトであるMiniBatchKMeansのpartial_fitメソッドを実行します。

VMのヒント

VMの起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebookを使って練習します。

時々、Jupyter Notebookが読み込み終了するまで数秒待つ必要があります。Jupyter Notebookの制限により、操作の検証を自動化することはできません。

学習中に問題がある場合は、Labbyにお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/cluster("Clustering") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/feature_extraction("Feature Extraction") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/cluster -.-> lab-49104{{"顔のパッチ辞書をプロットする"}} sklearn/feature_extraction -.-> lab-49104{{"顔のパッチ辞書をプロットする"}} ml/sklearn -.-> lab-49104{{"顔のパッチ辞書をプロットする"}} end

データの読み込み

まず、scikit - learnからOlivetti facesデータセットを読み込みます。

from sklearn import datasets

faces = datasets.fetch_olivetti_faces()

画像の辞書を学習する

画像の辞書を学習するためにMiniBatchKMeansを使用します。クラスタ数を81に設定し、乱数シードを設定し、詳細モードを有効にします。その後、パッチを格納するためのバッファを作成し、データセット内の各画像を反復処理します。各画像から50個のパッチを抽出し、データを整形します。その後、データをバッファに追加し、インデックスをインクリメントします。インデックスが10の倍数の場合、バッファを連結し、データに対してpartial_fitを実行します。インデックスが100の倍数の場合、これまでにフィットさせたパッチの数を表示するメッセージを出力します。

import time
import numpy as np
from sklearn.cluster import MiniBatchKMeans
from sklearn.feature_extraction.image import extract_patches_2d

print("Learning the dictionary... ")
rng = np.random.RandomState(0)
kmeans = MiniBatchKMeans(n_clusters=81, random_state=rng, verbose=True, n_init=3)
patch_size = (20, 20)

buffer = []
t0 = time.time()

## The online learning part: cycle over the whole dataset 6 times
index = 0
for _ in range(6):
    for img in faces.images:
        data = extract_patches_2d(img, patch_size, max_patches=50, random_state=rng)
        data = np.reshape(data, (len(data), -1))
        buffer.append(data)
        index += 1
        if index % 10 == 0:
            data = np.concatenate(buffer, axis=0)
            data -= np.mean(data, axis=0)
            data /= np.std(data, axis=0)
            kmeans.partial_fit(data)
            buffer = []
        if index % 100 == 0:
            print("Partial fit of %4i out of %i" % (index, 6 * len(faces.images)))

dt = time.time() - t0
print("done in %.2fs." % dt)

結果をプロットする

最後に、顔のパッチをプロットし、学習時間を表示します。

import matplotlib.pyplot as plt

plt.figure(figsize=(4.2, 4))
for i, patch in enumerate(kmeans.cluster_centers_):
    plt.subplot(9, 9, i + 1)
    plt.imshow(patch.reshape(patch_size), cmap=plt.cm.gray, interpolation="nearest")
    plt.xticks(())
    plt.yticks(())


plt.suptitle(
    "Patches of faces\nTrain time %.1fs on %d patches" % (dt, 8 * len(faces.images)),
    fontsize=16,
)
plt.subplots_adjust(0.08, 0.02, 0.92, 0.85, 0.08, 0.23)

plt.show()

まとめ

この実験では、オンライン学習を使って大規模な顔画像データセットを処理し、顔を表す画像パッチのセットを学習する方法を示しました。画像の辞書を学習するためにMiniBatchKMeansを使用し、結果をプロットしました。