1.はじめに
既存のGANで3D表現をしようとすると一貫性のないレンダリングとなるため画質が落ちる問題点がありました。今回ご紹介するGANは、モデル内に3D表現を盛り込み、一貫性のあるレンダリングが可能なpi-GANという技術です。
*この論文は、2021.4に提出されました。
2.pi-GANとは?
下記が、Generatorの概略図です。空間座標(Position x)を多層パーセプトロン(φ0〜φn-1)に入力します。一方で、ノイズ(Noise z)をマッピングネットワーク(Mapping Network)を通して周波数と位相シフトに変換し各層に入力します。その結果、空間密度分布σ(x)と色c(x,d)を得ることが出来ます。
空間密度分布と色の情報があると、任意のカメラ位置から画像をレンダリングすることが出来ます。具体的には、カメラ原点oから出した線毎に、空間密度分布と色を積分することによって得ることが出来ます。
学習中に、Discriminatorで判定する画像は、カメラ位置をランダムサンプリングして生成したものを使用します。
では、早速コードを動かしてみましょう。
3.コード
コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。
まず、セットアップを行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# gpu チェックチェック ! nvidia-smi -L # githubからコードを取得 ! git clone https://github.com/marcoamonteiro/pi-GAN.git %cd pi-GAN # ライブラリーのインストール ! pip install -r requirements.txt # 学習済みモデルのダウンロード import gdown gdown.download('https://drive.google.com/uc?id=1bRB4-KxQplJryJvqyEa8Ixkf_BVm4Nn6', './CelebA.zip', quiet=False) ! unzip CelebA.zip gdown.download('https://drive.google.com/uc?id=1WBA-WI8DA7FqXn7__0TdBO0eO08C_EhG', './Cats.zip', quiet=False) ! unzip Cats.zip gdown.download('https://drive.google.com/uc?id=1n4eXijbSD48oJVAbAV4hgdcTbT3Yv4xO', './CARLA.zip', quiet=False) ! unzip CARLA |
render_multiview_images.pyを使って、マルチビュー画像を生成してみましょう。コマンド直後にパラメータのパス、–curriculmで種類、–seeds で画像を指定します。
1 2 3 4 5 6 7 8 9 10 |
# マルチビュー画像を作成(CelebA) ! python render_multiview_images.py CelebA/generator.pth --curriculum CelebA --seeds 0 1 2 3 # 画像を表示 from IPython.display import Image,display_png import glob files = glob.glob('imgs/*.png') files.sort() for file in files: display_png(Image(file)) |
今度は、render_video.pyを使って、画像を3Dで見る動画を作ってみましょう。コマンド直後にパラメータのパス、–curriculmで種類、–seeds で画像を指定します。
1 2 |
# ビデオを作成(CelebA) ! python render_video.py CelebA/generator.pth --curriculum CelebA --seeds 0 1 2 3 |
複数の動画がvidsフォルダーに保存されていますので、その内2.mp4を見てみましょう(video=の指定で見る動画を変更できます)。
1 2 3 4 5 6 7 8 9 10 11 12 |
# mp4動画の再生 video = '2.mp4' #@param {type:"string"} video_file = 'vids/'+video from IPython.display import HTML from base64 import b64encode mp4 = open(video_file, 'rb').read() data_url = 'data:video/mp4;base64,' + b64encode(mp4).decode() HTML(f""" <video width="50%" height="50%" controls> <source src="{data_url}" type="video/mp4"> </video>""") |
render_video_interpolation.pyを使って、複数画像の補間ビデオを作成してみましょう。コマンド直後にパラメータのパス、–curriculmで種類、–seeds で画像を指定します。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 補間ビデオを作成(CelebA) ! python render_video_interpolation.py CelebA/generator.pth --curriculum CelebA --seeds 5 0 4 16 2 19 5 # mp4動画の再生 from IPython.display import HTML from base64 import b64encode mp4 = open('vids/interp.mp4', 'rb').read() data_url = 'data:video/mp4;base64,' + b64encode(mp4).decode() HTML(f""" <video width="50%" height="50%" controls> <source src="{data_url}" type="video/mp4"> </video>""") |
せっかくですので、猫の画像でも同様な動画を作成してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 補間ビデオを作成(Cats) ! python render_video_interpolation.py Cats/generator.pth --curriculum CelebA --seeds 0 4 8 5 9 1 0 # mp4動画の再生 from IPython.display import HTML from base64 import b64encode mp4 = open('vids/interp.mp4', 'rb').read() data_url = 'data:video/mp4;base64,' + b64encode(mp4).decode() HTML(f""" <video width="50%" height="50%" controls> <source src="{data_url}" type="video/mp4"> </video>""") |
ついでに、車の画像でも同様な動画を作成してみましょう。–curriculmの種類は、CARLAです。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 補間ビデオを作成(CARLA) ! python render_video_interpolation.py CARLA/generator.pth --curriculum CARLA --seeds 1 2 3 5 6 8 1 # mp4動画の再生 from IPython.display import HTML from base64 import b64encode mp4 = open('vids/interp.mp4', 'rb').read() data_url = 'data:video/mp4;base64,' + b64encode(mp4).decode() HTML(f""" <video width="50%" height="50%" controls> <source src="{data_url}" type="video/mp4"> </video>""") |
では、また。
(オリジナルgithub)https://github.com/marcoamonteiro/pi-GAN