はじめに
ICCV 2019 Best Paperを受賞したSinGanで遊んでみました。
論文:SinGAN: Learning a Generative Model from a Single Natural Image
付録はこちら。
SinGanの特徴
- パッチサイズごとに、パッチの内部分布(内部統計量)※を学習する
- 画像1枚で学習できるため、大量の画像を必要としない
- 応用範囲が広い
- paint-to-image
- editing
- harmonization
- super-resolution
- animation
※論文中ではinternal statistics of patch や internal distribution of patchと表現されています。適切な訳語が不明のため「パッチの内部分布」としています。
構成
patch-GANsを積み重ねるような構成になっています。最初はノイズから低解像度の画像$\tilde{x}_{N}$を生成できるように学習します。
次に、生成した画像をアップサンプリングしてノイズを加え、ちょっと大きい解像度の画像$\tilde{x}_{N-1}$を生成できるように学習します。
これを繰り返すと、パッチサイズ(図右の黄色枠)ごとに、パッチの内部分布が学習されます(Gはすべて同じreceptive field)。この構成の狙いは、画像の全体的なstructureと、部分的なtextureを獲得することです。
環境作成
○実行環境
* Ubuntu 18.04 LTS
* Anaconda3 2019.10.
* GeForce GTX 970
◯手順
- githubから著者のリポジトリをクローン
- pythonの仮想環境を作成
githubから著者のリポジトリをクローン
git clone https://github.com/tamarott/SinGAN.git
pythonの仮想環境を作成
$ conda create -n SinGAN python=3.6 #pythonのverは論文に合わせる
$ cd SinGAN #落としてきたリポジトリに移動
SinGAN$ python -m pip install -r requirements.txt #必要なパッケージをインストール
学習
readme.mdの記載通りに。
$ python main_tarin.py --input_name <training_image_file_name>
画像サイズにもよりますが、学習時間は1〜2時間です。
テスト
縦横scaleを1/2倍,1倍,2倍にして画像を生成してみます。
$ python random_samples.py --input_name <training_image_file_name> --mode random_samples_arbitrary_sizes --scale_h <horizontal scaling factor> --scale_v <vertical scaling factor>
設定したサイズの画像が生成されるよう、scaleに合わせて$z_N$の次元を増減しています。また、$z_N$の値を変えて画像を50枚出力しているので、その中で個人的によさそうな画像と駄目そうな画像をピックアップしてみました。
Trainingと似た雰囲気の画像は生成できていますが、細部を見ると違和感を感じる画像がちらほらあります。
また、明らかに変な画像も生成されており、birdsは縦に縮めると鳥の群れが消えて、mountains3は縦に伸ばすと山と水面の間の影が変なふうに伸びてしまっています。
おわりに
ICCV 2019 Best Paperを受賞したSinGanで遊んでみました。それらしい雰囲気の画像は生成されていますが、要らん部分が伸びたり、判子を押したみたいに同じ物体があったりと、変な画像も多く生成できてしまいます。
scale変更のサンプルプログラム(random_samples.py)は$G_N$からしか画像生成できないので、もう少し高解像度の$G$から生成できれば多少ましになるかと思います。
SinGANは画像生成以外に超解像やアニメーションなどにも応用できるので、それはまた後日試してみたいと思います。