Real-Time Style TransferのTorchによる実装「fast-neural-style」で、画像の高速スタイル変換を試してみました。
Torchは、NVIDIAのMachine LearningリポジトリでUbuntu 14.04にインストールしtorch7-nvを使用します。
なお、Real-Time Style Transferの詳細は、以下の論文をご覧ください。
Justin Johnson, Alexandre Alahi, Li Fei-Fei, “Perceptual Losses for Real-Time Style Transfer and Super-Resolution”
この論文のJustin Johnsonさんは、以下の記事で使用したneural-styleの作者でもあります。
fast-neural-styleによる高速画風変換
準備
GitHubのfast-neural-style(https://github.com/jcjohnson/fast-neural-style)のREADME.mdを参照して、準備を行います。
あらかじめ作成しておいたgithubディレクトリに移動し、GitHubのfast-neural-styleをcloneします。
$ cd ~/github $ git clone https://github.com/jcjohnson/fast-neural-style $ cd fast-neural-style
torch、nn、image、lua-cjsonのインストールが必要ですが、以下のコマンドでインストールされているパッケージを確認したところ、(cutorch、cunn、cudnnも含め)全てインストールされていました。
$ luarocks list
インストールされていない場合、以下のコマンドでインストールを行います。
$ sudo luarocks install torch $ sudo luarocks install nn $ sudo luarocks install image $ sudo luarocks install lua-cjson
CUDAを使用する場合、以下のコマンドでcutorchとcunnをインストールします。
$ sudo luarocks install cutorch $ sudo luarocks install cunn
更に、cuDNNを使用する場合、以下のコマンドでcudnnをインストールします。
$ sudo luarocks install cudnn
以下のコマンドで、訓練済みの10種のモデル(約200MB)をダウンロードします。
$ bash models/download_style_transfer_models.sh
高速画風変換
Real-Time Style Transferの実装だけあって、CPUモードでも、数秒で画風変換が終了します。
$ time th fast_neural_style.lua \ -model models/instance_norm/udnie.t7 \ -input_image input.jpg \ -output_image udnie.jpg \ -image_size 512 Writing output image to udnie.jpg real 0m2.983s user 0m5.359s sys 0m5.015s
ここまで高速だと、処理時間はあまり気になりませんが、CPUモードとGPUモードを比較すると、GPUモードのほうが1.5倍位速いようです。
$ time th fast_neural_style.lua \ -model models/instance_norm/udnie.t7 \ -input_image input.jpg \ -output_image udnie.jpg \ -image_size 512 -gpu 0 -use_cudnn 1 Writing output image to udnie.jpg real 0m1.916s user 0m1.389s sys 0m0.641s
なお、image_size
オプションで設定したサイズよりも2ピクセル小さい画像(512に設定すると、510)が出力されています。
各モデルの変換結果の一例は、以下の通りです。

model candy.t7

model feathers.t7

model mosaic.t7
まとめ
Real-Time Style TransferのTorchによる実装「fast-neural-style」で、画像の高速スタイル変換を試してみたところ、画像サイズ510×510のスタイル変換が、高速(CPUモードは約3秒、GPUモードは約2秒)に行えました。