💃

視覚ベースの姿勢推定のオープンソースコードのリンクメモ

2023/10/06に公開

はじめに

2023年8月に出ている「Vision-Based Human Pose Estimation via Deep Learning: A Survey」という調査論文に、Deep Learning による視覚ベースの HPE(Human Pose Estimation、人間の姿勢推定)に関する情報が整理されて紹介されています。

https://arxiv.org/abs/2308.13872

この論文に記載されているオープンソースコード(OSS ではないので商用利用できるとは限らない)のリンクを備忘録として整理します。

この論文に記載のない直近の研究内容には言及しませんのでご注意ください。

前提知識

自分のように姿勢推定の分野に詳しくない人向けに、HPE の実装を参照する上で知っておくと良い前提知識を簡単にまとめておきます。

詳細は調査論文にまとめられているため、気になった点があれば論文の該当箇所を参照してください。

姿勢の推定方法

最終的に人間の骨格のキーポイント(Head、Neck などの Humanoid の基準点)の姿勢(位置+回転)を Deep Learning で推定しますが、その推論のアプローチには大きく2種類あります。

  1. Regression-based(回帰型):関節の姿勢を直接回帰的に推定する
  2. Heatmap-based(ヒートマップ型):ヒートマップを生成してから関節の姿勢を計算する

精度と計算コストが変わりますが最近は後者が主流のようです。

後者はヒートマップの計算をする分計算コストが増えますが、入力の解像度を落としてヒートマップを計算した後に Upsampling をするなどの工夫がされるようです。

詳細は論文の II-B を参照してください。

複数人の姿勢推定のアプローチ

複数人の HPE では大きく二種類のアプローチがあります。

  1. Top-down
    • 人物の検出をしてから、各人物の姿勢推定を行うアプローチ
    • 精度は良いが、人数が増えるほど計算コストが大きくなる
  2. Bottom-up
    • 画像内の関節を全て検出してから、それらを繋げて人物を構成するアプローチ
    • 精度は劣るが、人数が増えてもそれほど計算コストが大きくならない

リアルタイムの推定や低スペック環境では後者のアプローチが有用です。

詳細は論文の III-B を参照してください。

3D の姿勢推定のアプローチ

3D HPE には二種類の方法論があります。

  1. Single-stage:直接 3D の姿勢推定をする
  2. Two-stage:2D HPE で推定した 2D の姿勢から 3D の姿勢を推定する

3D のデータセットを用意するのが大変なので、2D のデータセットを活用できる後者の方が精度が良いとのことです。

詳細は論文の IV-A を参照してください。

HPE のアプローチの分類

HPE では下記の観点で様々なアプローチがあります。

  • 2D / 3D
  • 1人 / 複数人
  • 画像 / 動画
  • (複数人のみ)Top-down / Bottom-up
  • (3Dのみ)Single-stage / Two-stage
  • (3Dのみ)単視点 / 多視点
  • (3Dのみ?)視覚情報のみ / マルチモーダル

取るアプローチによってユースケース、精度、計算コスト、ロバストネス、利用できるデータセットの量と質などが異なるので、適切な実装を探す際にはどのアプローチを使用しているか確認しておくと良いでしょう。

HPE のデータセット

HPE でよく使われるデータセットが論文の TABLE 1 にまとめられていますので必要に応じて参照してください。

HPE のオープンソースコード

論文の TABLE VI に SOTA のオープンソースコードの実装がまとめられています。

参照しやすいようこちらにも引用しておきます。

ただライセンスには注意が必要です。

CC-BY-NC などの商用利用不可のライセンスや、商用利用は有料のライセンス契約が必要なものもありますので、利用用途に応じて確認してください。

Transformer ベースの HPE

最近の流行である Transformer ベースの HPE の研究のソースコードを下記にまとめておきます。

おわりに

個人的には下記の観点で自分でも触ってみようと思います。

  • VTuber の配信システムのようにリアルタイムの推論の場合どれを使うのが良いのか
  • リアルタイムでなくても良い場合に精度がどこまで出るのか
  • Transformer ベースでどれくらいの精度や計算時間になるのか

また、公開されている実装は基本的に Python で書かれていますが、計算速度や使用メモリを最適化して C や Rust で書き直す方がプロダクションでは実用的だと思います。

最近 Rust の ML Framework である candle を触っているので、リアルタイム用途で良さそうなモデルがあったら Rust 実装も挑戦してみようと思います。

Discussion