CaffeによるILSVRC2012の実行 

# ILSVRCとは？

ILSVRC（ImageNet Large Scale Visual Recognition Challenge）は、[ImageNet](http://image-net.org/)が毎年主催するコンピュータによる物体認識精度を競うコンテスト。ILSVRC2012に関する詳細は以下。
http://www.image-net.org/challenges/LSVRC/2012/

# Caffeのインストール
詳細は以下を参照。
http://qiita.com/htsst/items/1cfda725c1cb0f0e3ef6

Caffeをインストールしたディレクトリを$CAFFE_HOMEとする。

# データのダウンロード
ImageNetのサイトのDownload>Original Imagesから"ILSVRC2012 image data"をダウンロードする。
アカウント登録が必要で、Term of Accessへの許諾(非商用な研究・教育が利用目的であること)が必要。
http://www.image-net.org/challenges/LSVRC/2012/nonpub-downloads

以下のものをダウンロードする。
 
 * Development kit (Task 1 & 2)
 * Development kit (Task 3)
 * Training images (Task 1 & 2)
 * Training images (Task 3)
 * Validation images (all tasks)
 * Test images (all tasks)

```
#!/bin/bash

# Development kit (Task 1 & 2), 2.5MB
wget http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_devkit_t12.tar.gz
md5sum ILSVRC2012_devkit_t12.tar.gz

# Development kit (Task 3), 22MB
wget http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_devkit_t3.tar.gz
md5sum ILSVRC2012_devkit_t3.tar.gz

# Training images (Task 1 & 2), 138GB
wget http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_train.tar
md5sum ILSVRC2012_img_train.tar

# Training images (Task 3), 728MB
wget http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_train_t3.tar
md5sum ILSVRC2012_img_train_t3.tar

# Validation images (all tasks), 6.3GB
wget http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_val.tar
md5sum ILSVRC2012_img_val.tar

# Test images (all tasks), 13GB
wget http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tar
md5sum ILSVRC2012_img_test.tar
```

ファイルをダウンロードしたディレクトリを$ILSVRC2012_IMAGE_DATA_DIRとする。
ファイルのダウンロードに1日程度かかる。ファイルの展開やcaffe形式への変換を含め600GB程度の容量が必要。

# データの展開
$ILSVRC2012_IMAGE_DATA_DIRにtrain, val, testディレクトリを作り、それぞれ展開する。trainはtarファイル群が展開されるので、下記のシェルスクリプトでディレクトリ毎に展開する。（シェルスクリプトは[このサイト](http://iamrobotandproud.hatenablog.com/entry/2015/03/08/143837)を参照）
train3はTask3（犬の種別判定）用なので現時点では使用しない。

```
#!/bin/sh

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

展開後は中間tarファイルは必要ないので削除してもよい。（130GBほど圧迫する）

# caffe形式への変換
ILSVRC2012のOriginal Imagesのファイル名をダウンロードする。

```
$ cd $CAFFE_HOME/data/ilsvrc12/
$ ./get_ilsvrc_aux.sh
```

画像の生成を行う。create_imagenet.shを編集して各PATHを設定する。
EXAMPLEで指定したPATHの中にリサイズ画像が格納される。（240GBほど必要）

```
EXAMPLE = $ILSVRC2012_IMAGE_DATA_DIR/examples
DATA =  $CAFFE_HOME/data/ilsvrc12
TOOLS = $CAFFE_HOME/build/tools
TRAIN_DATA_ROOT = $ILSVRC2012_IMAGE_DATA_DIR/train
VAL_DATA_ROOT = $ILSVRC2012_IMAGE_DATA_DIR/val

RESIZE = true
```

コマンドを実行する。1.5時間ほど時間がかかる。

```
$ ./create_imagenet.sh
```

最後に、平均画像の計算をする。
make_imagenet_mean.shを編集して各PATHを設定する。

```
EXAMPLE = $ILSVRC2012_IMAGE_DATA_DIR/examples
DATA = $CAFFE_HOME/data/ilsvrc12
TOOLS = $CAFFE_HOME/build/tools
```

コマンドを実行する。計算結果は、DATA/imagenet_mean.binaryprotyに出力される。

```
$ ./make_imagenet_mean.sh
```

# AlexNetでの学習

```
cd $CAFFE_HOME
```

models/bvlc_alexnet/train_val.prototxtに上記でデータを用意したデータへのPATHを設定する。

```
   source: "$ILSVRC2012_IMAGE_DATA_DIR/examples/ilsvrc12_train_lmdb"
   source: "$ILSVRC2012_IMAGE_DATA_DIR/examples/ilsvrc12_val_lmdb"
```

学習を実行する。LD_LIBRARY_PATHにCUDAとCUDNNのライブラリへのPATHを設定することに注意。

```
$./build/tools/caffe train --solver=models/bvlc_alexnet/solver.prototxt -gpu 0,1,2,3,4,5,6,7
```

以下から学習済みのcaffemodelのダウンロードもできる。
http://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel