[Human Motion Diffusion Model] AIでテキストから人の3Dモーションを生成する

2022年10月13日木曜日

Artificial Intelligence

本記事では、Human Motion Diffusion Modelと呼ばれる機械学習手法を用いて、テキストから任意のHuman Motionを生成する方法をご紹介します。

アイキャッチ
出典: GuyTevet/motion-diffusion-model

Human Motion Diffusion Model

概要

Human Motion Diffusion Model(以下、MDM)は、テキストから人の動きを3Dで表現した3Dモーションを生成するText to Motion技術です。

従来技術では、人の動きの多様性をうまく表現できず品質が低いか、表現力に制限をかけていました。MDMでは、近年画像生成で顕著な生成能力を示す分類器なしの拡散モデルを適用し、トランスフォーマーベースのエンコーダーで各ステップでノイズを除去したクリーンなサンプルを予測することによりモーションを生成します。

この手法は、従来技術より軽量でありながらも最先端のパフォーマンスを示しています。

アーキテクチャ
出典: Human Motion Diffusion Model

詳細はこちらの論文をご参照ください。

本記事では上記手法を用いて、任意のテキストから3Dモーションを生成していきます。

デモ(Colaboratory)

それでは、実際に動かしながら3D Motionを生成していきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

また、下記から直接Google Colaboratoryで開くこともできます。
Open In Colab

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

環境セットアップ

それではセットアップしていきます。 Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

初めにGithubからソースコードを取得します。

%cd /content

!git clone https://github.com/GuyTevet/motion-diffusion-model.git

# Commits on Oct 10, 2022使用
%cd /content/motion-diffusion-model
!git checkout c5c0ae13974c110cb6ea8292dc88da28d3d78854

次にライブラリをインストールします。

%cd /content/motion-diffusion-model

!pip install --upgrade gdown
!pip install smplx chumpy trimesh
!pip install moviepy imageio==2.4.1
!pip install --upgrade gdown

!python -m spacy==3.4.1 download en_core_web_sm
!pip install git+https://github.com/openai/CLIP.git@d50d76daa670286dd6cacf3bcd80b5e4823fc8e1

次にモーション生成に必要なデータセットをダウンロードします。

%cd /content/motion-diffusion-model

# Download SMPL
!bash prepare/download_smpl_files.sh
!bash prepare/download_glove.sh

%cd /content

# Download Human3D
!git clone https://github.com/EricGuo5513/HumanML3D.git
!unzip ./HumanML3D/HumanML3D/texts.zip -d ./HumanML3D/HumanML3D/ > /dev/null
!cp -r HumanML3D/HumanML3D motion-diffusion-model/dataset/HumanML3D

最後にライブラリをインポートします。

import os

from moviepy.video.fx.resize import resize
from moviepy.editor import VideoFileClip, AudioFileClip, ImageSequenceClip, CompositeAudioClip
from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip

以上で環境セットアップは完了です。

学習済みモデルのセットアップ

ここでは論文発表元が公開する事前学習済みモデルをセットアップします。

%cd /content/motion-diffusion-model

if not os.path.exists('humanml_trans_enc_512.zip'):
  !gdown 'https://drive.google.com/uc?id=1PE0PK8e5a5j-7-Xhs5YET5U5pGh0c821'

!unzip humanml_trans_enc_512.zip -d ./pretrained/

pretrainedにダウンロードされます。

Text to Motion

それでは、任意のテキストに応じた3Dモーションを生成していきます。
本記事ではThe person suddenly dances while walking.を入力し、3Dモーションを生成させてみます。

prompt = "The person suddenly dances while walking." #@param {type:"string"}

!python -m sample \
  --model_path ./pretrained/humanml_trans_enc_512/model000200000.pt \
  --text_prompt '{prompt}'

出力結果は以下の通りです。

foldername = prompt.replace(" ", "_")
foldername = foldername.replace(".", "")

base_path = f'/content/motion-diffusion-model/pretrained/humanml_trans_enc_512/samples_humanml_trans_enc_512_000200000_seed10_{foldername}/'
out_motion_video0 = base_path + "sample00_rep00.mp4"

clip = VideoFileClip(out_motion_video0)
clip = resize(clip, height=420)
clip.ipython_display()
Result0

入力プロンプトを反映して踊っていることが確認できます。

Rendering SMPL Mesh

最後に先ほど生成した3Dモーションをobjファイルに出力しpytorch3dでレンダリングしてみます。

!python -m visualize.render_mesh \
  --input_path=$out_motion_video0

生成されたフレームごとのobjファイルの一つをレンダリングした結果は以下の通りです。

SMPL形式のHuman Meshが生成されます。

レンダリング結果

まとめ

本記事では、Human Motion DIffusion Modelを用いてテキストから3Dモーションを生成しました。
Stable Diffusionなど2次元の画像生成で用いられていた拡散モデルですが、あっという間にその適用範囲を広げています。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  論文 - Human Motion Diffusion Model

2. GitHub - GuyTevet/motion-diffusion-model

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology