Pose Detection: 概要、モデル、動作原理

著者: IT Sectr 公開日: 2026-07-19 読了時間: 9 分

Pose Detectionは、キーポイント(ランドマーク)によって人間の身体の位置を特定するコンピュータビジョン技術です。頭、肩、肘、手首、腰、膝、足首。各ポイントは2D空間で座標(x、y)を持ち、高度なモデル(MediaPipe BlazePose 3D)は奥行きのためにz座標を追加します。モバイルアプリケーションでは、Pose Detectionはフィットネストラッカー、ヨガアプリ、ARフィルター、リハビリテーションプログラム、スポーツ分析システムで使用されています。Google ML Kit、2025によると、オンデバイスのPose Detectionは94% PCKの精度で毎秒30フレームまで処理します。

ポイント

  • Pose Detection — 画像からの身体のキーポイント(ランドマーク)の識別
  • ML Kit Pose Detection — 33ランドマーク、30 FPS、94% PCK精度
  • MediaPipe BlazePose — 33ランドマーク + 3D、GPUで最大60 FPS
  • MoveNet Lightning — 17キーポイント(COCO)、30+ FPS、8 MB、INT8
  • オンデバイス — プライバシー、リアルタイム、サーバーへの動画送信不要

Pose Detectionとは:基礎と評価指標

Pose Detection(Pose Estimationとも呼ばれる)は、画像または動画から人間の身体のセマンティックキーポイントを特定するタスクを指します。Top-downアプローチは最初に人を検出し(物体検出)、次に姿勢を決定します。Bottom-upアプローチは画像内のすべてのランドマークを見つけ、それらを人物ごとにグループ化します(OpenPose)。モバイルデバイスではbottom-upが使用され、フレーム内に複数人がいる場合により高速です。ML KitとBlazePoseはシングルステージアプローチ(1回のパスで検出+姿勢)を使用します。

COCO Keypoints — 17ポイントの標準セット:鼻、目(2)、耳(2)、肩(2)、肘(2)、手首(2)、腰(2)、膝(2)、足首(2)。MediaPipe BlazePoseは33ポイントを使用し、つま先、かかと、体幹中心、顔のポイントを追加します。ポイントが多いほど姿勢分析の精度は高まりますが、計算負荷も高まります。フィットネスアプリには17〜20ポイントで十分です。完全な分析(ヨガ、ダンス)には33ポイント。ARフィルターには33ポイント+468の顔のポイント(MediaPipe Face Mesh)。

PCK(Percentage of Correct Keypoints) — Pose Detectionの精度指標。グラウンドトゥルースからの距離内(通常は人物のバウンディングボックスサイズの0.05〜0.15)で予測されたポイントの割合を計算します。ML Kit Pose Detection:94% PCK@0.1。BlazePose Full:96% PCK@0.1。MoveNet Lightning:91% PCK@0.1。OKS(Object Keypoint Similarity)— COCOで使用される指標で、人物のスケールとポイントの難易度を考慮します。mAP@OKS — ベンチマークの標準指標。

モデルランドマークPCK@0.1レイテンシ(GPU)サイズ
ML Kit Pose Acc3394%15–30 ms14 MB
BlazePose Full33 + 3D96%10–20 ms12 MB
BlazePose Lite3391%5–10 ms5 MB
MoveNet Lightning1791%8–15 ms8 MB
MoveNet Thunder1795%25–40 ms13 MB

キーポイントの可視性:各ランドマークにはスコア(0..1)があり、モデルがそのポイントにどの程度確信を持っているか、および可視かどうかを示します。スコア<0.5のポイントは不可視(遮蔽、フレーム外)と見なされます。姿勢分析には可視のポイントのみを使用します。アライメント評価には、信頼度で重み付けされた距離を計算し、低スコアのポイントは指標での重みが少なくなります。

AndroidとiOSでのML Kit Pose Detection

