画像にキャプションを付ける「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を用いて、画像から特徴量を取り出します。
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がリリースされる頃には、動作環境が明確になると共に、トレーニング済みモデルが提供されて、簡易にデモが実行できると良いなと思っています。