Into the Horizon

programming, photography, and daily log

Chainerを使って写真を新海誠さん風イラストに画風変換する

この記事はChainer Advent Calendar 2016の14日目の記事になります。

概要

こちらのツイートの研究について、詳しくお話します。

この記事では、上記の最終的な出力に至るまでに試したことを紹介します。

使用した手法の詳しい説明には触れず、結果の出力画像をメインに紹介するので、機械学習に詳しくない方でも楽しく読んでいただけるかなと思います。

はじめに

2014年に公開されたGatys et al 2014の論文を皮切りに、ディープラーニングを使った画風変換のアルゴリズムが一時期世間を賑わせていました。この論文を元に実装された(と思われる)アプリのPrismaは結構なヒットになっていた印象です。画風変換をご存知ない方は、こちらの記事をご覧ください。 画風を変換するアルゴリズム | Preferred Research

元論文やPrismaではゴッホの画風変換に取り組んでいましたが、この記事ではもっと皆さんに身近な例と言える、漫画やゲーム・アニメ風のイラストへの画風変換に取り組んだ結果をご紹介します。

もしも上手くいけば、将来的にはイラストレーターさんやアニメーターさんの作業をお手伝いする(参考:prosthetic knowledge)ことが考えられます。

実験手法

mattyaさん、yusuketomotoさんが公開している素晴らしいライブラリを使わせて頂きました。 自分で書いたコードは実験を楽に進めるためのシェルスクリプトくらいです。

使用されている手法についてここでは詳しく述べませんが、それぞれのページでわかりやすい解説記事がのっていますので、興味がある方はそちらを参考にどうぞ。

実験

冒頭で紹介した出力例に辿りつくまでに試したことを紹介します。

実験1

まず、何も考えずchainer-goghを使います。

  • ライブラリ:chainer-gogh
  • 環境:g2.2xlargeインスタンスGPUメモリ1GB)
  • パラメータ:ほぼデフォルト(widthを~600px)
入力画像 出力画像
https://gyazo.com/e234610d885d37982d5e7b5dbcb14add https://gyazo.com/294fea35d8315c57ea71d1e93031fe58
https://gyazo.com/0c613e0d9263803bba9a4ab5a3a3273d https://gyazo.com/2b37b195862252941ccafff25f0c70f9
https://gyazo.com/3dbd18914ed4a1ee076e04e4d92dac26 https://gyazo.com/5e8bf9b8a048c1234aef5510f84caabc

解像感はありませんが、なんとなく良い感じです。

この時点で、以下がわかりました。

  • 出力のサイズに応じてGPUのメモリが消費される
    • 1GBのメモリでは出力は横幅600pxが限界
    • 出力サイズが大きいほど、鮮明な画像になる
  • 使用モデルはvggがもっとも良い。ただし出力には時間がかかる
  • 1回の試行にかかる時間は出力横幅600px, 2000回イテレートで2時間程度

実験2

解像感を出すのにあたり、単純にGPUのメモリがボトルネックであったため、良いGPUにして再チャレンジします。

また、色々とパラメータを変更して実験を行い、最適なパラメータに調整しました。

  • ライブラリ:chainer-gogh
  • 環境:高火力サーバ(GPUメモリ4GB)
  • パラメータ:vgg w1200 i2000 lam0.05
入力画像 出力画像
https://gyazo.com/ba0220765e5993a74d78adfd25bcfdc9 https://gyazo.com/517ff497177648bfe21cac0330ebf1a3

だいぶ良くなりました。しかしまだ作品にするには解像感が足りません。

実験3

解像感をあげるためには出力サイズをより大きくしたいところですが、 これ以上はGPUメモリの関係で出力サイズを大きくすることができません。

そこで、画像を16分割した状態で、それぞれに対して画風変換を行い、最後にそれを結合させることにしました

また、この際 スタイル画像も入力画像それぞれ専用に用意し、それぞれに含まれる要素を揃えます。 これを行わないと、例えば草むらしかない右下の断片の画像に桜のスタイル画像をあててしまい、草むらがピンク色になったりしてしまいます。
綺麗に仕上げるために、この処理を行うのが大きなポイントでした。

入力画像 出力画像
https://gyazo.com/8ff18aefccaee2a0fb280bda968c66cd https://gyazo.com/761b242b46db6c5b782a7a4bebadcd60

これを少し手動で補正したものが、冒頭で紹介した例になります。
かなり綺麗に画風変換できたのではないかと思います。

実験4 ポートレート写真の変換

ここからは失敗例を紹介します。まず、人の写真の画風変換を試したものから。

入力画像 出力画像
https://gyazo.com/03e17862d46ad9aa9aa28065d156f9d5 https://gyazo.com/407783421e9a2fe0f20a4cc053dbbaed
https://gyazo.com/dfe9476f82b0218f27158c84466c5826 https://gyazo.com/9813b9d42fd637d66a3d0a9ea5ec5023