ML Kit Pose Detection — Googleによるオンデバイス姿勢検出のためのライブラリ。顔のポイント、つま先、かかとを含む33のランドマークをサポートします。モード:Accurate Mode(14 MBモデル、15〜30 ms、高精度)とStreaming Mode(5 MB、5〜10 ms、リアルタイム用)。Streaming Modeは追跡機能付きの軽量モデルを使用し、最初のフレーム以降は正確な位置を再検出せずに動きを追跡し、最大60 FPSを実現します。

ML Kit Pose Detection API:PoseDetector(オプション:setDetectorMode、setPerformanceMode)→ InputImage → Pose(List<PoseLandmark>)。各PoseLandmarkは次のものを持ちます:landmarkType(38タイプ)、position(PointF3D)、inFrameLikelihood(0..1)。Poseはさらに、人物のboundingBox、ランドマークのリスト、getLandmark(type)メソッドを提供します。姿勢分類には、骨間の角度(shoulderAngle、elbowAngle、hipAngle)を隣接するランドマーク間のVector3Dで計算して使用します。

kotlin
val options = PoseDetectorOptions.Builder()
    .setDetectorMode(PoseDetectorOptions.STREAM_MODE)
    .setPerformanceMode(PoseDetectorOptions.PERFORMANCE_MODE_FAST)
    .build()

val detector = PoseDetection.getClient(options)

detector.process(inputImage)
    .addOnSuccessListener { pose ->
        val leftElbow = pose.getLandmark(PoseLandmark.LEFT_ELBOW)
        val leftShoulder = pose.getLandmark(PoseLandmark.LEFT_SHOULDER)
        val leftWrist = pose.getLandmark(PoseLandmark.LEFT_WRIST)
        val elbowAngle = calculateAngle(
            leftShoulder.position, leftElbow.position, leftWrist.position
        )
    }

iOSのML Kit:Pose DetectionはML Kit CocoaPods経由で利用可能です。APIはAndroidと同一:PoseDetector → UIImage → Pose → PoseLandmark。iOSでは、ML KitはCore MLとANE(A12+)を使用し、iPhone 15 ProでAccurate Modeにおいて10〜20 msのレイテンシを実現します。Streaming Mode — 3〜8 ms、最大120 FPS。iOSでは、ML Kit Pose DetectionはMediaPipe BlazePoseよりも高速(Core MLアクセラレーション)ですが、古いデバイス(iPhone X〜11)ではFPSでBlazePoseに劣ります。

MediaPipe BlazePose:アーキテクチャと3D

MediaPipe BlazePose — Google ResearchによるPose Detectionの高性能モデル。ハイブリッドアーキテクチャを使用:MobileNetV2 + Feature Pyramid Networkベースのdetector-decoderパイプライン。BlazePose Full:33ランドマーク+3D座標(奥行きz)。BlazePose Lite:奥行きのない33ランドマーク(2D)。両モデルはAndroid、iOS、Python、WebのMediaPipe Tasks Visionで利用可能です。BlazePose FullはGPUで30〜60 FPSを処理し、Liteは60+ FPS。

BlazePoseによる3D姿勢推定:モデルは各ランドマークのz座標を予測し、ステレオカメラなしで奥行き推定(手足の接近/後退)を可能にします。z座標はカメラを基準にメートル空間で計算されます。BlazePose 3Dの精度:公開ベンチマークで37 mm MPJPE(Mean Per Joint Position Error)— フィットネスとARには十分だが、医療診断には不十分。ARKit/ARFoundationでは、BlazePose 3Dが自然な奥行きを提供します。

kotlin
// MediaPipe Pose Detection Tasks Vision
val options = PoseLandmarkerOptions.Builder()
    .setBaseOptions(BaseOptions.builder()
        .setModelAssetPath("pose_landmarker_full.task")
        .build())
    .setDelegate(Delegate.GPU)
    .build()

val landmaker = PoseLandmarker.createFromOptions(context, options)

