Cloud TPU で使用する画像分類データセットを変換します。


このチュートリアルでは、画像分類データ変換プログラムのサンプルスクリプトを使用して、生の画像分類データセットを Cloud TPU モデルのトレーニングで使用される TFRecord 形式に変換する方法について説明します。

TFRecords は、各ファイルを個別に読み取るよりも効率的に、Google Cloud Storage から大きなファイルを読み取ります。tf.data.Dataset パイプラインを使用している場所であればどこでも TFRecord を使用できます。

TFRecord の使用については、次の TensorFlow ドキュメントをご覧ください。

PyTorch または JAX フレームワークを使用していて、データセット ストレージに Google Cloud Storage を使用していない場合は、TFRecord は同じ利点を得られない可能性があります。

コンバージョンの概要

GitHub のデータ コンバータ リポジトリ内の画像分類フォルダには、converter スクリプト(image_classification_data.py)とサンプル実装(simple_example.py)が含まれており、独自のデータ変換を行うためにコピーして変更できます。

画像分類データ コンバーターのサンプルでは、ImageClassificationConfigImageClassificationBuilder の 2 つのクラスを定義しています。これらのクラスは tpu/tools/data_converter/image_classification_data.py で定義されています。

ImageClassificationConfig は要約ベースクラスです。ImageClassificationConfig をサブクラス化して、ImageClassificationBuilder をインスタンス化するために必要な構成を定義します。

ImageClassificationBuilder は画像分類データセットの TensorFlow データセット ビルダーです。これは tdfs.core.GeneratorBasedBuilder のサブクラスです。 データセットからデータの例を取得し、TFRecords に変換します。TFRecord は、ImageClassificationBuilder__init__ メソッドの data_dir パラメータで指定されたパスに書き込まれます。

simple_example.py で、サポートされるモードを定義するプロパティ、イメージクラスの数、データセット内の各サンプルの画像データと画像クラスを含む辞書を生成するサンプル生成ツールを実現して、SimpleDatasetConfigImageClassificationConfig をサブクラス化します。

main() 関数は、ランダムに生成された画像データのデータセットを作成し、クラスの数とディスク上のデータセットへのパスを指定する SimpleDatasetConfig オブジェクトをインスタンス化します。次に、main() は、SimpleDatasetConfig インスタンスを渡し、ImageClassificationBuilder オブジェクトをインスタンス化します。最後に、main()download_and_prepare()を呼び出します。このメソッドが呼び出されると、ImageClassificationBuilder インスタンスはSimpleDatasetConfig によって実装されたデータサンプル 生成ツールを使用して各サンプルを読み込み、一連の TFRecord ファイルに保存します。

詳細については、分類コンバーターのノートブックをご覧ください。

始める前に

データ コンバージョン サンプルを変更してデータセットを読み込む

データセットを TFRecord 形式に変換するには、次のプロパティを定義する ImageClassificationConfig クラスをサブクラス化します。

  • num_labels - イメージクラスの数を返します
  • supported_modes - データセットでサポートされているモードのリストを返します(例: test、train、validate)
  • text_label_map - テキストクラス ラベルと整数クラスラベルの間のマッピングをモデル化する辞書を返します(SimpleDatasetConfig はマッピングを必要としないため、このプロパティを使用しません)
  • download_path - データセットのダウンロード元のパス(SimpleDatasetConfig はこのプロパティを使用しません。example_generator はディスクからデータを読み込みます)

example_generator 生成ツール関数を実装します。このメソッドでは、画像データと各サンプルの画像クラス名を含む辞書を生成する必要があります。ImageClassificationBuilderexample_generator() 関数を使用して各サンプルを取得し、TFRecord 形式でディスクに書き込みます。

データ変換のサンプルを実行する

  1. 次のコマンドを使用して Cloud Storage バケットを作成します。

    gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 gs://bucket-name
  2. gcloud コマンドを使用して、Compute Engine VM を起動します。

    $ gcloud compute tpus execution-groups create \
     --vm-only \
     --zone=us-central1-b \
     --name=imageclassificationconverter \
     --tf-version=2.5.0
    gcloud compute ssh imageclassificationconverter --zone=us-central1-b 

    これ以降、接頭辞 (vm)$ は Compute Engine VM インスタンスでコマンドを実行する必要があることを意味します。

  3. 必要なパッケージをインストールする

    (vm)$ pip3 install opencv-python-headless pillow
  4. スクリプトで使用する次の環境変数を作成します。

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export CONVERTED_DIR=$HOME/tfrecords
    (vm)$ export GENERATED_DATA=$HOME/data
    (vm)$ export GCS_CONVERTED=$STORAGE_BUCKET/data_converter/image_classification/tfrecords
    (vm)$ export GCS_RAW=$STORAGE_BUCKET/image_classification/raw
    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
  5. data_converter ディレクトリに移動します。

    (vm)$ cd /usr/share/tpu/tools/data_converter

フェイク データセットでデータを実行する

simple_example.py スクリプトは、データ コンバージョン サンプルの image_classification フォルダにあります。次のパラメータを使用してスクリプトを実行すると、一連のフェイク画像が生成され、TFRecord に変換されます。

(vm)$ python3 image_classification/simple_example.py \
  --num_classes=1000 \
  --data_path=$GENERATED_DATA \
  --generate=True \
  --num_examples_per_class_low=10 \
  --num_examples_per_class_high=11 \
  --save_dir=$CONVERTED_DIR

生のデータセットでデータ変換ツールを実行する

  1. 元データの場所の環境変数を作成します。

    (vm)$ export GCS_RAW=gs://cloud-tpu-test-datasets/data_converter/raw_image_classification
  2. simple_example.py スクリプトを実行する

    (vm)$ python3 image_classification/simple_example.py \
    --num_classes=1000 \
    --data_path=$GCS_RAW \
    --generate=False \
    --save_dir=$CONVERTED_DIR

simple_example.py スクリプトは次のパラメータを受け取ります。

  • num_classes はデータセット内のクラスの数のことです。ここでは、ImageNet フォーマットに合わせて 1000 を使用しています。
  • generate は、生データを生成するかどうかを決定します。
  • data_path は、generate=True の場合はデータが生成されるパス、generate=False の場合は生データが保存されるパスを指します。
  • num_examples_per_class_lownum_examples_per_class_high はクラスごとにいくつのサンプルを生成するかを決定します。スクリプトは、この範囲内のサンプルの乱数を生成します。
  • save_dir は、保存された TFRecord が保存される場所を参照します。Cloud TPU でモデルをトレーニングするには、データは Cloud Storage に保存されている必要があります。データは、Cloud Storage 上、または VM 上のどちらでもかまいません。

TFRecord の名前を変更し Cloud Storage に移動する

次の例では、変換されたデータを ResNet モデルで使用します。

  1. TFRecord の名前を ImageNet の TFRecord と同じ形式に変更します。

    (vm)$ cd $CONVERTED_DIR/image_classification_builder/Simple/0.1.0/
    (vm)$ sudo apt install rename
    (vm)$ rename -v 's/image_classification_builder-(\w+)\.tfrecord/$1/g' *
  2. TFRecord を Cloud Storage にコピーします。

    (vm)$ gsutil -m cp train* $GCS_CONVERTED
    (vm)$ gsutil -m cp validation* $GCS_CONVERTED