😺

Unity Sentis 姿勢推定

2025/03/19に公開
2

Unity Sentisを利用した姿勢推定

1. 概要

Unity Sentisは、UnityでML(機械学習)モデルを推論できるツールです。これを利用して、人体の姿勢推定(Pose Estimation)を行うには、以下のようなステップが必要になります。

  1. 姿勢推定モデルの準備
    • OpenPose、MediaPipe Pose、HRNet などのモデルを利用
    • ONNX形式のモデルを準備
  2. Unity Sentisでモデルをロード
    • ONNXモデルをUnityにインポート
    • SentisのAPIを利用して推論を実行
  3. カメラ入力の取得
    • WebカメラやVRデバイスのカメラから入力映像を取得
  4. 推論結果の処理
    • モデルの出力を解析し、関節位置を取得
    • 3Dオブジェクトに適用
  5. Unity上で可視化
    • 骨格を描画する
    • アバターに適用する

2. 詳細な手順

Step 1: 姿勢推定モデルの準備

姿勢推定を行うために、事前学習済みのONNX形式のモデルが必要です。以下の方法で取得できます。

  • MediaPipe Pose: GoogleのMediaPipeの姿勢推定モデル。ONNXに変換可能。
  • OpenPose: より高精度な姿勢推定が可能なオープンソースの手法。
  • HRNet: 高解像度な特徴マップを使う高精度な姿勢推定モデル。

ONNXモデルのダウンロード例:


Step 2: Unity Sentisのセットアップ

  1. Unityプロジェクトの作成

    • Unity 2022以上を推奨
    • 「Sentis」パッケージをインストール(Package Managerから取得)
  2. 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. 応用例

  1. VRでのボディトラッキング
    • Meta Quest 2のカメラを利用して、アバターの動きをリアルタイムで推定
  2. スポーツやダンスの動作解析
    • Unity上でトラッキングし、動作改善のフィードバックを提供
  3. ゲームでのジェスチャー認識
    • プレイヤーの姿勢を解析し、アクションをトリガー

5. まとめ

  1. ONNXモデルを準備(MediaPipe, OpenPoseなど)
  2. Unity Sentisでモデルをロード
  3. カメラ入力を取得
  4. 推論を実行し、姿勢情報を取得
  5. 関節情報を可視化し、アバターに適用
    Unity Sentisを活用すれば、リアルタイムの姿勢推定が可能になります。VRやスポーツ解析などの応用が考えられるので、ぜひ試してみてください!
2
ヘッドウォータース

Discussion