【0から学ぶAI】第231回:データ拡張の実践 〜画像データを増やす方法を説明

目次

前回のおさらいと今回のテーマ

こんにちは!前回は、モデルの保存と読み込みについて解説しました。Kerasを使って訓練済みモデルをファイルに保存し、後から再利用する方法を学びました。これにより、モデルの開発と運用が効率的に行えるようになりましたね。

今回は、データ拡張(Data Augmentation)について学びます。データ拡張は、限られたデータセットから新たなデータを生成し、モデルの訓練に活用するテクニックです。特に画像データセットでは、この手法を使うことで、モデルがより多様なパターンを学習し、精度が向上します。この記事では、Kerasを使って画像データを拡張する具体的な方法とその効果を詳しく解説していきます。

データ拡張とは?

データ拡張(Data Augmentation)は、既存のデータに対して様々な変換を行い、モデルが訓練に使用するデータを増やす技術です。特にディープラーニングでは、大量のデータが必要ですが、すべてのケースでデータを大量に集めることは難しいため、データ拡張が活用されます。

代表的なデータ拡張の手法

  1. 回転(Rotation): 画像を一定角度で回転させる。
  2. 水平/垂直反転(Flip): 画像を左右または上下に反転させる。
  3. ズーム(Zoom): 画像を拡大または縮小する。
  4. シフト(Shift): 画像を上下左右にシフト(移動)させる。
  5. ノイズの追加(Noise Addition): ランダムなノイズを画像に加える。
  6. カラーの変換(Color Transformation): 画像の明るさ、コントラスト、色相を変更する。

これらの変換を組み合わせて新たなデータを生成することで、モデルが様々なパターンを学習しやすくなり、過学習を防ぐ効果もあります。

Kerasを使ったデータ拡張の実装

Kerasには、画像データの拡張を簡単に行うためのImageDataGeneratorクラスが用意されています。このクラスを使うと、訓練データに対してリアルタイムでデータ拡張が行われ、効率的にモデルを訓練できます。それでは、実際にImageDataGeneratorを使ってデータ拡張を実装してみましょう。

1. 必要なライブラリのインポート

まず、TensorFlowとKerasのライブラリをインポートします。

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt

2. データの準備

今回は、Kerasに組み込まれているCIFAR-10データセットを使用してデータ拡張を行います。このデータセットは、10種類のクラスからなる小さなカラー画像で構成されています。

# CIFAR-10データセットの読み込み
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()

# 画像データを0-1にスケーリング
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0

3. データ拡張の設定

ImageDataGeneratorを使って、画像データに対する拡張を設定します。

# データ拡張の設定
datagen = ImageDataGenerator(
    rotation_range=20,        # 20度までのランダムな回転
    width_shift_range=0.1,    # 画像を左右に最大10%シフト
    height_shift_range=0.1,   # 画像を上下に最大10%シフト
    zoom_range=0.2,           # 20%までランダムにズーム
    horizontal_flip=True,     # 水平反転
    brightness_range=[0.8, 1.2]  # 明るさの調整
)
  • rotation_range: 画像をランダムに回転させる範囲を指定(ここでは20度)。
  • width_shift_rangeおよびheight_shift_range: 画像を左右および上下にシフトさせる範囲(0.1は画像幅/高さの10%)。
  • zoom_range: 画像を拡大または縮小する範囲。
  • horizontal_flip: 画像をランダムに水平反転します。
  • brightness_range: 画像の明るさを調整する範囲。

4. 拡張されたデータの可視化

データ拡張がどのように行われているかを可視化してみましょう。

# 拡張されたデータの表示
sample_image = x_train[0]  # サンプル画像
sample_image = sample_image.reshape((1, *sample_image.shape))

# 拡張された画像を生成
gen = datagen.flow(sample_image, batch_size=1)

# 生成された画像を表示
plt.figure(figsize=(12, 6))
for i in range(5):
    plt.subplot(1, 5, i+1)
    plt.imshow(gen.next()[0])
    plt.axis('off')
plt.show()
  • flow(): 拡張されたデータをバッチ単位で生成します。
  • plt.imshow(): 拡張された画像を表示します。

これで、設定したデータ拡張の内容に基づいて、異なるバリエーションの画像が表示されるのが確認できます。

5. データ拡張を適用したモデルの訓練

データ拡張を実際にモデルの訓練に使用します。ここでは、シンプルなCNNモデルを例にデータ拡張を適用してみます。

# シンプルなCNNモデルの定義
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),
    tf.keras.layers.MaxPooling2D((2, 2)),
    tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
    tf.keras.layers.MaxPooling2D((2, 2)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

# モデルのコンパイル
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# データ拡張を用いたモデルの訓練
history = model.fit(datagen.flow(x_train, y_train, batch_size=64),
                    epochs=20,
                    validation_data=(x_test, y_test))
  • datagen.flow(): データ拡張を適用したデータセットをバッチ単位で供給します。
  • epochs=20: モデルを20エポックにわたって訓練します。

データ拡張を活用するメリット

  1. 過学習の防止: データ拡張により、モデルは多様なバリエーションのデータを学習するため、特定のデータに過剰にフィットするのを防げます。
  2. データの多様性: 実世界のデータにはノイズや異なる条件が含まれているため、データ拡張を活用することで、モデルが多様なパターンに対応できるようになります。
  3. 訓練データの拡大: 実際にデータを増やさなくても、既存のデータから拡張して新たなデータを生成できるため、リソースを効率的に使えます。

まとめ

今回は、Kerasを使ってデータ拡張を実践し、画像データの増やし方を解説しました。データ拡張は、特に画像認識タスクで非常に有効で、モデルの精度向上に大きく貢献します。設定可能なパラメータも豊富で、さまざまな変換を組み合わせることで、より

効果的なモデルの訓練が可能になります。次回は、転移学習を用いて、事前学習済みのモデルを活用する方法について学びます。お楽しみに!


注釈

  • ImageDataGenerator: Kerasのクラスで、リアルタイムでデータ拡張を行い、モデルに供給する機能を持つ。
  • データ拡張: モデルが訓練データに過度に依存するのを防ぎ、汎化性能を向上させるための手法。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社PROMPTは生成AIに関する様々な情報を発信しています。
記事にしてほしいテーマや調べてほしいテーマがあればお問合せフォームからご連絡ください。
---
PROMPT Inc. provides a variety of information related to generative AI.
If there is a topic you would like us to write an article about or research, please contact us using the inquiry form.

コメント

コメントする

目次