1
/
5

Event Report | GENEROSITY ENGINEER MEETUP【画像生成AIハンズオン】

記事概要

先日弊社の初主催イベントであるWebARハンズオンオフラインイベントの第3回目を行いました。
本記事ではこちらのENGINEER MEETUPイベントレポートを行います!

前回同様、多様なバックグラウンドのエンジニア計4名の方が参加してくださいました。
中級者向けの内容となっており皆さんと試行錯誤しながらの楽しい時間となりました。
後半には、軽食とお酒を囲みながらの交流会も実施しました。

【AI画像生成ハンズオン】GENEROSITY ENGINEER MEETUP (2023/08/03 19:00〜)
開催概要 * 日時:8/3(水) 19:00 - 21:00 * 会場:東京都港区南青山1-15-9第45興和ビル 1F 株式会社GENEROSITYオフィス内 ※ビル正面の扉が閉まっている場合は、ビル右手奥の裏口からご入館ください。 * 費用:無料 * 緊急連絡先:03-4405-8941 時間 | 内容 ---|--- 18:45-19:00 | 受付開始 (弊社エントランスにお集まりください) 19:00-19:15 | 弊社紹介 19:15-20:10 | AI画像生成ハンズオン 20:10-20
https://connpass.com/event/288703/

ハンズオン内容

Point-EとGoogleColabを使って、画像から3DCGを生成する

今回は、無料で使えるGoogleColabとOpenAIがオープンソースで
公開しているPoint-Eという学習モデルを使って、
GoogleColab上で環境構築して簡単な3Dアセットを生成するというハンズオンでした。

Point-Eとは



Point-Eは、ChatGPT、DALL-E2を開発しているOpenAIが公開している点群データ生成AIモデルです。
Point-Eでは、ユーザーが入力した画像やテキストから推論し、
点群データに変換するアルゴリズムを用いて3DCGのデータを生成します。

GoogleColabとは

GoogleColabはGoogleの提供するプラットフォームで、
誰でもブラウザ上で Pythonを記述、実行することができます。
機械学習、データ分析などに気軽に使うことができます。
無料ライセンスでも連続使用12時間までGPU(Tesla K80 or Tesla T4)を使うことが
できるため、スペックの低いマシンでも生成AIの環境構築を行うことができます。

今回は、参加された方が選んだ好きな画像から点群データを生成した後、
メッシュを貼る処理をしてポリゴンモデル化してみようと思います。

自分で環境構築をするメリット

生成AIサービスを使う生成AIの状況は日々目まぐるしく変わっていく中、
今まで無料で使えていたサービスが有料化したり、無料でもライセンス待ちになるパターンが
増えてきています。
また、AI生成は思った絵を出しづらく狙った結果にたどり着くまで試行錯誤が必要で、自分で環境を
構築してトライアンドエラーの回数を重ねる必要が出てきます。
PCに依存せずGPUのパワーが強く、すぐにPythonを実行できるGoogleColabは
試行錯誤を重ねることに適しています。

生成の元になる画像を探そう

今回は画像から推論させるので、読み込ませたい画像を選んでいきます。
回数を重ねた結果、背景が白い画像が好ましいようです。
参加者の方々はりんごや動物など盛り上がりながら好きな画像を選んでいました。
今回私は公式サンプルとして同梱されているコーギーの画像を使用します。


実際に生成してみよう

私の方であらかじめ用意したColabのノートブックを参加者の方々にシェアしており、
そこでご自身のPCのChromeを使って上から順に処理を実行していきます。

ノートブックの設定で、GPUの利用が選択されているかまずは確認します。

Colabのセルを上から実行していきます。左上の再生ボタンを押すと処理が始まります。
問題がなければチェックマークが評され、

Colabで自動で頭から終わりまで再生することもできますが、
処理の内容を皆で追いかけながらやるので、今回は1つ1つセルを実行していきました。

セルの左上のプレイボタンを押し、エラーが出なければグリーンのチェックボックスが表示されます。
順番に進めていきます。

Point-Eのリポジトリをクローン

!git clone https://github.com/openai/point-e.git


Point-Eのフォルダ配下に移動

%cd point-e

必要なプラグインを追加インストール

!pip install .
from PIL import Image

import torch
from tqdm.auto import tqdm

from point_e.diffusion.configs import DIFFUSION_CONFIGS, diffusion_from_config
from point_e.diffusion.sampler import PointCloudSampler
from point_e.models.download import load_checkpoint
from point_e.models.configs import MODEL_CONFIGS, model_from_config
from point_e.util.plotting import plot_point_cloud

画像生成準備

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')


print('creating base model...')
base_name = 'base40M' # use base300M or base1B for better results
base_model = model_from_config(MODEL_CONFIGS[base_name], device)
base_model.eval()
base_diffusion = diffusion_from_config(DIFFUSION_CONFIGS[base_name])

