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 つの手順を行います。
- ダウンロード先に空き容量があることを確認します。
- ターゲット ディレクトリを設定します。
- ImageNet サイトに登録して、ダウンロード権限をリクエストします。
データセットをローカル ディスクまたは VM インスタンスにダウンロードします。
前処理スクリプトとアップロード スクリプトを実行します。
容量の要件を確認する
データセットをローカルマシンにダウンロードする場合でも、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 インスタンスで、ダウンロードしたデータを格納するディレクトリ構造を設定します。
ImageNet データセットのホーム ディレクトリを作成してエクスポートします。
ダウンロード ターゲット(ローカルマシンまたは TPU VM)のホーム ディレクトリの下に
imagenet
などのディレクトリを作成します。このディレクトリに、train
とvalidation
という 2 つのサブディレクトリを作成します。ホーム ディレクトリを IMAGENET_HOME としてエクスポートします。export IMAGENET_HOME=~/imagenet
データセットをダウンロードするための登録と権限のリクエストを行う
- Imagenet ウェブサイトに登録します。ImageNet が登録を確認して確認メールを送信するまで、データセットをダウンロードすることはできません。数日以内に確認メールが届かない場合は、ImageNet サポートに連絡して、登録が確認されていない理由を確認してください。登録が確認されたら、データセットをダウンロードできます。ImageNet データセットを使用する Cloud TPU チュートリアルでは、ImageNet Large Scale Visual Recognition Challenge 2012(ILSVRC2012)の画像を使用します。
ImageNet データセットをダウンロードする
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 インスタンスの名前を特定する必要があります。これを行うには、次の
gcloud describe
コマンドを実行して、出力で VM インスタンス名を探します。gcloud compute tpus tpu-vm describe tpu-name --zone=zone
これにより、VM インスタンス名を含む行を含む出力が生成されます(VM インスタンス名の例を以下に太字で示します)。
tpuVmSelflink: https://www.googleapis.com/compute/v1/projects/project-name/zones/zone/instances/t1v-n-2b9b54cd-w-0
次のコマンドを使用して、ローカルマシン上の ~/imagenet の下にあるファイルを、VM 上の
$IMAGENET_HOME
にコピーします。gcloud compute scp --recurse $IMAGENET_HOME username@vm-instance-name:~/imagenet
$ IMAGENET_HOME から
wget
を使用し、保存した URL を使用してトレーニング ファイルと検証ファイルをダウンロードします。「Training images (Task 1 & 2)」は、大規模なトレーニング セットです。 これは 138 GB で、Cloud Shell を使用して VM にダウンロードする場合、ダウンロードは約 40 時間かかります。Cloud Shell と VM との接続が失われた場合は、コマンドの前に
nohup
を付けるか、screen を使用します。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 $IMAGENET_HOME/ILSVRC2012_img_train.tar -C $IMAGENET_HOME/traintar xf ILSVRC2012_img_train.tar
次のスクリプトに示すように、
$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 ファイルを削除して、ディスク容量を解放します。
「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)" ファイルをダウンロードすると、Cloud Shell が切断される可能性があります。
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
ディレクトリを VM インスタンスの$IMAGENET_HOME/validation
ディレクトリにコピーする必要があります。このコピー オペレーションには約 30 分かかります。ラベルファイルをダウンロードします。
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 にアップロードする
GitHub から
imagenet_to_gcs.py
スクリプトをダウンロードします。wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
データセットを Cloud Storage にアップロードする場合は、ImageNet データセットをアップロードするストレージ バケットのロケーションを指定します。
export STORAGE_BUCKET=gs://bucket-name
データセットをローカルマシンまたは VM にアップロードする場合は、データセットを保持するデータ ディレクトリを指定します。
(vm)$ export DATA_DIR=$IMAGENET_HOME/dataset-directory
スクリプトを実行して、生データセットを 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
S{DATA_DIR}/validation-00001-of-00128
...
${DATA_DIR}/validation-00127-of-00128
Cloud バケットにデータがアップロードされたら、モデルを実行して --data_dir=${DATA_DIR}
を設定します。