ImageNet データセットのダウンロード、前処理、アップロード

このドキュメントでは、Cloud TPU VM アーキテクチャで使用する ImageNet データセットをダウンロード、前処理、アップロードする方法について説明します。

ImageNet は画像データベースです。このデータベース内では画像が階層に編成されていて、階層の各ノードを数百、数千もの画像で表しています。

ImageNet データベースのサイズによっては、モデルのトレーニングにはかなりの時間がかかる場合があります。代替手段として、このデータセットの fake_imagenet と呼ばれるデモバージョンを使用する方法もあります。このデモバージョンを使用すると、モデルのテストが可能になり、同時に、完全な ImageNet データベースの使用に伴うストレージ要件と時間要件が削減されます。

完全版の ImageNet データセットの前処理

ImageNet データセットは、トレーニング データ、検証データ、画像ラベルの 3 つの部分で構成されます。

トレーニング データには 1,000 個のカテゴリと 120 万個の画像が含まれており、ダウンロードしやすいようにパッケージ化されています。検証データとテストデータは、ImageNet トレーニング データには含まれていません(重複は削除されています)。

検証データとテストデータは、Flickr やその他の検索エンジンから収集された 150,000 枚の写真で構成され、1,000 個のオブジェクト カテゴリの存在または不在のラベルが付いています。1,000 個のオブジェクト カテゴリには ImageNet の内部ノードとリーフノードの両方が含まれますが、両者は重複しません。ラベルの付いた 50,000 枚の画像のランダムなサブセットが、1,000 個のカテゴリのリストとともに検証データとしてリリースされています。残りの画像は評価用に使用され、ラベルなしでリリースされています。

完全な ImageNet データセットの前処理手順

機械学習モデルで使用する ImageNet の完全なデータセットを準備するには、次の 5 つの手順を行います。

  1. ダウンロード先に空き容量があることを確認します。
  2. ターゲット ディレクトリを設定する
  3. ImageNet サイトに登録して、ダウンロード権限をリクエストします。
  4. データセットをローカル ディスクまたは VM インスタンスにダウンロードします。

  5. 前処理スクリプトとアップロード スクリプトを実行します。

容量の要件を確認する

データセットをローカルマシンにダウンロードする場合でも、VM インスタンスにダウンロードする場合でも、ダウンロード先に約 300 GB の空き容量が必要です。

TPU VM のデフォルトのディスク割り当ては 100 GB です。TPU VM へのダウンロードには 300 GB が必要なため、TPU VM インスタンスにダウンロードする場合は、永続ディスクと 200 GB の追加容量を追加してからダウンロードする必要があります。TPU VM の場合、df -ha コマンドを実行して空き容量を確認できます。

永続ディスクを追加するときは、次のことを行ってください。

  • VM の削除時にディスクが削除されるように、[インスタンスを削除したときの動作] を [ディスクを削除] に設定します。
  • 新しいディスクのパスをメモします。例: /mnt/disks/mnt-dir

ターゲット ディレクトリを設定する

ローカルマシンまたは VM インスタンスで、ダウンロードしたデータを格納するディレクトリ構造を設定します。

  1. ダウンロード ターゲット(ローカルマシンまたは TPU VM)のホーム ディレクトリの下に imagenet などのディレクトリを作成します。

    mkdir imagenet
    
  2. このディレクトリに、trainvalidation という 2 つのサブディレクトリを作成します。

    mkdir imagenet/train
    mkdir imagenet/validation
    
  3. imagenet ディレクトリを IMAGENET_HOME としてエクスポートします。

    export IMAGENET_HOME=~/imagenet

データセットをダウンロードするための登録と権限のリクエストを行う

Imagenet ウェブサイトに登録します。ImageNet が登録を確認して確認メールを送信するまで、データセットをダウンロードすることはできません。数日以内に確認メールが届かない場合は、ImageNet サポートに連絡して、登録が確認されていない理由を確認してください。登録が確認されたら、データセットをダウンロードできます。ImageNet データセットを使用する Cloud TPU チュートリアルでは、ImageNet Large Scale Visual Recognition Challenge 2012(ILSVRC2012)の画像を使用します。

