【生成AI】テキストから360°パノラマ画像を生成してみよう！【最新研究】

:::note info
本記事は株式会社FIXERが運営する [cloud.config Tech Blog](https://tech-blog.cloud-config.jp/2024-06-26-taming-stable-diffusion-for-text-to-360-panorama-image-generation) とのマルチポストです
:::

レイチェルです。
今回はテキストを入力として、360°パノラマ画像を生成する研究をご紹介させていただきます。
その名も [**Taming Stable Diffusion for Text to 360 Panorama Image Generation**](https://chengzhag.github.io/publication/panfusion/)！
以下は「**skyscrapers**」というプロンプトを入力して出力された画像です。結構クオリティが高いとは思いませんか？

![2024-06-25-taming-stable-diffusion-for-text-to-360-panorama-image-generation-001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/1717e1ad-782d-b448-7a7e-a3703cbd2847.jpeg)

# Citation
```
@inproceedings{panfusion2024,
  title={Taming Stable Diffusion for Text to 360◦ Panorama Image Generation},
  author={Zhang, Cheng and Wu, Qianyi and Cruz Gambardella, Camilo and Huang, Xiaoshui and Phung, Dinh and Ouyang, Wanli and Cai, Jianfei},
  booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
  year={2024}
}
```

# 動かしてみたい人
論文の著者がGitHubでソースコードを公開しています。

https://github.com/chengzhag/PanFusion

また、上記のコードを自分で動かしてみたときに作ったJupyterNoteがあるので、ぜひご確認ください。
本記事では、このJupyterNoteで行っていることの解説をします。

https://colab.research.google.com/drive/12IBOjApxCWZ2F9v8TFqfooWw-b5FeT6E?usp=sharing

## 動作環境
Google Colab の **L4 GPU** 以上、あるいは同等性能の環境であれば動作すると思います。

# 研究概要
本研究は [CVPR 2024](https://cvpr.thecvf.com/) 内で発表された研究であり、従来の画像生成モデルである `Stable Diffusion` を元に作られています。
特徴としては、以下のようなものが挙げられます。

- デュアルブランチDiffusionモデル **PanFusion** の導入
  - **グローバルパノラマブランチ**(全体的な視野を提供する役割) と **ローカル視点ブランチ**(詳細な部分を提供する役割) を組み合わせて学習する
- **Equirectangular-Perspective Projection Attention(EPPA)** の導入
    - 2つのブランチ間で効果的に情報をやり取りするための仕組み
- **品質の向上** と **生成プロセスの拡張制御** の両立
    - 従来手法よりもクオリティの高いパノラマ画像を生成可能
    - 生成プロセスにおいて、部屋のレイアウトなどの**追加条件**を取り入れることが可能
        - `ソファが壁の左側にあり、テーブルが中央にあるリビングルーム` のような条件を指定すると、その通りにレイアウトされたパノラマ画像が生成される

詳細はぜひ以下の論文をご覧ください。

https://chengzhag.github.io/publication/panfusion/

また、ChatGPTを使って楽に論文を読むコツを以下の記事で紹介しています。

https://qiita.com/reityerukohaku/items/fdceda8354a6a11dac6b

# JupyterNoteの解説
この章では、上記のJupyterNoteでやっていること・使い方を解説していきます。
基本的には、先頭のセルから順に実行するだけで問題ないはずです。

## 環境構築
環境構築のためにAnacondaを使用するため、先にインストールしておきます。

```bash
!wget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
!chmod +x Miniconda3-latest-Linux-x86_64.sh
!bash ./Miniconda3-latest-Linux-x86_64.sh -b -f -p /usr/local
```

次に、リポジトリのCloneと `environment_strict.yaml` を使って実行環境構築を行います。

```bash
!git clone https://github.com/chengzhag/PanFusion
!cd ./PanFusion && conda env update -n base -f environment_strict.yaml
```

:::note info
Google Colab環境でconda仮想環境を構築しようとした際に、うまく動作しなかったため
ルート上に環境を構築しています
:::

### 訓練済みモデルのダウンロード 
以下の手順で、クッキーを使用して `wget` を用いた訓練済みモデルをダウンロードすることができます。
なお本手順は `Google Chrome` を使用している想定で記載しています。

:::note info
本手順よりもっとスマートにwgetする方法がありましたらお知らせください！
:::

まず、以下のリンクにアクセスします。論文の著者が訓練済みモデルを配置しているSharePointです。

https://monashuni-my.sharepoint.com/:u:/g/personal/cheng_zhang_monash_edu/EeTrujeSOgdHh7vWsjXuMPAB8JtTaXS1uR8sp0y1kwQ4NQ?e=cI5jec

次に、F12キーでデベロッパーツールを開き、ネットワークタブを開いておきます。

![2024-06-25-taming-stable-diffusion-for-text-to-360-panorama-image-generation-002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/9329e16c-462e-0031-25e8-1c64dde323eb.png)

この状態で、ダウンロードボタンをクリックします。
このダウンロード自体はクリックした瞬間止めてしまって構いません。

すると、デベロッパーツールにダウンロードのリクエストが表示されると思うので、そのリクエストを探してみてください。

![2024-06-25-taming-stable-diffusion-for-text-to-360-panorama-image-generation-003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/f373fd42-09d2-07a3-ca85-ee75292cbb45.png)

この中で使用するのは `全般 -> リクエスト URL` と、`リクエスト ヘッダー -> Cookie` の2種類です。
この2種類の値を、以下のコマンドの該当箇所にコピペします。

```bash
# 訓練済みモデルのダウンロード
!wget --header "Cookie: ここにCookieを貼り付ける" -O ./PanFusion/logs/4142dlo4/checkpoints/last.ckpt "ここにリクエストURLを貼り付ける"
```

このコマンドを実行することで、訓練済みモデルをダウンロードすることができるはずです。

## WandBについて
本サンプルコード内では、**WandB** という可視化ツールを用いてマシンリソース使用量の可視化を行っています。

https://www.wandb.jp/

使用するために、まずはアカウント作成を行う必要がありますので、上記のページからアカウント作成をお願いします。

アカウント作成後、以下のコマンドで **WandB** にログインします。

```bash
!wandb login
```

実行すると、以下のように出力されます。
```
wandb: Logging into wandb.ai. (Learn how to deploy a W&B server locally: https://wandb.me/wandb-server)
wandb: You can find your API key in your browser here: https://wandb.ai/authorize
wandb: Paste an API key from your profile and hit enter, or press ctrl+c to quit: 
```

2行目のリンクを踏むと、ログイン画面が表示されますので、ログインしてください。
ログインすると、以下のようにAPIキーが表示されますのでコピーしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/81302580-1083-78b5-2c6b-bb3fb6352655.png)

コピーしたあと、先程の出力の3行目に貼り付けエンターキーを打鍵します。
4行目に `wandb: Appending key for api.wandb.ai to your netrc file: /root/.netrc`と出力されれば成功です！

## 推論
以下のコマンドを実行することで推論が行えます。
```bash
!cd PanFusion && WANDB_MODE=online WANDB_RUN_ID=4142dlo4 python ./main.py predict --data=Matterport3D --model=PanFusion --ckpt_path=last
```

推論結果は `/content/PanFusion/logs/4142dlo4/predict` 内に出力されます。

### オリジナルのプロンプトを使う方法
`/content/PanFusion/data/demo.txt` に、独自のプロンプトを記述してパノラマ画像を生成することができます。
デフォルトでは以下のような内容になっています。
```
a futuristic kitchen
a living room with a sliding glass door
a living room
Mountain view of Golden Gate Bridge and San Francisco
This kitchen is a charming blend of rustic and modern, featuring a large reclaimed wood island with marble countertop, a sink surrounded by cabinets. To the left of the island, a stainless-steel refrigerator stands tall. To the right of the sink, built-in wooden cabinets painted in a muted.
Majestically rising towards the heavens, the snow-capped mountain stood, its jagged peaks cloaked in a shroud of ethereal clouds, its rugged slopes a stark contrast against the serene azure sky, and its silent grandeur exuding an air of ancient wisdom and timeless solitude.
Coastal cliff at sunset, waves crashing on rugged rocks.
Moonlit forest, shadows dance among ancient trees.
Urban skyline at twilight, city lights twinkling in the distance.
～以下、略～
```

このテキストファイルの中身をすべて削除し、使いたいプロンプトを記述して保存します。
例えば、僕は以下のようなプロンプトを試しました。

```
skyscrapers
river in the forest
A hill with a view of the sea with a lighthouse
magical forest
```

あとから論文を見たら、部屋のレイアウトなどの追加条件を指定できるとのことだったので
それを試すプロンプトを書けばよかった…

`demo.txt` に書いたプロンプトを使用するために、推論時のコマンドを少し変更します。
`--data` で渡す値を `Matterport3D` から `Demo` に変更します。

```bash
!cd PanFusion && WANDB_MODE=online WANDB_RUN_ID=4142dlo4 python ./main.py predict --data=Demo --model=PanFusion --ckpt_path=last
```

先ほどと同様に `/content/PanFusion/logs/4142dlo4/predict` 内に画像が出力されます。
また、デフォルトではプロンプト1行につき画像が **10枚** 生成されます。
画像1枚の生成に少々時間がかかりますので、大量のプロンプトを書き込むのは要注意。

## 出力結果のダウンロード
以下のコマンドで、出力結果のパノラマ画像をダウンロードすることができます。

```py
# ダウンロードしたいフォルダを zip 圧縮する
!zip -r /content/predict.zip /content/PanFusion/logs/4142dlo4/predict

# 圧縮した zip ファイルをダウンロードする
from google.colab import files
files.download("/content/predict.zip")
```

# 出力された画像を見てみる
僕の方で出力した画像を何枚かご紹介させていただきます。

<img width="49%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/058118a6-af09-7de2-c6af-6efc82385761.jpeg">
<img width="49%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/8bf900a0-19ed-0975-a7dc-9376de90b9aa.jpeg">
<img width="49%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/97d7ef01-28af-fd42-317c-613dd1aec30c.jpeg">
<img width="49%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/681a12be-6613-df3c-d1fc-612bc9bc91ef.jpeg">

これはそれぞれ以下のプロンプトでの出力結果です。
- skyscrapers
- river in the forest
- A hill with a view of the sea with a lighthouse
- magical forest

どれも結構キレイに出力できているとは思いませんか？
ただ `magical forest` に関しては思っていたような画像ではなかったのでもう少しプロンプトを凝ってみる必要があるかも知れません。

また、画像を出力していると画像上下端がよくぼやけて出力されることがあります。
筆者曰く、これはモデルの訓練に使用したデータに上下がぼやけているものが多いためであると述べています。
ようするに訓練データ起因の問題です。

## 変な画像たち
中には変な画像が出力される場合もあります。

![2024-06-25-taming-stable-diffusion-for-text-to-360-panorama-image-generation-009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/2776e304-614e-3f2d-8326-13fe6f527a64.jpeg)
![2024-06-25-taming-stable-diffusion-for-text-to-360-panorama-image-generation-010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264716/52a1f184-b6a1-a2c8-1860-8594a28b87bc.jpeg)

現代アートみたいなビル群に、謎の鳥居…
まぁそういう場合も時にはあります。
ですが、このように崩れた画像が出力される場合は少なく、大多数はきちんと形を保った画像であるのがこの研究の素晴らしいポイントかも知れません。

# まとめ
生成AI技術の応用先は、今どんどん増えており、この研究もその1つです。
ただし、まだまだ問題点もあり成長の余地がある分野ですので、これからの発展から目が離せませんね！