val result = landmaker.detect(MPImage.fromBitmap(bitmap))
result.landmarks.forEach { pose ->
    pose.forEach { landmark ->
        drawLandmark(landmark.x, landmark.y, landmark.z)
    }
}

BlazePose vs ML Kit Pose Detection:BlazePoseはより高速(60+ FPS vs 30 FPS)で、3D座標をサポートし、MediaPipeを通じてクロスプラットフォームで動作します。ML Kitは統合が容易で(MediaPipe SDK不要)、高精度の事前学習済みモデルを含みます。iOSネイティブプロジェクトにはML Kit Pose Detection(最高のANE最適化)。クロスプラットフォームプロジェクト(Flutter、React Native)にはMediaPipe BlazePose(全プラットフォームで統一モデル)。要求の厳しいシーンでの精度は両モデルとも同等です。

MoveNet:TensorFlowのLightningとThunder

MoveNet — TensorFlowによるPose Detectionモデルのファミリーで、TFLite向けに最適化されています。Lightning(8 MB、INT8 — 4 MB):17 COCOキーポイント、91% PCK、8〜15 msレイテンシ、30+ FPS。Thunder(13 MB、INT8 — 6 MB):17キーポイント、95% PCK、25〜40 msレイテンシ、20+ FPS。MoveNetはCenterNetアーキテクチャ+高解像度ヒートマップのためのbilinear補間を使用します。MoveNetはマルチポーズ検出(最大6人)をサポートします。モデルはTensorFlow Hubで利用可能です。

MoveNet Lightning vs Thunder:Lightning — 高FPS(フィットネス、ARフィルター)のリアルタイムアプリケーション向け。Thunder — GPU搭載デバイスでの正確な姿勢分析(リハビリ、スポーツ分析)向け。両モデルはiOS用にtf-coremlを介してCore MLに変換されます。MoveNetはTFLite Task Vision PoseLandmarker APIを通じても利用可能です。推奨:Lightningから始め、精度が不十分な場合はThunderに切り替え(わずか+15 msのレイテンシオーバーヘッド)。

java
// TFLiteによるMoveNet推論
Interpreter interpreter = new Interpreter(loadModel(context));
TensorImage image = TensorImage.fromBitmap(bitmap);
image.load(Bitmap.createScaledBitmap(bitmap, 192, 192, true));

float[][] output = new float[1][51];
interpreter.run(image.getTensorBuffer(), output);

float[] keypoints = output[0];
for (int i = 0; i < 17; i++) {
    float y = keypoints[i * 3];
    float x = keypoints[i * 3 + 1];
    float score = keypoints[i * 3 + 2];
    drawKeypoint(x, y, score);
}

MoveNetマルチポーズ:フレーム内で最大6人を検出。標準的なヒートマップアプローチの代わりに、MoveNetは人物検出+姿勢の精密化を使用:まず人物を検出し(重心ベース)、次に各姿勢を推定します。マルチポーズモードはシングルポーズより2〜3倍遅く:Lightning — 25〜50 ms(6人)。単一ユーザーのフィットネスアプリにはシングルポーズを使用。グループ活動(ヨガ、クロスフィット)には、バッテリー節約のためフレームレート制限付きのマルチポーズ。

姿勢分類:ポイントからアクションへ

Pose Classification — 検出後の段階:ランドマークをセマンティックアクション(立っている、座っている、手を挙げている、しゃがんでいる)に変換します。アプローチ:ルールベース(手動ルール — 骨間の角度)、MLベース(ランドマークベクトル上のロジスティック回帰またはランダムフォレスト)、DLベース(フレーム間の姿勢シーケンスのLSTM分類器)。ルールベース — 50〜80%の精度、シンプルで高速。MLベース — 200以上のラベル付き例で85〜95%の精度。LSTM — 時系列(動画)で90〜98%の精度。