ImageNet データセットをダウンロードする

  1. LSRVC 2012 ダウンロード サイトから、ページの [Images] セクションに移動し、[Training images (Task 1 & 2)] を右クリックします。トレーニング セットの大部分をダウンロードするための URL。このURL を保存します。

    [Training images (Task 3)] を右クリックして、2 番目のトレーニング セットの URL を取得します。このURL を保存します。

    "Validation images (all tasks)" を右クリックして、検証データセットの URL を取得します。このURL を保存します。

    ImageNet ファイルをローカルマシンにダウンロードする場合、ローカルマシン上のディレクトリを、VM インスタンス上の対応する $IMAGENET_HOME ディレクトリにコピーする必要があります。ImageNet データセットをローカルホストから VM インスタンスにコピーするには、約 13 時間かかります。

    ImageNet データセットを VM にコピーする前に、VM インスタンスの名前を特定する必要があります。これを行うには、SSH を使用して TPU VM に接続します。VM インスタンス名は、コマンド プロンプトで @ 記号の後に表示されます。

    次のコマンドを使用して、ローカルマシン上の ~/imagenet の下にあるファイルを、VM 上の $IMAGENET_HOME にコピーします。

    gcloud compute scp --recurse $IMAGENET_HOME username@vm-instance-name:~/imagenet
  2. $IMAGENET_HOME で、保存した URL を使用して「Training images (Task 1 & 2)」ファイルをダウンロードします。

    「Training images (Task 1 & 2)」は、大規模なトレーニング セットです。これは 138 GB で、Cloud Shell を使用して TPU VM にダウンロードする場合、ダウンロードは約 40 時間かかります。Cloud Shell と VM との接続が失われた場合は、コマンドの前に nohup を付けるか、screen を使用します。

    cd $IMAGENET_HOME \
    nohup wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train.tar

    URL は変更されている可能性があるため、URL は「Training images (Task 1 & 2)」で以前に保存した URL に置き換えます。

  3. 次のコマンドを使用して、個々のトレーニング ディレクトリを $IMAGENET_HOME/train ディレクトリに抽出します。抽出には 1~3 時間かかります。

    tar xf $IMAGENET_HOME/ILSVRC2012_img_train.tar -C $IMAGENET_HOME/train

    次のスクリプトに示すように、$IMAGENET_HOME/train ディレクトリにある個々のトレーニング tar ファイルを抽出します。

    cd `$IMAGENET_HOME/train`
    
    for f in *.tar; do
     d=`basename $f .tar`
     mkdir $d
     tar xf $f -C $d
    done

    抽出した後 tar ファイルを削除して、ディスク容量を解放します。

  4. $IMAGENET_HOME で、保存した URL を使用して「Training images (Task 3)」ファイルをダウンロードします。

    「Training images (Task 3)」ファイルは 728 MB で、ダウンロードにかかる時間は数分であるため、Cloud Shell の接続が切断されることを考慮する必要はありません。

    wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_train_t3.tar

    URL は変更されている可能性があるため、URL は「Training images (Task 3)」で以前に保存した URL に置き換えます。

  5. 次のコマンドを使用して、個々のトレーニング ディレクトリを $IMAGENET_HOME/train ディレクトリに抽出します。

    tar xf $IMAGENET_HOME/ILSVRC2012_img_train_t3.tar -C $IMAGENET_HOME/train

    次のスクリプトに示すように、$IMAGENET_HOME/train ディレクトリにある個々のトレーニング tar ファイルを抽出します。

    cd `$IMAGENET_HOME/train`
    
    for f in *.tar; do
     d=`basename $f .tar`
     mkdir $d
     tar xf $f -C $d
    done

    抽出した後 tar ファイルを削除して、ディスク容量を解放します。

  6. $IMAGENET_HOME で、保存した URL を使用して「Validation images (all tasks)」ファイルをダウンロードします。

    "Validation images (all tasks)" ファイルをダウンロードすると、Cloud Shell が切断される可能性があります。nohup または screen を使用すると、Cloud Shell の切断を防ぐことができます。

    wget https://image-net.org/data/ILSVRC/2012/ILSVRC2012_img_val.tar

    URL は変更されている可能性があるため、「Validation images (all tasks)」で以前に保存した URL に置き換えます。

    このダウンロードには約 30 分かかります。

  7. 次のコマンドを使用して、個々の検証ファイルを $IMAGENET_HOME/validation ディレクトリに抽出します。

    tar xf $IMAGENET_HOME/ILSVRC2012_img_val.tar -C $IMAGENET_HOME/validation

    検証ファイルをローカルマシンにダウンロードした場合は、ローカルマシン上の $IMAGENET_HOME/validation ディレクトリを VM インスタンスの $IMAGENET_HOME/validation ディレクトリにコピーする必要があります。このコピー オペレーションには約 30 分かかります。

  8. ラベルファイルをダウンロードします。

    wget -O $IMAGENET_HOME/synset_labels.txt \
    https://raw.githubusercontent.com/tensorflow/models/master/research/slim/datasets/imagenet_2012_validation_synset_labels.txt

    ラベルファイルをローカルマシンにダウンロードした場合は、VM インスタンス上で $IMAGENET_HOME するために、ローカルマシン上の $IMAGENET_HOME ディレクトリにコピーする必要があります。このコピー オペレーションは数秒で完了します。

    トレーニング サブディレクトリ名(例: n03062245)は「WordNet ID」(wnid)です。ImageNet API は、synset_labels.txt ファイル内で WordNet ID の関連する検証ラベルへのマッピングを示します。このコンテキストの synset は、視覚的に似たグループの画像です。

Imagenet データセットを処理し、必要に応じて Cloud Storage にアップロードする

  1. GitHub から imagenet_to_gcs.py スクリプトをダウンロードします。

    wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
  2. データセットを Cloud Storage にアップロードする場合は、ImageNet データセットをアップロードするストレージ バケットのロケーションを指定します。

    export STORAGE_BUCKET=gs://bucket-name
  3. データセットをローカルマシンまたは VM にアップロードする場合は、データセットを保持するデータ ディレクトリを指定します。

    (vm)$ export DATA_DIR=$IMAGENET_HOME/dataset-directory
  4. マシンまたは仮想環境に次のライブラリをインストールします。

    pip3 install google-cloud-storage
    pip3 install tensorflow
    
  5. スクリプトを実行して、生データセットを TFRecord として前処理し、次のコマンドを使用して Cloud Storage にアップロードします。

     python3 imagenet_to_gcs.py \
      --project=$PROJECT \
      --gcs_output_path=$STORAGE_BUCKET  \
      --raw_data_dir=$IMAGENET_HOME \
      --local_scratch_dir=$IMAGENET_HOME/tf_records

このスクリプトでは、以下の形式の一連のディレクトリ(トレーニングと検証の両方)が生成されます。

${DATA_DIR}/train-00000-of-01024
${DATA_DIR}/train-00001-of-01024
...
${DATA_DIR}/train-01023-of-01024

そして

${DATA_DIR}/validation-00000-of-00128
${DATA_DIR}/validation-00001-of-00128
...
${DATA_DIR}/validation-00127-of-00128

Cloud バケットにデータがアップロードされたら、モデルを実行して --data_dir=${DATA_DIR} を設定します。