【図解あり】絵が描けないエンジニアは3Dモデルを作ってみた

こちらは [AWS for Games Advent Calendar 2022](https://qiita.com/advent-calendar/2022/aws-for-games "") の 15 日目の記事です。

皆さん、絵を描くのが好きですか？

昨年からハイクオリティーな絵を生成してくれる AI は雨後の筍のように増えてきました。単語でも文章でも、描いてほしい絵のキーワードを自由に入力すれば、それに沿った絵を AI が描いてくれます。初心者でも簡単に美術的な絵が描けて、今後もブームは継続していくではないかと思います。絵を描きたいけど描けない人たちにはとても朗報です。

## AI に「絵が描けないけど」って愚痴を言うと・・・
いきなりですが、最近流行っている [ChatGPT](https://chat.openai.com/chat "") に「絵が描けないけど」っていう愚痴を言ってみたらガチで慰めてくれました（涙）
![Screen Shot 2022-12-13 at 22.57.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418478/8d938aa9-15d1-be63-4c85-e93e020fc81a.png)
って言うことで”自分自身を発展させる”ために、機械学習の知識を身につけながらAIの力を借りて絵を描けるようになっていきます！！

### そもそも AI はどうやって絵を描けるのか？
ここで自分が頑張って描いた図を見ながら説明していきます。
例えば、「バスケットボール」と「星」の画像をトレーニングデータとして学習させて、潜在的な数学的空間を構築していきます。まず、「オレンジさ」という変数で分類しています。これは一次元空間と言われています。
![IMG_0674.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418478/a8de011b-7ff7-1269-d673-f11edbb9cdc7.jpeg)

トレーニングデータを増やしていくと、より正確的に画像の要素を分類できるように変数を増やしていきます。この例では、「りんご」の画像を追加して、「丸さ」という変数を足し、それぞれを分類していきます。これで二次元空間になりましたね！
![IMG_0675.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418478/25f47b0c-a9cc-9d32-169c-bbc71b44be97.jpeg)

こうやって上々に変数を増やしていくと、三次元空間、四次元空間...マルチ空間の潜在空間（latent space）になります。（この潜在空間には約500以上次元があるみたいで、人間の脳では追いつけられないですね・・・）潜在変数を変化させることにより、様々な絵を生成できるようになります。
![IMG_0676.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418478/050cd2b0-5764-f2d5-69d6-247c365cc37b.jpeg)

ざっくりの説明になりましたが、AI画像生成の全体の流れは以下のように動作しているではないかと思います。
![IMG_0677.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418478/b7c74513-2c72-9b30-47d9-46638e7ec895.jpeg)

### じゃ、 AI も 3D を描けるのか？
3Dやマルチアングルのトレーニングデータを必要とせず、事前にトレーニングされた2D拡散モデルだけを用いて3D合成を行うモデルは世の中に出ています。例えば、Google Research が今年の10月に発表した DreamFusion は、事前に学習したテキストから2D画像を生成する拡散モデル（text-to-image diffusion model）を用いて、テキストから3次元への合成を実行するモデルです。

## さて、 3D モデルを作ってみよ〜
個人的に NVIDIA が先月に公開した Magic3D モデルが Google の DreamFusion よりも2倍早く生成できるのと、解像度が8倍よくなるというところに気になっています。
残念ですが、Magic3D と DreamFusion のモデルや API は現在のところは公開されていませんので、今回は NVIDIA が今年の9月に公開した GET3D モデルを利用して3Dモデルを生成していきます。車、バイクなどのカテゴリごとの 2D 画像のみを学習させることで、テクスチャ付き3Dモデルを生成してくれます。

https://github.com/nv-tlabs/GET3D

### Amazon SageMaker セットアップ
今回は Amazon SageMaker の ノートブックインスタンスで操作していきたいと
思います。重たいDeep Learningの処理をするのでCPUよりもパフォーマンスが良くなるGPUを利用したいので、P3 インスタンス（例：ml.p3.2xlarge）か G4 インスタンス（例：ml.g4dn.xlarge）を選択してノートブックインスタンスを立ち上げていきましょう。

:::note warn
注意点
使わないノートブックインスタンスを停止しておかないと料金が発生しますので、使わない時は停止するようにしましょう。
:::

ノートブックインスタンスを作成できましたら「Jupyterを開く」か「JupyterLabを開く」を選択します。（個人的に「Jupyter」のGUIの方がわかりやすいです）
![Screen Shot 2022-12-14 at 11.19.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418478/3acea2f4-64c9-7d70-2c35-fc303c628607.png)

### NVIDIA GET3D のパッケージをコピー
ここからのソースコードは全てNVIDIA GET3D の Github上で公開されています。
```
!git clone https://github.com/nv-tlabs/GET3D
%cd GET3D 
!mkdir cache; 
!wget https://api.ngc.nvidia.com/v2/models/nvidia/research/stylegan3/versions/1/files/metrics/inception-2015-12-05.pkl
!pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 torchaudio==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
!pip install ninja xatlas gdown
!pip install git+https://github.com/NVlabs/nvdiffrast/
!pip install meshzoo imageio gputil h5py point-cloud-utils imageio imageio-ffmpeg==0.4.4 pyspng==0.1.0
!pip install urllib3
!pip install scipy
!pip install click
!pip install tqdm
!pip install opencv-python==4.5.4.58
```
### 環境を確認
```
%cd GET3D
%ls -alh
!export PYTHONPATH=$PWD:$PYTHONPATH
!export CUDA_VISIBLE_DEVICES=0
```

### 学習済みモデルをダウンロード
```
!gdown --folder 1oJ-FmyVYjIwBZKDAQ4N1EEcE9dJjumdW
```

### 3Dモデルを生成して保存

```
# バイクの3Dモデルを生成
# Running inference on Shapenet Motorbike and generated rendered images 
# After running, check the results at `save_inference_results/shapenet_motorbike/inference/fakes_000000_00.png` and the folder of some shapes at `save_inference_results/shapenet_motorbike/inference/mesh_pred`
!python train_3d.py --outdir=save_inference_results/shapenet_motorbike  --gpus=1 --batch=4 --gamma=40 --data_camera_mode shapenet_motorbike  --dmtet_scale 1.0  --use_shapenet_split 1  --one_3d_generator 1  --fp32 0 --inference_vis 1 --resume_pretrain /content/GET3D/get3d_release/shapenet_motorbike.pt
```
生成したモデルはノートブックのファイル一覧の「GET3D/save_inference_results」から確認できます。

![teaser_result.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418478/35ecda1b-0a7a-564b-f942-f1b5957588a7.jpeg)
（[Github「nv-tlabs/GET3D」](https://github.com/nv-tlabs/GET3D)より引用）

## 完成？
生成された3Dモデルは、Blender などの 3DCG制作ソフトで使用されているのと同じフォーマットで作成されるため、3DレンダラーやUnityなどのゲームエンジンにインポートして編集することが可能です。

ここからは少しクラウドレンダリングの話をします。
先月に公開された新海誠監督最新作『すずめの戸締まり』という映画、皆さんは見ましたかね？実はこの映画の一部のCG制作には、[AWS Thinkbox Deadline](https://www.awsthinkbox.com/deadline) が利用されています。ご興味がある方はぜひ[こちらの記事](https://www.itmedia.co.jp/news/articles/2211/28/news131.html "「すずめの戸締まり」制作でもAWSが活躍　レンダリングで活用　エンドロールにも……")をご覧になってください。

## AWS Thinkbox Deadline とは
一言で言うと、クラウドスタジオのデプロイ時に作成されるレンダーファームを管理するソフトウェアです。自社保有のファームも、クラウド上にファームを構築することも、ハイブリッドに連携させることも可能です。

Deadlineを使うことにより、レンダリングのジョブを溜めておき、空いているマシンを使ってレンダリングを分散して行うことができます。ジョブマシンの使用状況を見ながら、レンダリングジョブの開始を制御し、柔軟なジョブスケジューリングができるというメリットがあります。
![IMG_0678.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418478/713b66c4-f83b-5ddf-73e8-42bbfb43e00b.jpeg)


Deadlineの詳しい設定はこちらの[AWSブログ記事](https://aws.amazon.com/jp/blogs/news/rendering-with-aws-portal-in-thinkbox-deadline/)をご覧になってください。これからクラウドレンダリングの導入を検討している方の参考になると思います。


## まとめ
Amazon SageMakerを利用して3Dモデルを生成する方法についてご紹介しました。また、AWS Thinkbox Deadlineの利用により、レンダーファームのリソースを有効に活用するソリューションを案内いたしました。冗長なCG制作工程の中で少しだけでも生産性を高めていけたら良いなぁと思います！！


#### Reference
* https://github.com/nv-tlabs/GET3D (NVIDIA GET3D Github)
* https://www.youtube.com/watch?v=SVcsDDABEkM&t=490s (The text-to-image revolution, explained)

(免責) 本記事の内容はあくまでも個人の意見であり、所属する企業や団体は関係ございません。