……なかなか難しいですね(モデルさんごめんなさい)。

以下のユキちゃん先生のような画像を目指していたのですが、雰囲気を大雑把にコピーするのは結構上手くいっても、 アニメの人の顔のようにそもそも入力画像と形が違うもの(特に目)は、今回の手法にはあっていなさそうです

ただし、実験3でやったように分割してスタイル画像を最適化したり、解像感をあげればもっと良くなるかもしれません。(ここは時間が足りず実験できませんでした)

参考:ユキちゃん先生(引用元:「言の葉の庭」)

https://gyazo.com/9e31656dfabac8cb3a8b7de5297b9aa1

実験5 chainer-fast-neuralstyle

chainer-fast-neuralstyle の出力結果です。

学習にはMicrosoft COCO datasetを使いました。

入力画像 出力画像
https://gyazo.com/e234610d885d37982d5e7b5dbcb14add https://gyazo.com/99430261712e2fe32b174391b5c38d70
https://gyazo.com/71411e684104773d5fb4b7ad396abc09 https://gyazo.com/4df678a2e20f6627723138c9b4dd968a
https://gyazo.com/48e5509ad811e7788af9a9418202dc20 https://gyazo.com/4ab4fae3aee5718e6f3b1d1cb813361d

解像感が素晴らしいですね。
こちらの手法は、一度学習を終えれば出力を作成する際にはほぼメモリを使わないので、出力画像を生成する際にメモリがボトルネックにならず、出力画像の解像度をあげやすいです。(ちなみに学習には15時間ほどかかっています)

しかし、全体がピンクになったり青くなったり、のっぺりとした印象です。
これは今回使った訓練画像が、実際に入力する画像とかけはなれたものが多かったためだと考えられます。
桜と関係のないただの室内画像などを、桜のスタイル画像にできるだけ近づけて変換しようと学習してしまい、何でもかんでもピンク色にしてしまうような学習をしてしまった と考えられます。

逆に言えば、訓練画像を変えたり学習の仕方を工夫すれば改善が見込めそうです。

実験6 動画への応用

chainer-fast-neuralstyleは今まで紹介していたchainer-goghの手法とは違い、一度学習すれば高速に変換ができるため、動画への応用が可能です。

うまくいけばまさしく新海誠さん風のアニメが作れるはず!

雨の中新宿御苑で動画を撮影し、画風変換をしてみました。果たしてその結果は…


新宿 - 言の葉の庭風

………。

ちょっと現状のクオリティだと厳しいですね。

動画への応用は盛んに行われてるので、チラつきを抑えたりするもう少しいいやり方があるかもしれません。

https://www.youtube.com/watch?v=Khuj4ASldmU

https://research.googleblog.com/2016/10/supercharging-style-transfer.html?m=1

https://twitter.com/elluba/status/805730357215686656

まとめ

画風変換アルゴリズムを用いて、実用レベルで写真をアニメ風のイラストに変換できることがわかりました。

しかし、記事中はあまり述べていませんが、今回の実験を行うにあたり 入力画像とスタイル画像の組み合わせはかなり時間をかけてセレクトしており、現状だと汎用的に使える手法とは言いづらい状態です
例えば、上記の電車の例では、元写真に桜と草むらと電車と人が写っているために、スタイル画像にもこれらの要素が写っているものを上手くセレクトする必要がありました。

今後やってみたいことは以下になります。

  • 更に様々な入力画像について変換を行い、サンプルを集める
  • 入力画像を要素ごとにレイヤーに分割し、レイヤーそれぞれにあったスタイル画像を選び、レイヤごとに画風変換を行う
    • 例えば上の例で言えば、桜の花びら部分のみのレイヤと、電車のレイヤと、草むらのレイヤに分割するなど。
    • これにより、例えば桜のスタイルが草にあたってしまうことがなくなる
    • また適したスタイル画像を準備しやすくなりそう。(今までは桜と草むらと電車っぽいものが写っているスタイル画像を用意しなければいけなかったが、それぞれの要素が写っているスタイル画像を別々に用意すれば良いだけになる)
  • chainer-fast-neuralstyle の訓練画像を変えて学習してみる
  • 他にも色々手法が出ているので、試してみる

やりたいことは色々あるので、一緒に活動したい方いればぜひお声がけください。

おわりに

こんなにお手軽に最先端の研究を味わえるライブラリを提供していただいたPFIさん、mattyaさん、yusuketomotoさん、どうもありがとうございました。ec2インスタンスを使った際、sshログインしてからわずか3コマンドで実験環境が整って感動しました。
また無償トライアルでハイスペックなサーバを貸していただいたさくらの高火力チームの方々、ありがとうございました。