画像にキャプションを付ける「Show and Tell」のTensorFlow実装を試してみた⇒玉砕

tensorflow
画像にキャプションを付ける「Show and Tell」のTensorFlow実装「im2txt」がオープンソースになったということなので試してみましたが、見事に玉砕しました。

ニュースソースは、Google Research Blogのこちらの記事(https://research.googleblog.com/2016/09/show-and-tell-image-captioning-open.html)です。

コードが公開されているのは、GitHubのこちら(https://github.com/tensorflow/models/tree/master/im2txt)。

GitHubのREADME.mdには「In our experience on an NVIDIA Tesla K20m GPU the initial training phase takes 1-2 weeks.」とあり、1-2週間て何って感じなのですが、現時点ではトレーニング済みモデルの提供はないようです。

スポンサーリンク

環境構築

NVIDIA Docker

今回は、NVIDIA Docker上でTensorFlowを動作させます。

NVIDIA DockerのGitHubは、こちら(https://github.com/NVIDIA/nvidia-docker)。

README.md通りにNVIDIA Dockerのインストールとテストを行います。

$ wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0-rc.3/nvidia-docker_1.0.0.rc.3-1_amd64.deb
$ sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb

$ nvidia-docker run --rm nvidia/cuda nvidia-smi

TensorFlow

TensorFlow (0.10.0-devel-gpu)のイメージをダウンロードします。

$ docker pull tensorflow/tensorflow:0.10.0-devel-gpu

ダウンロードしたイメージから、コンテナを生成します。

$ nvidia-docker run -it -p 8888:8888 tensorflow/tensorflow:0.10.0-devel-gpu

tensorflow/models/im2txt

コンテナ側で、「Show and Tell」のTensorFlow実装であるim2txtを含むhttps://github.com/tensorflow/modelsをcloneします。

# git clone https://github.com/tensorflow/models

README.mdによると、im2txtの実行に必要なパッケージは、Bazel、TensorFlow、NumPy、Natural Language Toolkit (NLTK)となっていますが、ダウンロードしたTensorFlow (0.10.0-devel-gpu)TensorFlowのイメージには、Bazel、TensorFlow、NumPyが、インストール済みです。

Natural Language Toolkit (NLTK)

こちら(http://www.nltk.org/install.html)を参照して、NLTKをインストールします。

# pip install nltk

次に、こちら(http://www.nltk.org/data.html)を参照して、NLTK dataをインストールします。

# python -m nltk.downloader -d /usr/local/share/nltk_data all

NLTK dataのインストールには、結構時間(1時間位)が掛かりました。

COCO

im2txtでは、データセットとしてCOCO(http://mscoco.org/)を使用します。

COCOのダウンロード・前処理には、download_and_preprocess_mscocoスクリプトが用意されています。

なお、コンテナにwgetがインストールされていない場合、スクリプトの実行前に、wgetをインストールしておきます。

# apt-get update
# apt-get install wget

download_and_preprocess_mscocoスクリプトをビルドし、実行します。スクリプトの実行時の引数は、COCO dataを保存するディレクトリとなります。

# cd /root/models/im2txt
# bazel build im2txt/download_and_preprocess_mscoco
# bazel-bin/im2txt/download_and_preprocess_mscoco /root/models/im2txt/im2txt/data/mscoco

なお、train2014.zip、val2014.zip、captions_train-val2014.zipをダウンロード済みの場合、COCO dataを保存するディレクトリの下のraw-data(上記の場合、/root/models/im2txt/im2txt/data/mscoco/raw-data)にファイルがあると、ダウンロードをスキップできます。

コンテナ側で、ディレクトリを作成しておき、

# mkdir -p im2txt/data/mscoco/raw-data

ホスト側で、train2014.zip等をダウンロードしたディレクトリに移動し、コンテナにファイルをコピーします。

$ docker cp train2014.zip <コンテナ名>:/root/models/im2txt/im2txt/data/mscoco/raw-data/train2014.zip
$ docker cp val2014.zip <コンテナ名>:/root/models/im2txt/im2txt/data/mscoco/raw-data/val2014.zip
$ docker cp captions_train-val2014.zip <コンテナ名>:/root/models/im2txt/im2txt/data/mscoco/raw-data/captions_train-val2014.zip

download_and_preprocess_mscocoスクリプトの実行も、かなり時間(2時間位)が掛かりました。

Inception v3

im2txtでは、以下の記事で、画像の分類に用いた画像認識モデルのInception v3を用いて、画像から特徴量を取り出します。

TensorFlowのInception-v3で画像を分類してみた(Python API編)
TensorFlowのチュートリアルの画像認識(Python API編)に従って、Inception-v3による画像の分類にチャレンジしてみました。

Inception v3の準備を行います。

なお、コンテナにwgetがインストールされていない場合、上記を参照してwgetをインストールしておきます。

以下のコマンドで、Inception v3のダウンロード・解凍等を行います。

# wget http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz
# tar xf inception_v3_2016_08_28.tar.gz -C /root/models/im2txt/im2txt/data
# rm inception_v3_2016_08_28.tar.gz

ここまでは、時間は掛かりましたが、結構順調に進んでいました。

トレーニング

トレーニングは、イニシャル・トレーニングとセカンド・トレーニングに分かれています。

イニシャル・トレーニングでは、画像認識モデル(Inception v3)の学習を行わず、セカンド・トレーニングにおいて、画像認識モデルの(も?)学習を行って、Inception v3をファイン・チューンする流れになっています。

スクリプトをビルドします。

# bazel build -c opt im2txt/...

スクリプトの引数を設定し、スクリプトを実行します。なお、number_of_stepsのパラメータを1000000から100に変更して実行しましたが、・・・

# MSCOCO_DIR="$(pwd)/im2txt/data/mscoco"
# INCEPTION_CHECKPOINT="$(pwd)/im2txt/data/inception_v3.ckpt"
# MODEL_DIR="$(pwd)/im2txt/model"
# bazel-bin/im2txt/train \
  --input_file_pattern="${MSCOCO_DIR}/train-?????-of-00256" \
  --inception_checkpoint_file="${INCEPTION_CHECKPOINT}" \
  --train_dir="${MODEL_DIR}/train" \
  --train_inception=false \
  --number_of_steps=100

残念なことに、エラーが発生しました。

必要パッケージ「TensorFlow」に、「Note: the model currently requires TensorFlow built from source because it uses features added after release r0.10.」とありますが、TensorFlow v0.10.0にはないTF-Slimの機能を使ってInception v3モデルが記述されていました。

設定変更による再ビルドで何とかなるレベルではなく、少なくともTensorFlow v0.10.0の範囲では、動作しないようです。

まとめ

画像にキャプションを付ける「Show and Tell」のTensorFlow実装「im2txt」を試してみましたが、TensorFlow v0.10.0には対応しておらず、見事に玉砕しました。

TensorFlow v0.11.0がリリースされる頃には、動作環境が明確になると共に、トレーニング済みモデルが提供されて、簡易にデモが実行できると良いなと思っています。