コンテンツにスキップ

キーポイント抽出

キーポイント抽出について

キーポイント抽出では、アップロードした動画像から人物を推定して画像中における人物の姿勢情報を、キーポイントという構造化されたデータに変換します。

姿勢推定の仕様

AnyMotionでは、動画像中の1人の人物における姿勢を抽出します。 そのため、動画像における複数人を検出したいといった要件は満たすことができません。

姿勢推定の対象となる人物は以下の2つの条件により自動的に決定します。

  • 動画像の中心に映っている人物
  • 動画像の中で前面に映っている人物

具体的には以下のようなパターンにおいて、四角枠で囲われた人物が対象人物です。

中心かつ前面に映っている場合

anymotion_keypoint_extraction_1

中心かつ前面ではない場合

anymotion_keypoint_extraction_2 anymotion_keypoint_extraction_3

キーポイントの仕様

データフォーマット

AnyMotionで取得されるキーポイントのデータフォーマットの仕様項目は以下の通りです。

  • 1つの動画は複数のフレームが配列形式で格納される
    • 画像であれば配列に1つの連想配列となる
  • 1つのフレームは複数のキーポイントが連想配列形式で格納される
  • 1つのキーポイントは "nose": [5, 670] のように 部位名: [x, y] で定義される
  • 1つのフレーム内で未検出のキーポイントがあった場合はその部位名は除外される
サンプル
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
  [
    {
      "nose": [ 5, 670 ],
      "leftEye": [ 5, 706 ],
      "leftShoulder": [ 37, 707 ],
      "rightShoulder": [ 48, 768 ],
      "leftElbow": [ 50, 822 ],
      "rightElbow": [ 5, 851 ],
      "leftWrist": [ 5, 979 ],
      "rightWrist": [ 5, 1090 ],
      "leftHip": [ 5, 851 ],
      "rightHip": [ 53, 970 ],
      "leftKnee": [ 71, 1069 ],
      "rightKnee": [ 5, 657 ],
      "leftAnkle": [ 5, 657 ]
    },
    ...
  ]

検出する部位

AnyMotionが検出する部位は以下になります。

部位名
nose
leftEye 左目
rightEye 右目
leftEar 左耳
rightEar 右耳
leftShoulder 左肩
rightShoulder 右肩
leftElbow 左肘
rightElbow 右肘
leftWrist 左手首
rightWrist 右手首
leftHip 左腰
rightHip 右腰
leftKnee 左膝
rightKnee 右膝
leftAnkle 左足首
rightAnkle 右足首

キーポイントを抽出する

POST /keypoints を用いることで、キーポイント抽出を実行することができます。 ファイルアップロード で得られた imageIdまたは movieId を使用します。

Hint

キーポイント抽出は非同期で実施されます。処理時間は動画の長さなどにより変化します。

指定した imageIdの画像 または movieId の動画がアップロードされていない場合、リクエストは失敗します。

サンプルコード

Hint

<アクセストークン>の取得は、認証方式を参照してください。

Shell

1
2
3
4
5
curl -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer <アクセストークン>" \
    -d '{"imageId": "<画像ID>"}' \
    "https://api.customer.jp/anymotion/v1/keypoints/"

Python

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import requests

response = requests.post(
    "https://api.customer.jp/anymotion/v1/keypoints/",
    data=json.dumps({"imageId": "<画像ID>"}),
    headers={
        "Content-Type": "application/json",
        "Authorization": "Bearer <アクセストークン>"
    }
)
print(response.status_code)
print(response.json())

抽出したキーポイントを取得する

リクエストには keypointId を指定します。 処理のステータスは、レスポンスの execStatus で確認することができます。 SUCCESS の場合、処理が完了しており,キーポイント情報を取得することができます。

Hint

execStatusUNPROCESSEDPROCESSING の場合はまだ処理が完了していません。 時間をおいてから再度確認してください。

サンプルコード

Hint

<アクセストークン>の取得は、認証方式を参照してください。

Shell

1
2
3
curl -X GET \
    -H "Authorization: Bearer <アクセストークン>" \
    'https://api.customer.jp/anymotion/v1/keypoints/<キーポイントID>/'

Python

1
2
3
4
5
6
7
8
import requests

response = requests.get(
    "https://api.customer.jp/anymotion/v1/keypoints/<キーポイントID>/",
    headers={"Authorization": "Bearer <アクセストークン>"}
)
print(response.status_code)
print(response.json())