はじめに
人体メッシュ 3D モデルとして有名な SMPL / SMPL-X を触ってみたいと思っても、最初の一歩で「環境構築」「モデルファイル」「可視化ライブラリ」の3つが絡んで、意外と詰まりやすいです。
この記事では、Apple Silicon Mac 上で まず SMPL-X のコア機能を動かす ところまでを最初のステップの第1目標として整理し、さらに、次のステップの可視化の試しとして smplx リポジトリの examples/demo.py を動かそうとして遭遇したエラーと対処もまとめます。
この記事で分かること
- Apple Silicon Mac で SMPL-X を試すための最小構成
- PyTorch の MPS が使えるかどうかの確認方法
- SMPL-X の forward を試す最小テスト
test_smplx.pyでコア機能が動いていることを確認する方法 -
examples/demo.pyを動かす段階で遭遇した可視化系のエラーと対処法
前提・想定読者
この記事は、次のような人を想定しています。
- Apple Silicon Mac を使っている人
- Python / PyTorch を少し触ったことがある人
- SMPL / SMPL-X をこれから手元で試したい人
逆に、この記事では SMPL-X の理論やパラメータ意味の詳細には深入りしません。まずは 手元で動かす ことを優先します。
この記事のゴール
この記事では、目標を最初から2段階に分けて考えます。
第1目標: test_smplx.py が動くこと
ここが最初の成功ラインです。
- Python 仮想環境を作る
- PyTorch をインストールし、MPS が見えることを確認する
-
smplxをインストールする - SMPL-X のモデルファイルを配置する
-
test_smplx.pyを実行し、verticesとjointsが出ることを確認する
第2目標: examples/demo.py の可視化を試すこと
次のステップとして、smplx リポジトリの examples/demo.py を動かして、可視化まで試します。
ただし、この段階では SMPL-X 本体ではなく、pyrender や Open3D といった 可視化側の依存ライブラリ に起因する問題に遭遇することがあります。
構成の考え方
今回いちばん大事なのは、SMPL-X の コア機能の確認 と 可視化の試行 を分けることです。
test_smplx.py が通っていれば、少なくとも SMPL-X の forward 自体は成功しています。一方で demo.py は pyrender / matplotlib / open3d などの可視化モジュールに依存するため、ここでコケたとしても「SMPL-X 本体が動いていない」とは限りません。
この切り分けを最初にしておくと、トラブルシュートがかなり楽になります。
環境構築
ここから、Apple Silicon Mac で最小構成を作っていきます。
1. Python 仮想環境を作る
まずは作業ディレクトリと仮想環境を作ります。PyTorch は macOS で通常の Python 環境上に pip で導入できます。
mkdir smplx-on-apple-silicon
cd smplx-on-apple-silicon
python3.11 -m venv .venv
source .venv/bin/activate
python --version
ここでは Python 3.11 を使っています。Open3D の Apple Silicon 周りでは Python 3.12 より 3.11 を推奨する issue もあり、現時点では 3.11 のほうが扱いやすいでしょう。
続けて、pip 周りも上げておきます。
python -m pip install --upgrade pip setuptools wheel
2. PyTorch を入れる
Apple Silicon Mac では、PyTorch は MPS backend を通じて GPU を利用できます。
まずは通常どおりインストールします。
pip install torch
導入後、MPS が見えているか確認します。
python - <<'PY'
import torch
print("torch version:", torch.__version__)
print("MPS available:", hasattr(torch.backends, "mps") and torch.backends.mps.is_available())
PY
MPS available: True が出れば、Apple Silicon の GPU を使う準備ができています。
ここで False でも CPU 実行はできますが、Apple Silicon 環境の利点を活かしたいなら後で見直したほうがよいです。
3. smplx をインストールする
SMPL-X の Python パッケージは、公式リポジトリで pip install smplx[all] が案内されています。
pip install "smplx[all]"
導入確認として、まずは import だけ試します。
python - <<'PY'
import smplx
print("smplx imported successfully")
PY
ここが通れば、少なくとも Python パッケージとしての smplx は使える状態です。
4. モデルファイルを配置する
ここが最初のハマりどころです。
smplx をインストールしても、SMPL-X のモデルファイル自体は別途用意する必要があります。
たとえば次のような配置にしておくと分かりやすいです。
models/
└── smplx/
├── SMPLX_MALE.npz
├── SMPLX_FEMALE.npz
└── SMPLX_NEUTRAL.npz
最初に試すだけなら、SMPLX_NEUTRAL.npz があれば十分です。
smplx リポジトリ の README でも、モデルファイルをダウンロードしたうえで demo.py を動かす流れが説明されています(モデルファイルをダウンロード入手するには、SMPL-X公式サイトでアカウント登録をする必要があります)。
第1目標: test_smplx.py でコア機能を確認する
ここからが本番です。
まずは、forward が通って vertices と joints が得られるか を確認します。
以下のスクリプトは、SMPL-X モデルを読み込み、ゼロ姿勢・ゼロ形状の状態で vertices と joints を出す最小例です。
このスクリプトを test_smplx.py として保存します。
import torch
from smplx import SMPLX
model = SMPLX(
model_path="./models/smplx",
gender="neutral",
batch_size=1,
use_pca=False,
flat_hand_mean=True,
)
betas = torch.zeros((1, 10))
body_pose = torch.zeros((1, model.NUM_BODY_JOINTS * 3))
global_orient = torch.zeros((1, 3))
left_hand_pose = torch.zeros((1, model.NUM_HAND_JOINTS * 3))
right_hand_pose = torch.zeros((1, model.NUM_HAND_JOINTS * 3))
expression = torch.zeros((1, model.num_expression_coeffs))
jaw_pose = torch.zeros((1, 3))
leye_pose = torch.zeros((1, 3))
reye_pose = torch.zeros((1, 3))
transl = torch.zeros((1, 3))
output = model(
betas=betas,
body_pose=body_pose,
global_orient=global_orient,
left_hand_pose=left_hand_pose,
right_hand_pose=right_hand_pose,
expression=expression,
jaw_pose=jaw_pose,
leye_pose=leye_pose,
reye_pose=reye_pose,
transl=transl,
)
print("vertices:", output.vertices.shape)
print("joints :", output.joints.shape)
そして、実行します。
python test_smplx.py
vertices: と joints: の shape が表示されれば成功です。
この時点で、Apple Silicon Mac 上で SMPL-X のコア機能は動いている と判断できます。
ここで一度区切る
個人的には、ここで一度「成功」とみなすのが重要だと思っています。
というのも、この先の可視化は smplx 本体ではなく、pyrender や Open3D などの周辺事情に影響されやすいからです。
つまり、上の test_smplx.py が動いたなら、少なくとも
-
smplxのインストール - モデルファイルの配置
- SMPL-X の forward
- PyTorch 連携
まではできています。
第2目標: examples/demo.py を試す
次のステップとして、smplx リポジトリの examples/demo.py を動かしてみました。この demo.py は --plotting-module 引数で pyrender, matplotlib, open3d を切り替えられるので、可視化確認の入り口としてちょうど良いです。
git clone https://github.com/vchoutas/smplx.git
cd smplx
python examples/demo.py \
--model-folder ../models \
--gender=neutral \
--plotting-module=pyrender
ただし、この段階でいくつかハマりどころがありました。
エラー対処集
ここからは、第2目標の可視化を試したときに遭遇した問題 です。
第1目標の test_smplx.py が通っているなら、SMPL-X 本体ではなく可視化周辺を疑うのがコツです。
エラー1: NumPy 2.x と pyrender の互換性
demo.py を --plotting-module=pyrender で試したとき、NumPy 2.x 環境では pyrender の互換性問題に当たることがあります。
pyrender 側の issue でも、NumPy 2.x に対応していないことが報告されています。
典型的には、こんなエラーです。
AttributeError: `np.infty` was removed in the NumPy 2.0 release. Use `np.inf` instead.
NumPy 2.0 では後方互換性のない API 整理が入っており、移行ガイドでも互換性対応が必要であることが説明されています。
この問題は SMPL-X 本体ではなく、pyrender 側の NumPy 追従が追いついていない ことが原因です。
対処としては、まず NumPy を 1.x 系に固定するのが現実的です。
pip install "numpy<2"
明示的に固定するなら、次でもよいです。
pip install numpy==1.26.4
NumPy 2 系の移行期間中は、こうした依存関係のズレが起きやすいので、可視化ライブラリを含む環境では numpy<2 にしておくのが無難です。
エラー2: Apple Silicon 上の Open3D のアーキテクチャ不一致
次に、demo.py の --plotting-module=open3d を試したとき、Apple Silicon では Open3D の import や GUI 周りで詰まることがあります。
Open3D は公式ドキュメントで ARM64、つまり Apple Silicon をサポートしている一方、環境によっては Python バージョンや wheel の組み合わせで問題が出ることがあります。
まず確認したいのは、自分の Python が本当に arm64 ネイティブで動いているか です。
uname -m
python --version
uname -m が arm64 なら、少なくとも OS 側は Apple Silicon ネイティブです。
次に Open3D を素で import してみます。
python - <<'PY'
import open3d as o3d
print(o3d.__version__)
PY
もしここで import エラーが出るなら、SMPL-X ではなく Open3D 側の問題です。
また、Open3D の Apple Silicon issue では Python 3.12 より 3.11 を勧めるコメントもあり、少なくとも現時点では Python 3.11 を使う のが無難です。
まずは次のように確認するのがおすすめです。
pip install open3d
python - <<'PY'
import open3d as o3d
print(o3d)
PY
Open3D の ARM サポートはありますが、場合によってはソースビルドや wheel の見直しが必要になることもあります。
そのため、この記事の段階では Open3D 可視化が動かなくても、第1目標は達成している と割り切るのが大事です。
ここまでの整理
今回の要点は、次の3つです。
-
test_smplx.pyが動けば、SMPL-X のコア機能は動いている -
examples/demo.pyは便利だが、可視化ライブラリ側の依存関係に影響されやすい - したがって、コア機能の成功 と 可視化の成功 は分けて考えるべき
この整理をしておくと、エラーに遭遇したときも「何が壊れているのか」を冷静に切り分けられます。
ここまでのコマンドまとめ
最後に、この記事で使ったコマンドをまとめておきます。
mkdir smplx-on-apple-silicon
cd smplx-on-apple-silicon
python3.11 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip setuptools wheel
pip install torch
pip install "smplx[all]"
python - <<'PY'
import torch
print("torch version:", torch.__version__)
print("MPS available:", hasattr(torch.backends, "mps") and torch.backends.mps.is_available())
PY
# test_smplx.py を実行
python test_smplx.py
# 可視化を試すとき
pip install "numpy<2"
pip install open3d
# smplx リポジトリの取得
git clone https://github.com/vchoutas/smplx.git
cd smplx
# smplx デモの実行(可視化)
python examples/demo.py \
--model-folder ../models \
--gender=neutral \
--plotting-module=open3d
おわりに
SMPL / SMPL-X の勉強は、研究テーマ・プロジェクト「ダンス動画から 3DCG / モーションデータの AI 検出」に含まれる一つの領域として始めました。
その最初のステップとして、Apple Silicon Mac 上で SMPL-X のコア機能が動くところまでを確認し、そして smplx のデモによる可視化も試してみました。
smplx は PyPI から導入でき、PyTorch GPU サポートも macOS on Apple Silicon Mac で普通に使えるので、SMPL / SMPL-X の勉強・研究は Mac でも十分にできることが判りました。
次のステップとして、この環境をベースにして、SMPL / SMPL-H / SMPL-X パラメータを .npz に保存し、再読込して中身を解析する 、さらに 実用的な可視化をツールを作る 方向へ進めていきたいと思っています。
