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

このトピックでは、Cloud TPU で使用する ImageNet データセットをダウンロード、前処理、アップロードする方法を説明します。ImageNet データセットを使用する機械学習モデルには次のものがあります。

  • ResNet
  • AmoebaNet
  • EfficientNet
  • MNASNet
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. データセットをローカル ディスクまたは Compute Engine VM にダウンロードします。

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

容量の要件を確認する

データセットをローカルマシンにダウンロードする場合でも、Compute Engine VM にダウンロードする場合でも、ダウンロード先に約 300 GB の空き容量が必要です。VM の場合、df -ha コマンドを実行して空き容量を確認できます。

VM ディスクのサイズは、次のいずれかの方法で増やすことができます。

  • ctpu up コマンドラインで、割り当てるサイズ(GB 単位)を設定した --disk-size-gb フラグを指定します。
  • Compute Engine ガイドに従って、VM にディスクを追加します。
    • VM の削除時にディスクが削除されるように、[インスタンスを削除したときの動作] を [ディスクを削除] に設定します。
    • 新しいディスクのパスをメモします。例: /mnt/disks/mnt-dir

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

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

  • ImageNet データセットのホーム ディレクトリを作成してエクスポートします。

    ローカルマシンまたは VM のホーム ディレクトリの下に imagenet などのディレクトリを作成します。このディレクトリに、trainvalidation という 2 つのサブディレクトリを作成します。ホーム ディレクトリを IMAGENET_HOME としてエクスポートします。

    export IMAGENET_HOME=~/imagenet
    

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

  • Imagenet ウェブサイトに登録します。ImageNet が登録を確認して確認メールを送信するまで、データセットをダウンロードすることはできません。数日以内に確認メールが届かない場合は、ImageNet サポートに連絡して、登録が確認されていない理由を確認してください。登録が確認されたら、ダウンロード サイトに移動します。

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

  1. ダウンロード サイトから、[Images] セクションに移動し、[Training images (Task 1 & 2)] を右クリックします。これによって、トレーニング セットの大部分をダウンロードするために必要な URL が表示されます。このURL を保存します。

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

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

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

    たとえば、次のコマンドでは、ローカルマシン上の $IMAGENET_HOME の下にあるすべてのファイルを、シェル プロンプト username@vm-name が表示されている VM にコピーします。

    gcloud compute scp --recurse $IMAGENET_HOME username@vm-name:~/imagenet
    
  2. $ IMAGENET_HOME から wget を使用し、保存した URL を使用してトレーニング ファイルと検証ファイルをダウンロードします。

    「Training images (Task 1 & 2)」は、大規模なトレーニング セットです。 これは 138 GB で、Cloud Shell を使用して Compute Engine VM にダウンロードする場合、ダウンロードにかかる推定時間は約 40 時間です。このような非常に大きなファイルの場合は、コマンドの前に nohup を付けるか、screen を使用して Cloud Shell の接続が切断されたときにダウンロードが終了することを回避します。

    cd $IMAGENET_HOME \
    nohup wget http://image-net.org/challenges/LSVRC/2012/dd31405981ef5f776aa17412e1f0c112/ILSVRC2012_img_train.tar
    

    これにより、大きな tar ファイル(ILSVRC2012_img_train.tar)がダウンロードされます。

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

    tar xf ILSVRC2012_img_train.tar
    

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

    このファイルをダウンロードすると、個々のトレーニング ディレクトリが既存の $IMAGENET_HOME/train ディレクトリに抽出されます。

    wget http://www.image-net.org/challenges/LSVRC/2012/dd31405981ef5f776aa17412e1f0c112/ILSVRC2012_img_train_t3.tar
    

    「Validation images (all tasks)」ファイルは 6 GB であるため、nohup または screen を使用して Cloud Shell の接続が切断されたときにダウンロードが終了することを回避します。

    wget http://www.image-net.org/challenges/LSVRC/2012/dd31405981ef5f776aa17412e1f0c112/ILSVRC2012_img_val.tar
    

    このダウンロードには約 30 分かかります。このファイルをダウンロードすると、個々の検証ディレクトリが既存の $IMAGENET_HOME/validation ディレクトリに抽出されます。

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

    ラベルファイルをダウンロードします。これは数秒で完了します。

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

    ラベルファイルをローカルマシンにダウンロードした場合は、ローカルマシン上の $IMAGENET_HOME ディレクトリ、Compute Engine VM 上の $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. データセットを Cloud Storage にアップロードする場合は、データセットを保持するストレージ バケット データ ディレクトリを指定します。

    (vm)$ export DATA_DIR=$STORAGE_BUCKET/dataset-directory
    
  4. スクリプトを実行して、生データセットを TFRecord として前処理し、次のコマンドを使用して Cloud Storage にアップロードします。

     python3 imagenet_to_gcs.py \
      --project=$PROJECT \
      --gcs_output_path=$DATA_DIR  \
      --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
S{DATA_DIR}/validation-00001-of-00128
 ...
${DATA_DIR}/validation-00127-of-00128

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