【とりあえず動かすChainer】pix2pix

f:id:rew05:20171003232931p:plain

今更だけど、chainerでpix2pixを動かすやつ。

 

以下のソースコードをお借りしました。

github.com

 

pix2pixとは

簡単に言うと画像変換ネットワーク。

2つの画像A,Bをペアで学習させることで、画像A’を入力すると画像B'を出力するモデルになる。

https://arxiv.org/pdf/1611.07004v1.pdf

具体例は上記論文の画像を見てもらうとして、有名どころとしては

  • 線画→実写真
  • モノクロ→着色

などだろうか。

 

今回はお借りしたソースコードを動かして、学習が進むにつれて生成画像がそれっぽくなる様子を紹介する。

 

使用する環境は以下、マシンスペックはこちら→PC買いました。 - 深層ロック

Python3.5(Anaconda4.4.0)

Chainer == 2.0.0

cupy == 1.0.3

tqdm == 4.14.0

 

準備

githubからソースをダウンロードし、任意のフォルダに展開。今回はC:\python\pix2pixに展開する。

f:id:rew05:20171003221249j:plain

 

次にREADME.mdに記載されているhttp://cmp.felk.cvut.cz/~tylecr1/facade/からデータセットをダウンロードし「C:\python\pix2pix\facade」に配置。(extendedは要らないかも)

f:id:rew05:20171003221557j:plain

 

データセットについて

データセット

の同名異拡張子の3ファイルで1組になっている。jpgは実際の建物の写真、pngはjpgのラベリング画像。(xmlpng作成時に使用?生成?たぶん使わない。)

ここで言うラベリングとは、画像に写る各部位を色で表現する方法で、例えば今回の場合、濃い青は外壁、黄色は窓のシャッター(?)、赤は柱を表す色になっている。実際の写真とラベリングされた画像をペアで覚えさせることで、ラベリング画像を入力したときに「ここは赤色だから柱」「濃い青だから壁」と認識して建物っぽい画像を生成して出力する。

f:id:rew05:20171004232555p:plain

学習

コマンドプロンプトを開き、下記コマンドを実行。

python train_facade.py

 GPUを使用する場合は後ろに「-g 0」を引数で追加。

f:id:rew05:20171003222131j:plain

(データセットをダウンロードし忘れると上部のエラーが出る。わ、わざとだし・・・)

 

学習の際に建物の画像はランダムな位置から256*256pixelで切り抜かれ使用される。学習途中で行うテストには上記切り抜き画像を使用し、5*5=25枚並べた状態で出力される。

 

前述したスペックで学習終了まで約6時間半。朝起きたら終わってた。

学習の途中経過は「C:\python\pix2pix\result」に、学習途中で生成した画像は「C:\python\pix2pix\result\preview」に出力される。image_gen_***.pngが生成画像、image_gt_***.pngが正解画像、image_in_***.pngがラベル画像。

 

以下に出力された画像を結合した画像を配置した。左から生成画像、正解画像、ラベル画像。

f:id:rew05:20171004001758p:plain

学習1000回

f:id:rew05:20171004214034p:plain

学習30000回

f:id:rew05:20171004213627p:plain

学習59000回


学習回数が増えるにつれて、ぼんやりしていた部分がはっきりしてきたり、壁やパーツのバリエーションが増えていることがわかる。

 

おわり

 このようにpix2pixを使うと12色の画像から本物の建物っぽい画像が生成できる。今回のラベリング画像は識別しやすいように色を分けているが、コンピュータ的には値が1でも違えば識別できるので、実際は0000~1111までの4bitあれば今回の学習を再現することができる。しゅごい。

 

次は違うデータセットでやってみたい。ラベリングがめんどい。