にほんごのれんしゅう

日本語として伝えるための訓練を兼ねたテクログ

Pix2pix with Text

Pix2Pixとは

01/06/2017. この記事の生成物に関して、修正点があるのであとで修正します

  • 自動生成系の深層学習の一つ
  • 2つの画像の差を学習して、その差を補う形で画像などを出力する

f:id:catindog:20170106195735p:plain

図1. facadeとよばれるデータで学習した場合

f:id:catindog:20170106195933p:plain

図2. GANのモデルの様子。生成器と、判別機が対立して競い合う

先行研究

初心者がchainerで線画着色してみた。わりとできた。[1]
  • ヒント情報として、色情報を書き足すことで、色を指定している
  • Pic Source: qiita.com

f:id:catindog:20170106200121j:plain

図3. オレンジ色で色のヒントを与えている様子がわかる

Icml2016[2]
  • テキスト情報をSkip Thought Vectorでembeddingすることで、意図した画像を生成する
  • Pic Source: github.com

f:id:catindog:20170106200247j:plain

図4. 左のテキスト情報から右の花の絵を生成している

モチベーション

  • 色指定しなくても、テキスト情報のみでキャラクタの着色を行う
  • 例えば、艦これの響なら髪の色は白で、暁ならば紺色に着色する。モノクロ画像では両キャラクタは非常に似ており、人間が見てもどちらに塗るのが正解か不明瞭
    • テキスト情報でこれは「響」と記されていれば、自動で髪の毛を白く塗ってくれるのでは。

提案手法

  • Pix2Pixの入力に用いられるテンソルは、非常に高次元であり、RGB程度の粒度であれば、たかだか256*256*3程度に過ぎない
  • テキスト情報を格納できる領域を増やし以下のように、テンソルを拡張する
(256, 256, 3) -> (256, 256, 4)

  • 空いた次元に、画像のタグ情報をベクトル化して、組み込む

従来手法

f:id:catindog:20170106200459p:plain

図5. 初音ミクとモノクロ画像だけではなんとも判定できないかも...本当に緑に髪を塗るのが正解?

提案手法2

f:id:catindog:20170106200638p:plain

図6. 初音ミクといえば、髪は緑!わかるよ!

実験環境

  • ChainerのPix2Pixをもとに変更、拡張
  • Epoch: 300
  • BatchSize: 1
  • 学習率: 0.00001

使用したマイパソコンのキャッシュに残っている画2万枚
使用したキャラクタードメイン: 艦これ、東方、FGO、グラブル
使用したテキスト情報: タグ情報
Pic Source: pixv.net

大体 GTX 1080で一週間ぐらいかかった

実験結果

f:id:catindog:20170106200851p:plain

図7. キャラのヒント情報が聞くためか、キャラのイメージカラーを特定しやすい。塗り間違いも少ない

Optional: カラー化とカラー化抑制

f:id:catindog:20170106201033p:plain

図8. モノクロになるタグと言うものが存在する可能性の示唆

  • 明示的に「ノート」や「モノクロ」を意味するベクトルが入ると、カラー処理は行われないようである

Optional: 謎の言語を生成する

f:id:catindog:20170106201224p:plain

図9. 文字のような謎の記号の生成

考察

  • ヒント情報が画像と同じように処理したためかだいぶ拡大して用いたがたまに、潰れている可能性も否定できない。CNNで処理しても生き残るような素性に加工するする必要がありそう
  • 改良点が多く、テキストのベクトル化方法や、更に詳細な画像を出力するようにStack GANの発想で、全体的な方向性を決定するモデル・より詳細に描き上げるモデルなど組み合わせても良いかもしれない。
  • ここから、もとの線画を欠落させると、text2imageと近しいモデルになるかと思われる

Advanced Work

  • Text2Imageを再現してみる
  • 高解像度化する
  • Web経由で任意の単語を切り替えることで、任意の画像の作成を可能にする
  • Skip Thought Vectorなどのより高性能なEmbeddingなどを用いる
  • 省メモリ設計にする:今回の実験だけで、32GByte中、30GByteを学習で消費したので、何らかの変更を行う