😺
Unity Sentis 姿勢推定
Unity Sentisを利用した姿勢推定
1. 概要
Unity Sentisは、UnityでML(機械学習)モデルを推論できるツールです。これを利用して、人体の姿勢推定(Pose Estimation)を行うには、以下のようなステップが必要になります。
-
姿勢推定モデルの準備
- OpenPose、MediaPipe Pose、HRNet などのモデルを利用
- ONNX形式のモデルを準備
-
Unity Sentisでモデルをロード
- ONNXモデルをUnityにインポート
- SentisのAPIを利用して推論を実行
-
カメラ入力の取得
- WebカメラやVRデバイスのカメラから入力映像を取得
-
推論結果の処理
- モデルの出力を解析し、関節位置を取得
- 3Dオブジェクトに適用
-
Unity上で可視化
- 骨格を描画する
- アバターに適用する
2. 詳細な手順
Step 1: 姿勢推定モデルの準備
姿勢推定を行うために、事前学習済みのONNX形式のモデルが必要です。以下の方法で取得できます。
- MediaPipe Pose: GoogleのMediaPipeの姿勢推定モデル。ONNXに変換可能。
- OpenPose: より高精度な姿勢推定が可能なオープンソースの手法。
- HRNet: 高解像度な特徴マップを使う高精度な姿勢推定モデル。
ONNXモデルのダウンロード例:
- MediaPipe Pose ONNX版: https://github.com/microsoft/onnxruntime-inference-examples
Step 2: Unity Sentisのセットアップ
-
Unityプロジェクトの作成
- Unity 2022以上を推奨
- 「Sentis」パッケージをインストール(Package Managerから取得)
-
ONNXモデルをUnityにインポート
-
Assets/Models/
フォルダにONNXファイルを配置 -
Sentis
のAPIを利用してモデルをロード
-
using Unity.Sentis;
using UnityEngine;
public class PoseEstimation : MonoBehaviour
{
private Model model;
private IWorker worker;
void Start()
{
model = ModelLoader.Load(Application.streamingAssetsPath + "/pose_estimation.onnx");
worker = WorkerFactory.CreateWorker(BackendType.GPU, model);
}
}
Step 3: カメラ入力の取得
WebカメラやVRカメラからリアルタイムで映像を取得します。
using UnityEngine;
public class CameraCapture : MonoBehaviour
{
private WebCamTexture webcamTexture;
void Start()
{
webcamTexture = new WebCamTexture();
GetComponent<Renderer>().material.mainTexture = webcamTexture;
webcamTexture.Play();
}
void Update()
{
// ここでカメラのフレームをSentisに渡す処理を行う
}
}
Step 4: 推論の実行
カメラ画像をSentisに渡し、推論を行います。
void RunInference(Texture2D inputImage)
{
Tensor tensor = new Tensor(inputImage, 3); // RGB画像
worker.Execute(tensor);
// 出力を取得
Tensor output = worker.PeekOutput();
ProcessPoseData(output);
}
Step 5: 推論結果の処理
姿勢推定モデルの出力から、関節位置を取得し、Unityのオブジェクトに適用します。
void ProcessPoseData(Tensor output)
{
// 出力データを解析して関節座標を取得
for (int i = 0; i < output.shape[1]; i++)
{
Vector3 jointPosition = new Vector3(output[i, 0], output[i, 1], output[i, 2]);
Debug.Log($"関節{i}: {jointPosition}");
}
}
Step 6: Unity上で可視化
取得した関節位置データを、3Dモデルやラインレンダラーで描画できます。
void DrawSkeleton(Vector3[] joints)
{
for (int i = 0; i < joints.Length - 1; i++)
{
Debug.DrawLine(joints[i], joints[i + 1], Color.green);
}
}
3. 試してみた結果
検証例: 複数人物の姿勢解析
4. 応用例
-
VRでのボディトラッキング
- Meta Quest 2のカメラを利用して、アバターの動きをリアルタイムで推定
-
スポーツやダンスの動作解析
- Unity上でトラッキングし、動作改善のフィードバックを提供
-
ゲームでのジェスチャー認識
- プレイヤーの姿勢を解析し、アクションをトリガー
5. まとめ
- ONNXモデルを準備(MediaPipe, OpenPoseなど)
- Unity Sentisでモデルをロード
- カメラ入力を取得
- 推論を実行し、姿勢情報を取得
-
関節情報を可視化し、アバターに適用
Unity Sentisを活用すれば、リアルタイムの姿勢推定が可能になります。VRやスポーツ解析などの応用が考えられるので、ぜひ試してみてください!
Discussion