概要
- paper: Show, Attend and Tell: Neural Image Caption Generation with Visual Attention
- Attention 能力を備えたキャプション生成
- CNN で特徴抽出
- 抽出した特徴からキャプションを生成するように LSTM を学習
- 論文の著者は2週間くらい訓練にかけたらしい
- 私は大学のDeepLearning講座(http://ail.tokyo)で題材にして再現を試みました
- この記事は「初心者がとりあえず訓練回して簡単な例を生成できるとこまでいった」経緯を書いているだけ(自分はそこまでが大変だったので……)なので、申し訳ないのですがうまくいってる例などは論文を参照してください
- もし間違ってる(あるいは非効率な)ことがあったら指摘してもらえると幸いです
再現
- ソース
- データセット
- 今回は flickr30k にした(入手に名前とメールアドレスが要る)
- 3万件の画像と5文ずつの説明文からなる
- http://shannon.cs.illinois.edu/DenotationGraph/
- 他に flickr8k と MSCOCO 向けにoptionがある
- 環境構築
- caffe / cuda / theano / numpy / scipy あたりが必要
- caffe/cuda: はじめに私は手元の mac book air に入れた
- http://wp.takashick.tk/2015/07/15/mac-osx-yosemite-%E3%81%A7-ipython-notebook%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/ あたりを参考にしました
- 適切に環境変数をいじってパス通せばおおよそなんとかなります(とくにPYTHONPATHがちゃんとできているか注意)
- theano とか: 入れやすいからあまり困らない?
- サーバで非rootのアカウントで上記のライブラリ入れたいときは、
- http://docs.continuum.io/anaconda/install#linux-install
- $ wget https://repo.continuum.io/archive/Anaconda2-2.4.1-Linux-x86_64.sh
- $ bash Anaconda2-2.4.1-Linux-x86_64.sh をやって指示に従って進み、
- $ conda update conda でアップデートして、入り直してから
- $ conda create --name projectname theano か何かで入れることができる
- rootじゃないのにサーバでどうやって作業するねんと今まで思っていたのだけど virtualenv を作ればよいということを今回学んだ
- 特徴抽出まで:
- 画像から抽出した特徴量と正解キャプションをpklファイルで固めたい
- 単語のベクトル表現作るためのdictionary.pklも要る
- pklファイル生成のコードはkelvinxuさんのところには置いてない(たかが前処理やんけという勢い)
- 揉めてる: https://github.com/kelvinxu/arctic-captions/issues/1
- pklファイルのフォーマットはここのコメント4つめくらいに書いてある
- どうやって作るの: https://github.com/asampat3090/arctic-captions の make_flickr_data.py を使わせていただく
- ただし dictionary.pkl の作成はうまくいってない(他のissuesで指摘されてる)
- 正しい dictionary.pkl は気合で作る: カンマなども含めて頻度順に2からインデックスを振っていく(flickr30kは23462まで、cocoは35630までありました)
- 注意1: caffe の load model は 絶対パスにすること
- 注意2: asampat3090さんの caffe_cnn 用のコードも手元に置いてimportできるようにしておかなければならない
- git clone: https://github.com/asampat3090/anandlib
- CPU mode のときは caffe_cnn.py L23 set_mode_gpu をコメントアウト
- でもCPUじゃ絶対やらないほうがいいです、現実的な時間では終わらないので(私はCNN側はCPUでやりましたが、LSTM側はGPU使いました)
- という感じで、kelvinxu/arctic-captions/flickr30k.pyの末尾でロードしているような形のpklファイルを錬成する
- CNN: 事前に訓練されてる caffe_model を使う
- メインの訓練:
- evaluate_coco.py が実行の本体
- evaluate_flickr30k.py みたいな形でコピーして、オプションを変える
- 最低限 dataset="flickr30k" とすれば無問題?
- THEANO_FLAGS='floatX=float32' python eval_flickr30k.py をつける
- もしかしたら flickr30k.py L13 feat_list.append(features[cc[1]]) でエラー吐くかもしれない
- 動作やスペックまわり
- 訓練が終わったら
- generate_caps.py がテスト用の呼び出しをしてくれる
まとめ
という感じでした。一週間くらいずっとコードとにらめっこしてた。