見出し画像

【b3d_mkn】MoMask[Text to Motion]を、blenderで直接打ち込んで読み込むまで

偉大な先駆者様の引用:

MoMask: Generative Masked Modeling of 3D Human Motions (ericguo5513.github.io)
MoMask[Text to Motion]を、ローカル+Windowsで試してみる|猩々博士 (note.com)
AI×CG実験室 第3回 Maya×Text2Motion: テキストから生成したモーションをMayaリグへ (cgworld.jp)

Gitのインストール方法(Windows版) #Git - Qiita

はじめに

bvhまで出てきてmomask凄すぎるやん!→bvhまで出て来るならblenderで読み込めるのでは?→出来た! という事で備忘録的にまとめます
素晴らしい機能と分かりやすい記事に感謝いたします
(この記事を完遂するにはプログラミングの理解がちょっと必要かもしれないので、誰でも出来るという前提の記事にはなっておりませんあくまで個人の技術習得備忘録として扱い下さい……)

筆者環境:
・windows10
・ryzen 9 5950X
・NVIDIA GeForce RTX 4090 24GB
・blender3.6
・Anaconda3

momaskの実装に関してはMoMask[Text to Motion]を、ローカル+Windowsで試してみる|猩々博士 (note.com) の記事を順に行って行けば構築が出来ると思います、がっ……!

今回はblenderのUIからテキストをFastAPIでサーバーを立ててモーション生成を行うにあたって2点カスタマイズを行っているのでその辺もまとめて環境構築手順を記載していきたいと思います

いずれサーバー立てない形式にしたいなと思いつつ
一旦はブラウザにあるデモ版にテキストぶち込むだけの簡易バージョンも書く予定です

※ローカルの場合諸々の動作保証はできませんのでご了承下さい
もし「こういう書き方をするといいぜ」があれば教えてください

環境構築手順

momaskのローカル環境構築

①gitインストールGitのインストール方法(Windows版) #Git - Qiita
②anaconda3インストール
③github登録
④公式gitより、gitclone

①上の手順に乗っかってgitをインストール
②anaconda3インストール
 ※ffmpegをインストールしてない場合は入れた方が良いです
リリース ·BtbN/FFmpeg-ビルド (github.com)

ffmpegを入れる且つwindowsの場合は上記赤線を解凍して適当な場所に展開後環境変数でPathを通してください
https://jp.videoproc.com/edit-convert/how-to-download-and-install-ffmpeg.htm
上記手順参照
まずはアナコンダ3インストール

ダウンロード出来たらAnaconda3-省略.exeを開いてポチポチし続けたらインストールできると思うので多分大丈夫だと思います
③github登録:省略

MoMask[Text to Motion]を、ローカル+Windowsで試してみる|猩々博士 (note.com) の記事を参照してmomaskを構築してください
一応補足&備忘録的に手順を書きます

まずAnaconda Powershell Promptを開きます

これ

下記画面が出て来ると思います、自分の環境だとC:¥Users¥owner>になっています

このままgitcloneしてしまうとC:¥Users¥owner¥momask-codesの階層に環境が構築される事になります
もし環境構築先を指定したい場合は

cd D:¥test

cdを打ち込んで階層を指定してください
次にgitcloneをする為に下記を打ち込み

git clone https://github.com/EricGuo5513/momask-codes.git
cd momask-codes

終わったら下記 
conda create -n momask python =3.8 はpythonバージョンを指定して仮想環境を構築
conda activate momask は仮想環境を起動(powershellが起動している間)

conda create -n momask python=3.8 
conda activate momask

もしpowershellを途中で閉じてしまった場合は


cd D:¥test¥momask-codes  //この記事の場合
conda activate momask

をすればもう一度仮想環境が立ち上がります
powershellでのインストールに戻りますが
下記でpytorchとrequirements.txtを基に必要なもののインストールを行います

conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
pip install -r requirements.txt

次に
①windows環境で手動で入れなきゃいけないものを上記からダウンロード
②\momask-codes\checkpoints\の下階層に[kit] [t2m]フォルダを新規作成
③kitフォルダに[kit_models.zip]の中身をコピー
④t2mフォルダに[humanml3d_models.zip]の中身をコピー

画像で示すと上みたいになる

anaconda momask側の環境構築は上記で完了です
引用記事の手順をそのままなぞっているだけなので、分かりやすい方を参照してください

momaskをテスト

python gen_t2m.py --gpu_id 0 --ext exp1 --text_prompt "A person is running on a treadmill."

Anacondaのpowershellを開いたままで上記を打ち込めばモーション生成が出来ます
python gen_t2m.py =gen_t2m.pyという名前のpythonを実行
--gpu_id 0 =使用するGPU(二枚刺しとかで指定したい場合のみ1とか)
--ext exp1 = exp1の箇所が名前です一旦変更しないままで置いといて下さい
という意味です、全てが完了すると
momask-codes\generation\"exp1"\animations\0
上記子階層にbvhとmp4が生成されると思います
(ffmpegを入れてない場合mp4生成周りでエラーが出ます)

上記が確認出来たら次の手順です

momaskのgen_t2m.pyを書き換えの前に

現状だとblender環境のpythonとanaconda3内の仮想環境のpythonは違う世界のpythonで、データをやり取りする事が出来ません

なのでfastAPIを使ってサーバーを立ててblenderのテキストをmomask環境に送信できるようにします
anaconda3のpowershellは開いたまま下記を実行しfastapiとuvicornをインストール

pip install fastapi uvicorn

gen_t2m.pyを書き換え

from utils.paramUtil import t2m_kinematic_chain
###############add###############
from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
###############add###############
import numpy as np
clip_version = 'ViT-B/32'

