LoginSignup
0
1

More than 3 years have passed since last update.

AnyMotionを使って2つの画像の骨格位置を比較する

Last updated at Posted at 2020-09-09

はじめに

AIを用いた姿勢推定による動作解析APIプラットフォームであるAnyMotionに2つの画像/動画間の動作比較機能が実装されました。

この記事では2つの画像を用いて比較機能を試してみたいと思います。

AnyMotionの比較機能について

公式ドキュメントによれば、キーポイント抽出した部位に対して以下のような計算を行っているようです。

  • 2点がどの方向(degree)に差異があるか
  • 2点がどれくらい距離(distance)があるか

比較する人物の大きさが異なっている場合でも同じ大きさになるように正規化を行っているため、被写体の写り方を気にする必要はないようです。

用意するもの

やってみる

AnyMotion CLIのインストール

以前の記事はSDKを用いてPythonで実装しましたが、今回は手軽にAnyMotionを試せるCLIを使用します。本記事執筆時点での最新版は1.1.0です。

pip install anymotion-cli

Macの場合はhomebrewを使ってもインストールできます。

brew install nttpc/tap/anymotion-cli

AnyMotion CLIへトークン情報の設定

$ amcli configure
AnyMotion Client ID: XXXXCLIENTIDXXXX (入力しても表示されない)
AnyMotion Client Secret: XXXXCLIENTSECRETXXXX (入力しても表示されない)

トークンが無事登録できればamcliを使ってAnyMotion APIにアクセスできます。
ここでは試しに画像一覧取得APIを実行します。AnyMotionに登録した直後は空の配列が返ってくるはずです。

$ amcli image list

[]

画像のアップロード

ここでは比較に使用する2枚の画像を1枚ずつアップロードします。
ここでは次の2枚の画像をアップロードしてみます。
image1.jpg

image2.jpg

$ ls
image1.jpg  image2.jpg

$ amcli upload image1.jpg
Success: Uploaded image1.jpg to the cloud storage. (image id: 16346)

$ amcli upload image2.jpg
Success: Uploaded image2.jpg to the cloud storage. (image id: 16347)

キーポイント抽出

先ほどアップロードした画像に対してキーポイント抽出をかけます。
uploadコマンド実行時に表示されるimage idを使用します。

$ amcli extract --image-id 16346
Keypoint extraction started. (keypoint id: 25769)
Success: Keypoint extraction is complete.

$ amcli extract --image-id 16347
Keypoint extraction started. (keypoint id: 25770)
Success: Keypoint extraction is complete.

比較

抽出したキーポイントをもとに比較を行います。
extractコマンド実行時に表示されるkeypoint idを使用します。

キーポイントIDを指定するとき、先に指定するキーポイントが比較基準(source)、後に指定するキーポイントが比較対象(target)になります。

またここでは引数に -d / --with-drawing オプションを追加します。これにより比較処理と合わせて比較結果が描画されたファイルをダウンロードすることができます。

$ amcli compare -d 25769 25770
Comparison started. (comparison id: 38)
Success: Comparison is complete.

Drawing started. (drawing id: 25658)
Success: Drawing is complete.

Downloaded the file to image2_image1.jpg.

ダウンロードされたファイルを開いてみると、。抽出された灰色のキーポイントおよびそれらを結ぶ灰色の線が描画され、キーポイントの位置に大きく差がある右肘および右手首のキーポイントは赤くなっているのが確認できます。


比較基準としてimage1.jpgを使用しているため、ダウンロードされたファイルもimage1.jpgが使用されています。引数に指定したキーポイントIDの位置を入れ替えることで描画に使用されるファイルも以下のように入れ替わります。

比較機能の詳細取得

比較したキーポイントがどの方向にどれくらい離れているか、という情報はjson形式で取得することができます。

$ amcli comparison show 38

{
  "id": 38,
  "target": 25770,
  "source": 25769,
  "difference": [
    {
      "leftEar": {
        "distance": 0.0849754856212557,
        "direction": 203.08475544393698
      },
      "leftShoulder": {
        "distance": 0.06794792920664146,
        "direction": 202.95930768122653
      },
      "rightShoulder": {
        "distance": 0.04741214355763907,
        "direction": 228.66692586956376
      },
      "leftElbow": {
        "distance": 0.04866278725325595,
        "direction": 194.89279875931024
      },
      "rightElbow": {
        "distance": 0.21899947129386607,
        "direction": 357.703329183744
      },
      "leftWrist": {
        "distance": 0.015746550849744665,
        "direction": 191.1641311241438
      },
      "rightWrist": {
        "distance": 0.4218261496619992,
        "direction": 0.3992279749799625
      },
      "leftHip": {
        "distance": 0.03687588672417605,
        "direction": 244.6251848528287
      },
      "rightHip": {
        "distance": 0.03451332524341227,
        "direction": 242.75005929427078
      },
      "leftKnee": {
        "distance": 0.031044976542986987,
        "direction": 270.05760597221814
      },
      "rightKnee": {
        "distance": 0.032956247407511546,
        "direction": 270.0542651595068
      },
      "leftAnkle": {
        "distance": 0.05013280578456332,
        "direction": 288.0030704990386
      },
      "rightAnkle": {
        "distance": 0.04057149983586865,
        "direction": 292.4517105064375
      }
    }
  ],
  "execStatus": "SUCCESS",
  "failureDetail": "",
  "createdAt": "2020-09-08T09:19:04.804187Z",
  "updatedAt": "2020-09-08T09:19:05.173775Z"
}

比較結果を見てみると"rightElbow"と"rightWrist"の距離(distance)が0.2を超えています。
比較結果を描画するとき、デフォルトでは距離が0.2を超えるとキーポイントが赤く描画されるようです。
これらのしきい値や描画色は個別に設定することができます。詳しくはドキュメントを参照してください。

おわりに

2つの画像を使ってAnyMotionの比較機能を試してみました。
今回は画像を使用しましたが、画像と動画、動画と動画の比較も可能です。
スポーツやダンスなど様々なシーンで活用できそうだなと思いました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1