---
robots: noindex, nofollow, noarchive
---
# SinGAN
今回の映像メディア学の課題では,ICCV 2019 の Best Paper である "[SinGAN: Learning a Generative Model From a Single Natural Image](https://openaccess.thecvf.com/content_ICCV_2019/html/Shaham_SinGAN_Learning_a_Generative_Model_From_a_Single_Natural_Image_ICCV_2019_paper.html)"[1] を選び,実装を行った.
## SinGAN の特徴・新規性
SinGAN では,これまでの GAN を用いた画像生成と大きく異なり,1枚の画像のみを用いて学習し,人間から見て矛盾のない元画像に似た画像を生成することができる.
それだけでなく,塗り絵風の画像や超解像画像の生成など,様々なタスクに応用することができる(下図,元論文から借用).

先行研究で深層学習を用いて1枚の画像から異なる画像を生成するものは存在するが,それは特定のタスクに特化したものであったり,GAN を用いたものでも "Conditional" (1枚の画像から生成される画像はいつも同じ) なものばかりであった.
一部の先行研究では GAN を用いた "Unconditional" (1枚の画像を学習させ,異なる生成画像を得る) な学習を提案したものもあったが,それらはどれもテクスチャの生成を行うものであり,人間が見て意味のあるような「似た」画像を生成するものではなかった(下図,元論文から借用).

一方で,SinGAN を用いると単一画像から,人間が見て意味のある似た画像を生成することができる.
単一の画像を使用することで,画像を集めるコストを大幅に低減させることが可能となる.
これが SinGAN の特徴・新規性であり,Best Paper に選ばれた理由となっている.
## SinGAN のモデル
SinGAN は patch-GAN [2] を何層にも積み重ねたようなアーキテクチャを採用している.
具体的には,GAN の Generator を $N+1$ 個積み重ね,それを各々 $\{G_0, G_1, \cdots, G_N\}$ とすると,それぞれのGANに入力する画像は元画像をダウンスケール率 $r^n$ でダウンスケールしたものを元とする.
訓練はまず一番小さい画像サイズ $G_N$ からはじめ,毎スケールランダムノイズを加算しながら,より大きな画像サイズへと学習を進めていく.
なお,一番小さい画像サイズ $G_N$ で学習を行う際は,元画像は使用せず,ガウシアンノイズ $z_N$ のみを用いて学習を行い,生成画像 $\tilde{x}_N$ を得る.
この最小スケールでの受容野 (Receptive field) は元画像の 1/2 程度となるため,画像全体のオブジェクトの配置等を決定するために使われる.
スケール $n < N$ では,前のスケールで生成した偽画像にガウシアンノイズを加えたものを Generator の入力とする.すなわち,
$$
\tilde{x}_n = G_n(Z_n, (\tilde{x}_{n+1})\uparrow^r)\quad(n < N)
$$
となる.ただし,$(\tilde{x}_{n+1})\uparrow^r$ は1つ前のスケールで生成された画像を,これから学習させようとしているスケールの画像サイズにリサイズしたものである.
なお,$G_n$ は以下の操作を行う.
$$
G_n(Z_n, (\tilde{x}_{n+1})\uparrow^r) = (\tilde{x}_{n+1})\uparrow^r + \psi_n(z_n + (\tilde{x}_{n+1})\uparrow^r)
$$
ここで,$\psi_n$ は Conv(3x3)-BatchNorm-LeakyReLU を5層重ねたものである.
カーネルサイズは32から始め,4スケールごとに2倍にする.
なお,Discriminator $D_n$ の構造も $G_n$ と同じ Conv(3x3)-BatchNorm-LeakyReLU を5層重ねたものである.
全体の構成としては,下図の通り(元論文から借用).

## 学習
損失は以下のように定義される.
$$
\underset{G_n}{\rm{min}}\;\underset{D_n}{\rm{max}}\;\mathcal{L}_{\rm{adv}}(G_n, D_n) + \alpha\mathcal{L}_{\rm{rec}}(G_n)
$$
-----
敵対的損失 (Adversarial Loss) は WGAN-GP 損失 [3] を用いている.
先行研究とは異なり,この損失は画像全体に対して定義されている.
-----
再構成損失 (Reconstruction Loss) は入力した際に元画像が生成(=再構成)されるようなノイズが存在することを保証するためのものである.
再構成ノイズ $z_{N}^{\rm{rec}}$ として $z^*$ を取る($n < N$ に関しては,再構成ノイズは全0).
ここで,$z^*$ は学習開始前に一回だけ生成され,学習に渡って同一のものを使用する.
この再構成ノイズを入力して各層で得られた画像を $\tilde{x}_{n}^{\rm{rec}}$ とすると,$n < N$ では,
$$
\mathcal{L}_{\rm{rec}} = ||G_n(0, (\tilde{x}_{n+1}^{\rm{rec}})\uparrow^r) - x_n||^2
$$
と定義され,$n = N$ では,
$$
\mathcal{L}_{\rm{rec}} = ||G_N(z^*) - x_N||^2
$$
と定義される(はずなのだが,どうやらこの通りではない.これは実装の項で後述).
## 実装
論文をもとに,実装を行った.レポジトリは[こちら](https://github.com/masaosg/SinGAN-Practice).
SinGAN を用いてランダム画像を生成する,SinGAN の核となる部分を実装した.
アニメーション生成や超解像等の応用例に関しては,今回は実装していない.
実行方法は README に記した.
なお,ハイパーパラメータは,[元実装](https://github.com/tamarott/SinGAN)の値を使用している.
### 論文と実装の相違点
上でも述べた再構成損失の定義では,実際に実装した際に期待通りの結果が得られなかった.
論文では,$n < N$ の時に $G_n(0, (\tilde{x}_{n+1}^{\rm{rec}})\uparrow^r)$ と定義されているが,実際には $G_n((\tilde{x}_{n+1}^{\rm{rec}})\uparrow^r)$ (同じ画像を2つの入力に入れる) としないと,生成画像の色が飛んでしまい,うまく生成できなかった.
また,逆に $n = N$ のときは $G_n(0, z^*)$ とする必要があった.
### 生成画像例
実際に生成した画像の例を以下に示す.
元画像,生成されたランダム画像の順に並んでいる.
 
 
## 参考文献
[1] T. R. Shaham, T. Dekel and T. Michaeli, "SinGAN: Learning a Generative Model From a Single Natural Image," 2019 IEEE/CVF International Conference on Computer Vision (ICCV), Seoul, Korea (South), 2019, pp. 4569-4579, doi: 10.1109/ICCV.2019.00467.
[2] Chuan Li and Michael Wand. Precomputed real-time texture synthesis with markovian generative adversarial networks. In European Conference on Computer Vision, pages 702–716. Springer, 2016.
[3] Ishaan Gulrajani, Faruk Ahmed, Martin Arjovsky, Vincent Dumoulin, and Aaron C Courville. Improved training of wasserstein GANs. In Advances in Neural Information Processing Systems, pages 5767–5777, 2017.