def main(opt_text,opt_sec,opt_title,opt_dir):
    parser = EvalT2MOptions()
    opt = parser.parse()
    fixseed(opt.seed)
    ########add#########
    opt.gpu_id = 0
    opt.dir = opt_dir
    opt.ext = opt_title
    opt.text_prompt = opt_text
    opt.motion_length = int(opt_sec)
    ########add########
    opt.device = torch.device("cpu" if opt.gpu_id == -1 else "cuda:" + str(opt.gpu_id))
    torch.autograd.set_detect_anomaly(True)

    dim_pose = 251 if opt.dataset_name == 'kit' else 263

    # out_dir = pjoin(opt.check)
    root_dir = pjoin(opt.checkpoints_dir, opt.dataset_name, opt.name)
    model_dir = pjoin(root_dir, 'model')
    ###############change#################
    #result_dir = pjoin('./generation', opt.ext)
    result_dir = pjoin(opt.dir, opt.ext)
    ###############change#################


####################################add######################################
# リクエストデータを定義
class RequestData(BaseModel):
    text: str
    sec: str
    title: str
    dir: str
# FastAPIのアプリインスタンスを作成
app = FastAPI()

# /t2mgpt/エンドポイントにPOSTリクエストを実行した場合の処理を定義
@app.post("/gent2m/")
async def gent2m(request_data: RequestData):

    # リクエストデータを取得
    data = request_data.model_dump()
    main(request_data.text,request_data.sec,request_data.title,request_data.dir)

# FastAPIのアプリを起動
uvicorn.run(app, host="localhost", port=8000)
#############################################################################

全文を貼ると長いので追加した箇所だけ省略
momask-codes/gen_t2m.py at main · EricGuo5513/momask-codes (github.com)

https://drive.google.com/file/d/130ExPnPczEr4aPCWE2jPcXv-lLksgWWn/view?usp=sharing

※上記googleドライブからgen_t2m_server.pyをダウンロードする事も可能です



上記の基のgen_t2m.pyの行数を基に変更箇所を記載します
22行に下記を追加

from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn

104行をdef main(opt_text,opt_sec,opt_title,opt_dir):に変更

if __name__ == '__main__':
↓に変更
def main(opt_text,opt_sec,opt_title,opt_dir):

108行に変数追加

    ################
    opt.gpu_id = 0
    opt.dir = opt_dir
    opt.ext = opt_title
    opt.text_prompt = opt_text
    opt.motion_length = int(opt_sec)
    ################

117行'./generation'を変更

    result_dir = pjoin('./generation', opt.ext)
  ↓に変更
  result_dir = pjoin(opt.dir, opt.ext)

262行(元の記述の最後)にfastAPI周りの記述を追加

# リクエストデータを定義
class RequestData(BaseModel):
    text: str
    sec: str
    title: str
    dir: str
# FastAPIのアプリインスタンスを作成
app = FastAPI()

# /t2mgpt/エンドポイントにPOSTリクエストを実行した場合の処理を定義
@app.post("/gent2m/")
async def gent2m(request_data: RequestData):

    # リクエストデータを取得
    data = request_data.model_dump()
    main(request_data.text,request_data.sec,request_data.title,request_data.dir)

# FastAPIのアプリを起動
uvicorn.run(app, host="localhost", port=8000)

上記まで完了したらgen_t2m_server.pyとしてgen_t2m.pyがある階層と同じ場所に保存してください

blender側の説明

blenderアドオンの登録等は省きます

https://drive.google.com/file/d/1FwLB7IoJXJ1UmIgraAnjtXZJlT06q6L3/view?usp=sharing

上記リンクからアドオンを取得してblenderで登録してください
3.6と4.0で動作確認は一応しましたが、エラーがあったらお知らせください

UI説明

登録が完了したらUIが出て来ると思います
上から説明しますが
[Path:] 生成したモーションを書き出す階層を入力
[folderName:] 生成したモーションを書き出すフォルダ名を入力
[Text:] 英語で どういう動きを出したいかを入力ください
[IK] bvhでik版と通常版があるっぽいのでチェック切り替えを入れています
[length_fps]  200fpsだと10秒想定です
※(24fpsとか30fps変換機能は一応追加したいとは思っています)
 
Generateを現段階で押してもまだ生成されません

サーバーの立ち上げ

blender側からAnacondaPowerShellに戻ります
もし一旦Anacondaを落としていた場合はもう一度conda activate momaskで仮想環境を立ち上げてください

python gen_t2m_server.py

上記を入力すると
下記画面になると思います(エラーが出た場合は何かが足りていない可能性があります)

成功画面

この画面になったら一旦何もせず置いてください

実行


諸々準備が完了した(はずな)のでGenerateを押します

なんか文字が一杯出てきて200 OKが出て来ていれば

blender上にbvhが出現します
まだ色々調整の余地はありますが、とりあえず一々blenderでbvh読み込みとかしなくてよくなった感じにはなりました(やったね)

反省

ほんとはblender環境に全部組み込んで完全なアドオン化するのがベストなんですが、そうなるとblender側のpythonのバージョンとか、追加でインストールするライブラリとか必要になって様々な相性問題とぶつかる懸念があったので断念しました……結局momask専用blenderみたいにしちゃえば良いんですがそれはそれで汎用性に欠ける…………

今後

とりあえず上の手順は自分がfastAPIとローカルのtext to motionとblenderの連携を試してみたかったというのが主目的なので

MoMask - a Hugging Face Space by MeYourHint

ぶっちゃけbvhが欲しいだけなら上のリンクからbvhをダウンロードするのが早いです(オチ)


この記事が気に入ったらサポートをしてみませんか?