ImageNet データセットのダウンロード、前処理、アップロード
このトピックでは、Cloud TPU で使用する ImageNet データセットをダウンロード、前処理、アップロードする方法を説明します。ImageNet データセットを使用する機械学習モデルには次のものがあります。
- ResNet
- AmoebaNet
- EfficientNet
- MNASNet
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 サイトに登録して、ダウンロード権限をリクエストします。
データセットをローカル ディスクまたは Compute Engine VM にダウンロードします。
前処理スクリプトとアップロード スクリプトを実行します。
容量の要件を確認する
データセットをローカルマシンにダウンロードする場合でも、Compute Engine VM にダウンロードする場合でも、ダウンロード先に約 300 GB の空き容量が必要です。VM の場合、df -ha
コマンドを実行して空き容量を確認できます。
VM ディスクのサイズは、次のいずれかの方法で増やすことができます。
gcloud compute
コマンドラインで、割り当てるサイズ(GB 単位)を設定した--disk-size
フラグを指定します。- Compute Engine ガイドに従って、VM にディスクを追加します。
- VM の削除時にディスクが削除されるように、[インスタンスを削除したときの動作] を [ディスクを削除] に設定します。
- 新しいディスクのパスをメモします。例:
/mnt/disks/mnt-dir
。
ターゲット ディレクトリを設定する
ローカルマシンまたは Compute Engine VM で、ダウンロードしたデータを格納するディレクトリ構造を設定します。
ImageNet データセットのホーム ディレクトリを作成してエクスポートします。
ローカルマシンまたは 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 ファイルをローカルマシンにダウンロードする場合、ローカルマシン上のディレクトリを、Compute Engine VM 上の対応する
$IMAGENET_HOME
ディレクトリにコピーする必要があります。ImageNet データセットをローカルホストから VM にコピーするには、約 13 時間かかります。次のコマンドは、ローカルマシン上の $IMAGENET_HOME にあるファイルを VM(username@vm-name)上の ~/imagenet にコピーします。
gcloud compute scp --recurse $IMAGENET_HOME username@vm-name:~/imagenet
$ IMAGENET_HOME から
wget
を使用し、保存した URL を使用してトレーニング ファイルと検証ファイルをダウンロードします。「Training images (Task 1 & 2)」は、大規模なトレーニング セットです。 これは 138 GB で、Cloud Shell を使用して Compute Engine 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 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
ディレクトリを 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
ラベルファイルをローカルマシンにダウンロードした場合は、Compute Engine 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}
を設定します。