読者です 読者をやめる 読者になる 読者になる

nullnull7の日記

プログラミング、写真、旅、その他日常について。

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コマンドで実験環境が整って感動しました。
また無償トライアルでハイスペックなサーバを貸していただいたさくらの高火力チームの方々、ありがとうございました。

Steins; Gate 0 感想

全ルートクリアしました。いろいろ話したいことあるが周りで終わってる人いなくてもやもやしたので書く ネタバレありありです。

続きを読む

ファイアーエムブレムif 白夜王国をクリア

ついに出ましたねー。
ひとまず白夜王国のハードカジュアルをクリアしました。プレイした感想をつらつら書いてみます。

続きを読む

rails + backbone.js + create.jsでブラウザゲーム制作 (3)

f:id:nullnull7:20150322211409g:plain

基本的な機能が出来上がって、ストーリー書いたり素材集めたり演出頑張ったり…と開発以外の部分に時間かかるようになってきたため、製作に一区切りつけることにしました。

目的だったフロントエンドの勉強は、大分手を動かしてアウトプットできた。しばらくインプット期間に入りたいなと思います。

作るのは楽しいので、1年後くらいに公開できるレベルにしたいなあ…とうっすら考えながら、一旦開発スピード落とそうと思います。こんにちは土日。


…と、そんな気分ではあるのですが、せっかく作ったものが日の目を見ないのは若干寂しいので、ほんの一部だけ動画晒しておきます(`・ω・´)

本当は音もついてるよ!
デザインがグダグダなのは見なかったことにしてね!
素材は許可まだ取ってないもの使ってますがお許しください。

続きを読む

Backboneのモデルについて&スマホ用CSSのメモ

相変わらず勉強のためゲーム製作中です。(前回:Ruby on Rails + Backbone.js でゲーム製作中 - nullnull7の日記

進捗は

  • backboneの土台の部分は書き終わり。あとはゴリゴリとイベント書いていく
  • jsのアニメーションのライブラリを調査した
    • tmlib.js辺りがお手頃そう。
    • enchant.jsはtmlibより学習サイト充実してるが若干遅かったりな印象
    • create.jsやpixi.jsは性能良いがちょっと高機能すぎる印象
    • smart.jsはお手軽で使ってみたいがさすがにシンプルすぎる印象
  • デザイン見直した
    • デザイン決まらず死ぬほど時間かかっている。。。
    • デザインも頑張りたいところだけど、時間かけてできるものでもないので、見切りをつける必要。といつも思う(ができない
  • 開発環境を整えたりいろいろ。
  • 今はhtml/cssを書いてる途中

今日はbackboneの感想とcssのメモ晒しておきます。

続きを読む

「タイムトラベラーズ」レビュー

タイムトラベラーズ

タイムトラベラーズ

年末年始にタイムトラベラーズをプレイしました。428、9時間9人9の扉のイシイジロウさんの作品。制作はレベルファイブ

群像劇大好き、タイムトラベルもの大好き、428も面白かった、なので外れることはないと思っていたのだけど…。

※微ネタバレ含む

続きを読む

Ruby on Rails + Backbone.js でゲーム製作中

  • 一本ゲーム作る経験が欲しいなー
  • なんか新しい言語触りたいなー

という思いから、Rails + Backbone.js でゲーム製作中です。ruby触るの初、jsとかフロントエンドを真面目に勉強するのも初。ってことでいい勉強になってます。

どんなゲームかーとかいう話は出来上がったときにする(いつ来るのかw)として、ruby触ってみた感想。

感想
  • 超基本的な文法を1時間くらいさらーっとやって、あとはdotinstallでRuby on Rails入門見たら、あとは適宜ググりながら開発進められるレベルになった。サクサク進めて良い
  • 超ざっくりとした感覚だとPerlPythonの中間って感じ。do, then, end辺りを書くのが非常にウザいけど、それ以外はスッキリ書けていいなーと思う。
    • Pythonでwebアプリを真面目に作ったことないからあれだが、Python数値計算とかの学術用途向け、RubyはWebアプリ向けな印象(偏見です)
  • Railsはモダンだなあ…。rails gとかrailsコマンドが色々いいなーと思った。
    • 最近業務で使っているのが一昔前のPerlフレームワークなのでますます…ゲフンゲフン
    • scaffoldしたら何もせずともウェブサイト出来上がって吹いたw
  • backboneとの連携もbackbone-on-rails というgemがあって導入しやすかった。

とりあえず今困ってることとしては、rails server で立ち上げたサーバーがコード書き換えてもたまにリロードしてくれないこと。ちょっとググっても解決しなかった。 railsがどう動いてるのか何も把握せずただただレールの上にのって開発してるので、そのうち真面目に勉強する必要ありそう。

開発状況

今の開発状況は、APIサーバー側(Rails)がなんとなく終わってきたところ。API側はあとは魔法詠唱のロジック周りとかステータス異常とかスキルによる命中率変化とか…まあ細かい内容。

直近やったことは、そろそろいちいちcurl叩いてデバッグするのも辛くなってきたので、先にフロント側を実装してデバッグしやすくしよう〜と思いフロント側の実装を初めて、その前に絵コンテできてねーわと思い絵コンテを書こうとし、ついつい拘りたくなってデザインに凝ろうとし、しかしデザインセンス無いので全くできあがらずグダグダ……という感じでしたw デザインのセンスと技術が欲しい。。

年内にひとまず動くもの作って、1~2月にデザイン詰めたり細かい仕様の実装を進めたいなー。