最近良く聞く「ディープラーニング」がどんな物なのか、実際にChainerを利用したChainer-goghを動かして体感してみた話。
【前提】
・使用OS:CentOS 7
・Pythonが利用可能であること。
Chainer
Chainerは、見るからに難しそうなディープラーニング(深層学習)のために開発されたオープンソースのフレームワークで、Python(Version 2.7以上)上で動作します。
GPUもサポートしており、CUDAなどを利用した計算も可能。彼らいわく「ニューラルネットを誤差逆伝搬法で学習する」との事。
"聞いたことだけはある"単語がちらほらあって、ワクワクします。
Chainer-gogh
GitHubに掲載されているサンプルによると、以下のような結果が得られるそうです。
https://github.com/mattya/chainer-gogh
猫の画像にパターンを適用しています。
なんともそれっぽい。そして、何かかっこいい。
手順
何はともあれ、まずは一度動かしてみましょう。
今回はPythonが動作するよう設定されたCentOS7上で実行してみました。
使用する画像は、昼休みに会社の近くで撮影した画像と、ゴッホの"夜のカフェテラス"です。
あえて昼の写真に夜をモチーフとした絵画をぶつけてみましたが、どうなることやら。
元画像
上の2枚の画像を使って生成。
早速環境を整えていきます。
// Chainerをインストール
$ pip install chainer
// GitHubから任意のディレクトリへファイルをclone
$ git clone https://github.com/mattya/chainer-gogh.git
cloneしたchainer-goghディレクトリ内へ、以下URLからDLしたmodelファイルを配置します。
https://www.dropbox.com/s/0cidxafrb2wuwxw/nin_imagenet.caffemodel?dl=1
// 画像の処理に必要なPIL(Python Imaging Library)などをインストール
$ easy_install --find-links http://www.pythonware.com/products/pil/ Imaging
$ pip install image
スタイルを抽出したいファイルと、適用したいファイルをchainer-goghディレクトリへ配置する。
今回はそれぞれstyle.png、im1.pngとして配置しました。
// 実行(CPUモード)
// python chainer-gogh.py -m nin -i input.png -s style.png -o output_dir -g -1
$ python chainer-gogh.py -m nin -i im1.png -s style.png -o output -g -1
もちろん上記のままでも良いのですが、パラメータを指定してやることで自分好みに調整する事が出来ます。
// 例)元画像の重みを上げ、横幅460、イテレーション8000まで実行して作成する場合。
$ python chainer-gogh.py -m nin -i im1.png -s style.png -o output -g -1 --lam 0.8 --width 460 --iter 8000
それぞれのデフォルト値はソースコードに書かれています。
特に、iterとlamの値は出力に大きく影響するので、それぞれ適切な値を探してみてください。
生成結果
とくに何も考えず、感覚で実行した所このようになりました。
まあ、初めてにしてはアリなのではないでしょうか。
GPUを利用して、他のモデルファイルを使ってやればさらに高品質な結果が得られるらしいのですが、あいにくこの記事を書いている環境ではGPUが使えないため、また試してみた後に追記なりしたいと思います。
高速変換について
今回は標準のモデルファイルを配置しましたが、学習済みのモデルファイルへと置き換える事で処理時間を劇的に短縮する事ができるようです。
が、今はそこまで試せていないのでURLの紹介のみに留めます。
https://github.com/yusuketomoto/chainer-fast-neuralstyle
1から機械学習や深層学習などといった物を実装するのは難易度が高いと思いますが、既存の物を動かして体験するだけであれば、ここまで簡単なんですね。
前回、「白黒画像に着色してくれるSiggraph2016 Colorizationがすごい」として記事にした物もそうですが、難易度高めな課題に対して第一歩を踏み出すためのハードルは、低ければ低いほど興味を持ちやすいですよね。
また面白い物を見つけたら、いろいろ触りつつ徐々にでも掘り下げて行きたいと思います!