print('creating upsample model...')
upsampler_model = model_from_config(MODEL_CONFIGS['upsample'], device)
upsampler_model.eval()
upsampler_diffusion = diffusion_from_config(DIFFUSION_CONFIGS['upsample'])

print('downloading base checkpoint...')
base_model.load_state_dict(load_checkpoint(base_name, device))

print('downloading upsampler checkpoint...')
upsampler_model.load_state_dict(load_checkpoint('upsample', device))

ベースモデルと拡散モデルの作成

sampler = PointCloudSampler(
    device=device,
    models=[base_model, upsampler_model],
    diffusions=[base_diffusion, upsampler_diffusion],
    num_points=[1024, 4096 - 1024],
    aux_channels=['R', 'G', 'B'],
    guidance_scale=[3.0, 3.0],
)

ここまで実行したら好きな画像を'point_e/examples/example_data/'
配下にアップロードします。左サイドのフォルダボタンで
ディレクトリを開き、アップロードアイコンから画像をアップしたら
example_data内に収めましょう。


そうしたら、コードの中の'corgi.jpg'を先ほどアップロードしたファイルの名前を書き替えます。
(サンプルコードはデフォルトのコーギーのままで行きます。)
書き換えたら再び再生ボタンを押して実行します。
対象物の各画角の点群データを生成

pc = sampler.output_to_point_clouds(samples)[0]
fig = plot_point_cloud(pc, grid_size=3, fixed_bounds=((-0.75, -0.75, -0.75),(0.75, 0.75, 0.75)))

全方位の静止画の点群のプレビューが生成されました。
公式に用意されているサンプルのためなかなか綺麗に生成されました。


点群データをプレビューに必要なライブラリをインポート

import plotly.graph_objects as go
fig_plotly = go.Figure(
        data=[
            go.Scatter3d(
                x=pc.coords[:,0], y=pc.coords[:,1], z=pc.coords[:,2],
                mode='markers',
                marker=dict(
                  size=2,
                  color=['rgb({},{},{})'.format(r,g,b) for r,g,b in zip(pc.channels["R"], pc.channels["G"], pc.channels["B"])],
              )
            )
        ],
        layout=dict(
            scene=dict(
                xaxis=dict(visible=False),
                yaxis=dict(visible=False),
                zaxis=dict(visible=False)
            )
        ),
    )

生成された点群データをレンダリング

fig_plotly.show(renderer="colab")


3Dビューアーでくるくると回せるようになりました。立体になるとテンションが上がります。

メッシュ化に必要なパッケージなどをインポート

from point_e.util.pc_to_mesh import marching_cubes_mesh
import skimage.measure

メッシュ化処理

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

print('creating SDF model...')
name = 'sdf'
model = model_from_config(MODEL_CONFIGS[name], device)
model.eval()

print('loading SDF model...')
model.load_state_dict(load_checkpoint(name, device))

頂点カラーつきのメッシュに変換

# Produce a mesh (with vertex colors)
mesh = marching_cubes_mesh(
    pc=pc,
    model=model,
    batch_size=4096,
    grid_size=128,
    # grid_size=32, # increase to 128 for resolution used in evals
    progress=True,
)

meshをPLYフォーマットのファイルとして書き出す

with open('mesh.ply', 'wb') as f:
    mesh.write_ply(f)



point-eの直下にmesh.plyという3Dデータが生成されました。
ファイルにカーソルをホバーすると右側に3点リーダーが出てくるので、そこをクリックして
3Dデータをローカルにダウンロードしてみましょう。

PLYデータがブラウザで再生できるwebサービスでmesh.plyを読み込んでみます。

3D PLYファイルをオンラインで表示する無料オンラインツール - ImageToStl
この無料ツールを使用して、ソフトウェアをインストールすることなく、3D ply (Stanford Triangle Format)ファイルをオンラインで表示することができます。
https://imagetostl.com/jp/view-ply-online

頂点カラーのデータを持ったPLYファイルが再生されました。

メッシュ化が成功していることを確認できました。
頂点カラーのデータも表示されていることがわかります。

参加者の皆さんは色々な画像から試行錯誤してモデル化していました。
GoogleColabを使うことで、すぐに他の画像で試すことができ
いくつも出力できたところも良かったポイントでした。
クオリティとしてはまだまだこれからという感じではありますが、
画像やテキストから立体がすぐに作り出せる未来はあっという間に訪れるのだろうなと
感じますね。興味がある方はぜひ触ってみてくださいね。

最後に

アンケートでもポジティブなご感想をいただけてモチベーションに繋がりました。
ご参加いただいた皆様、ありがとうございました。

弊社では今後もこのようなMEEETUPイベントを期開催していきたいと思っております。
少しでもご興味を持っていただけた方は、ぜひお気軽にご参加ください!

株式会社GENEROSITY's job postings
2 Likes
2 Likes

Weekly ranking

Show other rankings
Invitation from 株式会社GENEROSITY
If this story triggered your interest, have a chat with the team?