骨間の角度:各ポイントについて、隣接ポイントとの角度が計算されます。例:右肘角度(肩→肘→手首)、右膝角度(腰→膝→足首)、体幹角度(肩の中点→腰の中点)。角度は人物のスケールと画面上の位置に不変です。角度を[0、1]範囲に正規化することで、単純なしきい値ルール(elbowAngle < 30° — 腕が曲がっている、> 150° — 伸びている)で姿勢分類が可能になります。

kotlin
// ルールベースのスクワット分類器
fun classifySquat(pose: Pose): SquatPhase {
    val kneeAngle = angle(
        pose.getLandmark(PoseLandmark.LEFT_HIP),
        pose.getLandmark(PoseLandmark.LEFT_KNEE),
        pose.getLandmark(PoseLandmark.LEFT_ANKLE)
    )
    return when {
        kneeAngle > 140f -> SquatPhase.STANDING
        kneeAngle < 90f  -> SquatPhase.SQUAT
        else           -> SquatPhase.TRANSITION
    }
}

MediaPipe Pose Classification — MediaPipe Tasksに含まれる事前学習済み分類器:スクワット、腕立て伏せ、プランク、脚上げ。分類器はランドマークのリストを受け取り、アクション+信頼度を返します。時間的平滑化(テンポラルフィルター)を含む:姿勢間のスムーズな遷移のためのHED(Holt Exponential Double Smoothing)。カスタムアクションの場合 — MediaPipe Model Maker(TensorFlow Lite +メタデータ)を使用して100〜500例で分類器をトレーニングします。

フィットネスとリハビリテーションでのPose Detectionの応用

テクニック補正付きフィットネストラッカー — アプリは運動中のユーザーの姿勢を分析し、音声指示(「腰を下げて」「体幹を前に傾けないで」)を提供します。ML Kit Pose Detection+ルールベース分類器が反復回数をカウントし、品質を評価します。スクワット:膝角度<90° — 正しいスクワット、背中角度<45° — 危険な体幹傾斜。腕立て伏せ:下端での肘角度<90° — 完全な腕立て伏せ。懸垂:あごがバーのレベルより上。

リハビリテーションと理学療法 — Pose Detectionは理学療法エクササイズのリモートモニタリングに使用されます。医師が基準姿勢(例:肩を45°で外転)を設定し、アプリが現在の角度と偏差を測定します。BlazePose 3Dは±3°の角度精度を提供 — 臨床評価に十分。頻度:3〜5秒に1フレーム(バッテリー節約)。オンデバイス — 患者の医療データのプライバシー。脳卒中後のリハビリ:手から肩、肘の伸展、腰の屈曲の追跡。

ARフィルターとエフェクト — Pose Detectionはソーシャルネットワーク(TikTok、Instagram、Snapchat)のARフィルターの基盤です。頭、肩、手のランドマークを使用して、マスク、アニメーション、装飾要素をオーバーレイします。MediaPipe BlazePose Full + Face Mesh(468ポイント)はフラッグシップデバイスで120+ FPSを実現します。ARKit/ARCore Face Tracking + Pose Detection — フルボディARの組み合わせ。要件:FPS > 30、motion-to-photonレイテンシ<20 ms。

swift
// 姿勢ランドマークを使用したARフィルター
let request = VNDetectHumanBodyPoseRequest { req, _ in
    guard let observation = req.results?.first as? VNHumanBodyPoseObservation else { return }
    let keypoints = try observation.recognizedPoints(.all)
    let rightShoulder = keypoints[VNHumanBodyPoseObservation.JointName.rightShoulder]
    DispatchQueue.main.async {
        arView.placeFilter(at: rightShoulder?.location ?? .zero)
    }
}

スポーツ分析 — プロフェッショナルな技術評価:ランニングの生体力学的分析(ケイデンス、ストライド長、腕振りの対称性)、水泳(体のロール、ストローク中の肘角度)、テニス(肩の回転、手首のスナップ)。MoveNet Thunderと後処理で非プロフェッショナル分析に十分な精度を提供。プロスポーツには3Dモーションキャプチャ(Vicon、OptiTrack)が必要ですが、スマートフォンベースのPose Detectionはマスマーケット向けの手頃な代替手段です。フレーム間の角度同期が重要な要素です。

