🦁

ILSVRC2012データセットのセットアップ

2020/10/18に公開

はじめに

ILSVRC2012データセットの使い方についてまとめます。このデータセットはデータ容量が大きいため、ダウンロードにも時間がかかるし、ディスク容量が足りなくなるかもしれません。長時間かけて結論が容量不足というのは悲しいので、はじめに必要な容量について書いておきます。訓練用の画像データが圧縮された状態で138GBの容量があり、300GB程度の空き容量がないと使えません。あと学習段階では外付HDDではストレージI/Oが遅くて学習が終わらないかもしれません。内蔵SSDに置けるようなPCが必要かもしれません。そのようなPCが手元になければクラウドサービスを使うという選択肢もあると思います。

データセットの構造

いくつかのファイルをダウンロードして、スクリプトを使いながらデータローダーで使いやすい様にファイル構造を構築していきます。今回はvgg16、resnet18などの画像分類のモデルの学習を想定(実際に訓練させるにはpytorchリポジトリのexampleを使うのが手っ取り早いと思います)して作りますが、まずは完成形から示しておきます。

データセットのディレクリ構造
.
├── train
│   ├── n01440764
│   │   ├── n01440764_10026.JPEG
│   │   ├── n01440764_10027.JPEG
│   │   ├── n01440764_10029.JPEG
...
│   ├── n01443537
│   │   ├── n01443537_10007.JPEG
│   │   ├── n01443537_10014.JPEG
│   │   ├── n01443537_10025.JPEG
...
│   ├── n01484850
...
└── val
    ├── n01440764
    │   ├── ILSVRC2012_val_00000293.JPEG
    │   ├── ILSVRC2012_val_00002138.JPEG
    │   ├── ILSVRC2012_val_00003014.JPEG
    ├── n01443537
    │   ├── ILSVRC2012_val_00000236.JPEG
    │   ├── ILSVRC2012_val_00000262.JPEG
    │   ├── ILSVRC2012_val_00000307.JPEG
    ├── n01484850
...

train以下が訓練データ、val以下が検証データです(テストデータについては省略)。そして、第3階層にあるnから始まる文字列(WordNetID)が分類の単位になっています。
実際にディレクトリ内の画像を開いてみると、全て同様の画像であることが確認できます。モデルの学習では、これら分類の種類は0からはじまるインデックスとしてしか扱わないので、各IDの意味を知らなくても学習には困りません。

しかし、学習したモデルで推論させたりするときは分類名があったほうが良いと思うので、次のURLから取得することが出来ます(公式である image-net.org から探したのですが、見つかりませんでした)。

wget http://dl.caffe.berkeleyvision.org/caffe_ilsvrc12.tar.gz

この圧縮ファイルを解凍したあとに得られる(tar xzvf caffe_ilsvrc12.tar.gzとやると、カレントディレクトリに複数テキストファイルが展開されるので気を付けて下さい)synset_words.txtにWordNetIDと分類名との対応が入っています。はじめの数行だけ表示してみます。

$ head synset_words.txt
n01440764 tench, Tinca tinca
n01443537 goldfish, Carassius auratus
n01484850 great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias
n01491361 tiger shark, Galeocerdo cuvieri
n01494475 hammerhead, hammerhead shark
n01496331 electric ray, crampfish, numbfish, torpedo
n01498041 stingray
n01514668 cock
n01514859 hen
n01518878 ostrich, Struthio camelus

n01440764tench, Tinca tincaです。tenchは鯉の一種のようです。Tinca tincaは学名のようです。

データセット構築

ILSVRC2012のデータセットは image-net.org に登録し、データセットのダウンロードリクエストを送るのが基本的な流れになっています。ここのあたり、よく説明できないので省略しますが、これらの前提をクリアしたあとの処理について書いていきます。

今回は訓練データと検証データをダウンロードし、シェルスクリプトを使ってデータを整形していきます。まず、訓練データをダウンロードします。最初に書いたように138GBあるので何日か放置させることになると思います(僕の場合、ネットワークが貧弱すぎて8日間かかりました。)。

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

クラウドや、ノートPCからアクセスして操作している場合はnohupをコマンドの前に付けて実行すると、sshの接続が切断されてやり直しになることを防止できます。

ダウンロードしたファイルをtar xf ILSVRC2012_img_train.tarで解凍する(解凍には1~3時間かかります)と<WordNetID>.tarというファイルが出来るので、これをさらに解凍する必要があります。なのでILSVRC2012_img_train.tarをデータセットと次のスクリプトをtrainディレクリに移動させてから、実行させます。

#!/bin/sh

files="./n*.tar"
for filepath in ${files}
do
  filename=`basename ${filepath} .tar`
  mkdir ${filename}
  tar -xf ${filename}.tar -C ${filename}
  rm ${filepath}
done

ILSVRC2012_img_train.tarや解凍に使ったスクリプトを消せば訓練データについては完成です。

次に検証データです。こちらも容量が6GB程度あるので、必要に応じてnohupを使います。

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

このファイルをデータセット内のvalディレクリに置いて解凍します。すると今度はILSVRC2012_val_*.JPEGといったパターンの画像ファイルが展開されます。これを各WordNetIDのディレクリに入れるスクリプトをダウンロードし、valディレクリに配置して使います。

wget https://raw.githubusercontent.com/soumith/imagenetloader.torch/master/valprep.sh

スクリプトの中身を見ると引くほど愚直に画像ファイルを移動させていることが分かると思います。不要なファイルを削除すれば、これでデータセットは完成になります。

注意事項

https://github.com/cytsai/ilsvrc-cmyk-image-list に公開されているのですが、データセットにRGBではなくCMYKの画像と1つだけPNG形式のファイルが混ざっています。ファイル形式を決め打ちしたようなコードの場合、クラッシュする原因になります。

Discussion