はじめに
姿勢推定(骨格推定)の代表的なフレームワークであるMMPoseを使ってみて、日本語の記事が少ないなと思ったので、姿勢推定や骨格推定してみたい方の参考になればいいなと思って、記事を書こうと思いました。
姿勢推定(骨格推定)とは
上の画像を入力として与えたときに、下の画像のように物体(ここでは牛)の鼻や目、足などのキーポイントをそれぞれ特定し、適切な部分を線で結んだ画像を得るタスクになります。
対象としては上記画像のように動物もあるし、人間もあります。人間の場合は例えばテニスのサーブのスイング時の姿勢を推定し、プロと素人でどこが違うのかのコーチングなどに活かされています。
この姿勢(骨格)推定アルゴリズムとしては大きく
・トップダウン方式
・ボトムアップ方式
の2つがあります。
トップダウン方式
画像の中の物体を特定(物体検知)し、特定した物体それぞれに対して骨格推定を行う方式
ボトムアップ方式
画像の中の物体全てにとりあえず骨格推定を行い、それぞれのキーポイントを同一物体同士で繋ぐ方式
精度としてはトップダウンの方が、一個一個の物体に対して骨格推定を行うので高い傾向にあります。
ボトムアップはキーポイントが推定できてもそれを同じ物体同士で繋ぐことを学習するのが難しいようです。
今回紹介するMMPoseの中のAnimalPoseというモデルは、トップダウン方式のモデルになります。
このトップダウン方式は物体検知と骨格推定がそれぞれ独立しています。
モデルの入出力の流れを説明すると以下のようになります。
画像を物体検知モデルに入力
↓
物体の位置を示したBBox座標を得る
↓
画像とBBox座標を骨格推定モデルに入力
↓
それぞれの物体のキーポイント座標を得る
つまりモデルが物体検知モデルと骨格推定モデルの2つが必要になります。
MMPoseとは
骨格推定のモデルをたくさんまとめた汎用的なフレームワークのようなものになります。
公式ドキュメントも充実しており、様々なモデルを使用することができます。
ライセンスもApache-2.0 Licenseなので商用利用も可能です。
リポジトリ:https://github.com/open-mmlab/mmpose
公式ドキュメント:https://mmpose.readthedocs.io/en/latest/
HRNet on AnimalPose
今回紹介するのは、AnimalPoseというデータセットで学習をしたHRNetというモデルになります。
様々なスケールで学習をし、高解像度の持つ特徴量と低解像度の持つ特徴量を共有して骨格キーポイントを推定するモデルのようです。
導入・推論
MMPoseをローカル環境で動かすとなると、環境構築が結構めんどくさいです。
なので手軽に試してみたいという方は公式リポジトリのdemoノートブックをGoogle Colabで動かすのがいいでしょう。
デモノートブック
https://colab.research.google.com/github/open-mmlab/mmpose/blob/main/demo/MMPose_Tutorial.ipynb
これを上から順に実行すれば動いてくれます。
ただ注意点があって自分の場合は2つ目のセルを何回か実行しないとnumpyのバージョンが正しくならなかったです。
AnimalPoseを使用する場合は
pose_config = 'configs/body/2d_kpt_sview_rgb_img/topdown_heatmap/coco/hrnet_w48_coco_256x192.py'
pose_checkpoint = 'https://download.openmmlab.com/mmpose/top_down/hrnet/hrnet_w48_coco_256x192-b9e0b3ab_20200708.pth'
上記部分を
pose_config = 'configs/animal/2d_kpt_sview_rgb_img/topdown_heatmap/animalpose/hrnet_w48_animalpose_256x256.py'
pose_checkpoint = 'https://download.openmmlab.com/mmpose/animal/hrnet/hrnet_w48_animalpose_256x256-34644726_20210426.pth'
に変更すれば大丈夫なはずです。
configとmodelファイルを変更するだけで色々なモデルの推論を試せます。
まとめ
簡単ですが、MMPoseの紹介です。学習済みのモデルを簡単に試せるのは非常に良いなと思いました。
次はローカルでの環境構築方法と物体検知モデルにYOLOv4を使用して動物の骨格推定を行うまでの流れを紹介したいと思います。