よくある質問

カメラの揺れでPose Detectionを安定させるには?

時間的平滑化を使用:One Euro Filter(1€フィルター)— 各ランドマークごとに設定可能なカットオフ周波数で、実際の動き(低レイテンシ)を維持しながら高周波ノイズ(揺れ)を抑制します。MediaPipe BlazePoseにはHED(Holt Exponential Double Smoothing)が組み込まれており、動き予測による適応的平滑化を行います。ML Kitの場合は、1€フィルターを自分で実装:フィルターには2つのパラメータ — beta(速度)とminCutoff(周波数しきい値)。推奨値:beta = 0.04、minCutoff = 0.5(Android)。

Pose Detectionはフレーム内で何人まで検出できますか?

ML Kit Pose Detection — 1人(シングルポーズ)。MoveNet Lightning — 最大6人(マルチポーズ)。MediaPipe BlazePose — MediaPipe Tasks経由で最大2〜3人(マルチポーズ)。グループ活動アプリにはMoveNet LightningまたはBlazePoseを使用。単一ユーザーのフィットネスアプリにはML Kit(統合が容易、高精度シングルポーズ)。ARフィルター付きビデオ通話には、マルチポーズ(高FPS)のBlazePose Liteで十分。

姿勢分類のための骨間の角度を計算するには?

2つの骨の間の角度:3つのランドマークを取得 — 関節A、関節B(角度の頂点)、関節C。ベクトルBA =(A - B)とBC =(C - B)を計算。角度 = atan2(cross(BA、BC)、dot(BA、BC))。Math.toDegrees(acos(dot(BA、BC)/(len(BA)* len(BC))))。角度の範囲は0〜180°。3次元座標(BlazePose 3D)の場合はVector3Dを使用。ML分類器のために角度を[0,1]範囲に正規化。

両手を同時に追跡できますか?

はい、主要なモデル(ML Kit、BlazePose、MoveNet)はすべて両手のランドマークを同時に検出します:LEFT_SHOULDER、LEFT_ELBOW、LEFT_WRIST、RIGHT_SHOULDER、RIGHT_ELBOW、RIGHT_WRIST。追加の手の追跡には、Pose Detection+Hand Landmarker(片手21ポイント)を組み合わせます。MediaPipe Hands+BlazePoseはフルボディ+ハンドの標準的な組み合わせ。iOSでは — VNDetectHumanHandPoseRequest+VNDetectHumanBodyPoseRequest。

Pose Detectionに必要なフレーム内の最小人物サイズは?

ML Kit Pose Detection:最小人物バウンディングボックス — 100x100ピクセル(アスペクト比〜1:1)。MoveNet Lightning:120x120ピクセル。BlazePose:80x160ピクセル(縦長バウンディングボックス)。カメラから3メートルの全身人物(1920x1080)の場合 — 約250x600 pxで十分。5メートルを超えると精度が低下 — マルチポーズ+高解像度入力を使用。遠方の物体には、物体検出+姿勢推定(2段階)がより適しています。

まとめ

  • Pose Detection — 91〜96% PCK精度で17〜33の身体キーポイントを識別
  • ML Kit Pose Detection — 33ランドマーク、最大30 FPS、シンプルなAPI、GPU/ANE対応
  • BlazePose(MediaPipe) — 33ランドマーク+3D、最大60 FPS、クロスプラットフォーム
  • MoveNet Lightning/Thunder — 17 COCOキーポイント、30+ FPS、TFLite、マルチポーズ
  • Pose Classification — ルールベースまたはMLでランドマークからアクションへ
  • オンデバイス — プライバシー、リアルタイム、3 ms〜30 msレイテンシ
  • 応用 — フィットネス、リハビリ、ARフィルター、スポーツ分析

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください