機械学習とかコンピュータビジョンとか

CVやMLに関する勉強のメモ書き。

SinGAN: Learning a Generative Model from a Single Natural Imageを読んだのでメモ

はじめに

SinGAN: Learning a Generative Model from a Single Natural Imageを読んだのでメモ. 一言で言えば1枚の学習画像からGANを学習するという研究.

Method

目標は一枚の学習画像xのinternal statistics(1枚の画像が従う分布という理解)をGANによって捉えることで,構成はほぼ通常のGANと変わらない.違いとしては学習データが1枚で,1枚の画像からイテレーションごとにランダムに切り抜かれたパッチを学習に用いる.これはinternal distirbutionを異なるスケールで捉えることを目的としてる.

Multi-scale architecture

SinGANはそれぞれ異なる解像度を生成するN個のgenerator \{G_0,\dots,G_N\} (Nが最も解像度が低い)とそれぞれのGeneratorに対応する解像度のDiscriminator D_0,\dots,D_N,学習画像のパッチ\{x_0,\dots,x_N\}を使って学習が行われる.GeneratorとDiscriminatorの受容野は全て同じとのこと.r\gt1をダウンサンプリングのスケールファクターとする.

G_Nガウスノイズz_Nから画像を生成する,\tilde{x}_N=G_N(z_N)G_{N-1},\dots,G_0はすべてガウス乱数と前段のGeneratorの出力画像を入力とする.

\displaystyle
\tilde{x_n}=G_n(z_n,(\tilde{x}_{n+1})\uparrow^r)

\uparrow^rはスケールファクターrのアップサンプリングを表す.Generatorの構造はすべて同じ(論文のFig. 5)で,この構造によりアップサンプリングによって得られた画像\tilde{x}_{n+1}の詳細な部分をノイズ成分に基づいて推論するような働きをする.

\displaystyle
\tilde{x}_n=(\tilde{x}_{n+1})\uparrow^r+\psi_n(z_n+(\tilde{x}_{n+1})\uparrow^r)

\psi_nはConv(3\times3)-BatchNorm-LeakyReLUを5ブロック積み重ねたCNNでチャネル数はG_Nが32で,スケールが上がるごとに2倍に増やしていくとのこと.

Training

学習はWGAN-GPのAdversarial Lossと再構成誤差からなる.

\displaystyle
\min_{G_n}\max_{D_n}\mathcal{L}_\text{adv}(G_n,D_n)+\alpha\mathcal{L}_\text{rec}(G_n)

Adversarial lossはinternal distributionを捉えるためでreconstruction lossは特定のノイズがx_nを生成することを保証する.WGAN-GPに関する部分は割愛.Reconstruction lossに関して,xを生成することを保証するため,まず固定のガウスノイズ\{z^\text{rec}_N,z^\text{rec}_{N-1},\dots,z^\text{rec}_0\}=\{z^\ast,0,\dots,0\}を設定する.ただし,z^\astは学習中にサンプリングされたノイズを固定して使うとのこと.この固定ノイズを使って損失を計算する.

\displaystyle
\mathcal{L}_\text{rec}=\|G_n(0,(\tilde{x}_{n+1}^\text{rec})\uparrow^r)-x_n\|^2

まとめ

手法自体はほぼ従来のGANと変わらず,生成画像のクオリティはめちゃくちゃ高い.PyTorch実装も公開されており簡単に試すこともできる.