Chainerのchainer-goghで画風を変換してみた

chainer Ubuntu 14.04にインストール(/アップグレード)したChainer 1.7.1で、chainer-goghを試してみました。

スポンサーリンク

準備

Chainerのバージョンの確認

Chainer 1.5以降がインストールされていることを確認します。

$ pip list | grep chainer
chainer (1.7.1)

Chainerは、1.4以前と1.5以降で互換性がなくなっているので、1.4以前のバージョンがインストールされている場合、下の記事等を参考にして、Chainerをアップグレードしておきます。

cuDNN v4に対応したChainer 1.7.1にアップグレードしてみた
Ubuntu 14.04にインストールしたChainer 1.4.0をcuDNN v4に対応したChainer 1.7.1にアップグレードしてみました。

chainer-goghのダウンロード等

GitHub(https://github.com/mattya/chainer-gogh)からchainer-goghの最新版(Chainer 1.5対応)をダウンロードします。
今回は、zipファイルをダウンロードし、展開しました。

モデルのダウンロード

次に、モデルをダウンロードします。
chainer-goghは、NIN、VGG、GoogLeNet、illustration2vecの4種類のモデルに対応していますが、きれいな絵をかきたい場合、VGGモデル(正確には、VGG_ILSVRC_16_layers.caffemodel)以外の選択肢がない感じです。

一工夫

・VGG https://gist.github.com/ksimonyan/211839e770f7b538e2d8#file-readme-md
きれいな絵がかけるがとても重い。(-m vgg)

なので、一工夫します。
VGGモデルは、ファイルサイズが約550MBあり、私のPC環境では、モデルの読み込みに5分以上かかります。
一度、Caffeモデルを読み込んで、Chainerモデルとして保存します(Chainer 1.4.0で保存していたpklファイルは、1.7.1で読み込もうとすると、エラーが発生しました)。

$ python
>>> from chainer.links.caffe import CaffeFunction
>>> import cPickle as pickle
>>> vgg = CaffeFunction('VGG_ILSVRC_16_layers.caffemodel')
>>> pickle.dump(vgg, open('VGG_ILSVRC_16_layers.pkl', 'wb'))

ファイルサイズが約1.6GBのVGG_ILSVRC_16_layers.pklが生成されます。

次に、models.pyを修正し、caffemodelファイルの代わりにpklファイルを読み込むように修正します。
元のファイルの6行目の下に下記を追加します。

import pickle

元のファイルの26行目と28行目を下記のように変更します。

    def __init__(self, fn="VGG_ILSVRC_16_layers.caffemodel", alpha=[0,0,1,1], beta=[1,1,1,1]):
    ↓
    def __init__(self, fn="VGG_ILSVRC_16_layers.pkl", alpha=[0,0,1,1], beta=[1,1,1,1]):
        self.model = caffe.CaffeFunction(fn)
        ↓
        self.model = pickle.load(open(fn, 'rb'))

また、chainer-gogh.pyの111行目を下記のように修正しておくと、少しだけ幸せになれます。

    for i in range(max_iter+1):

画風変換

ポメラニアン × ゴッホの『ひまわり』

コンテンツ画像(content.jpg)と、スタイル画像(style1.png)としてゴッホの『ひまわり』を用意します。
input1
以下を実行し、画風を変換します。

$ python chainer-gogh.py -m vgg -i content.jpg -s style1.png -o output1 -g 0 -w 256

オプションの使い方は、-mオプションでモデル、-iオプションでコンテンツ画像、-sオプションでスタイル画像、-oオプションで出力ディレクトリを指定できます。また、モデルサイズが大きいVGGでも、VRAM 4GBであれば、処理・出力する画像サイズを指定する-w 256に対応できます。VRAMが少ない場合、-wオプションで画像サイズを小さくする必要があります。
-oオプションで指定したディレクトリ(output1)に、繰り返し50回毎に、画像が保存されます。私のPC環境(GTX 960)では、繰り返し5000回の処理が20分弱で終了し、以下の画像が生成されました。
output1
なお、繰り返し200回毎の画像を1枚の画像に合成すると、以下のようになります。
montage1
3段目(繰り返し2000回から2800回)で、全体的な雰囲気が決まり、そこから先は、アハ!体験コンテンツのように、ゆっくり変化している感じです。

ポメラニアン × ゴッホの『自画像(1887年夏)』

スタイル画像をゴッホの『自画像(1887年夏)』に変更します。
input2
以下を実行し、画風を変換します。

$ python chainer-gogh.py -m vgg -i content.jpg -s style2.png -o output2 -g 0 -w 256

スタイル画像の青いシャツの影響を受けて、「青っ鼻のトナカイ」ならぬ「青っ鼻のポメラニアン」の画像が生成されました。
output2