pix2pix の参考ソースコード
pix2pixとは、画像から画像をGANで生成するものです。
すでに様々なとこで実装例があがっており、「Keras pix2pix」で検索するとKeras での実装例としてtdeboissiere/DeepLearningImplementations/pix2pixが出てきます。
公式のページでもkerasの実装例として載せられています。
しかし、論文で述べられているconditional GAN(cGAN)の実装をしていないように見えます。
ここでのcGANとは、
generatorは普通にinputからouput画像を生成するのは変わりませんが、discriminatorがgeneratorにいれたinputとoutputの両方をみて、偽物かどうか判断するということです。
上記したkerasのプログラムでは、Discriminatorにgeneratorのoutput画像しか入れていません。
また、個人的にそこまで大きくないプログラムを複数のファイルにわけるのは好きじゃないのと個人的に必要のない所が多かったので、いろいろスッキリしてかつdiscriminatorにinput画像も入れたコードに書き換えました。
改変したコード
コードの全文はgithubにあげてます。
backendはtensorflowのみで、channnel_last が前提になっています。
ファイルはpix2pix.pyとmodels.pyの2つだけです。
img2h5.pyが画像の入ったフォルダからh5pyを生成する独立したプログラムです。
主な変更点はdiscriminatorです。
もともとは、
DCGAN_output = discriminator_model(list_gen_patch)
のように、discriminatorには、generatorの出力だけを入れていました。
それを、以下のようにもともとの画像を合わせて入れるように変更しました。
DCGAN_output = discriminator(list_gen_patch+list_raw_patch)
結果
同じ画像群・epoch数(40)で学習、validation画像から生成しています。
もともとの参考ソースコードをそのまま実行した結果
上段がopencvでcanny処理をした画像
中段が出力画像
下段が元画像です。
これはこれで出来ていますが、すこしボケています。
cGAN をdiscriminatorに組込んで実行した結果
参考ソースで生成した画像より、目など細かい箇所でもそれなりに書けています。
ということで、ちょっと改変したら少し出力よくなったよでした。