Kapaoで、人物検出と姿勢推定を行う

1.はじめに

 通常、姿勢推定などのタスクではヒートマップを使った回帰の手法を使いますが、今回ご紹介するのはヒートマップを使わずに姿勢推定を行うKapaoという技術です。

*この論文は、2021.11に提出されました。

2.Kapaoとは?

 通常、姿勢推定などのタスクではヒートマップを使った回帰のアプローチを取りますが、生成と後処理に大量の計算処理が必要です。

 Kapao(Keypoints and Poses as Objects)は、もっと処理効率を上げるために、画像を細かなグリッドに分割して、人間のポーズオブジェクトキーポイントオブジェクトを同時に検出・融合し姿勢推定を行います。

 下記は、Kapaoのネットワークの概要です。入力画像を深い畳み込みネットワークでマッピングし、ポーズオブジェクトとキーポイントオブジェクトをそれぞれ検出した後、この2つの情報を融合し結果を得ています。

 では、早速コードを動かしてみましょう。

3.コード

 コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンクをクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。

 まず、セットアップを行います。

 

 最初に、指定動画をYoutubeからダウンロードして変換するデモを demos/flash_mob.py を使って行います。–weights で学習済みパラメータの指定、–start で変換開始時間(秒)の指定、–end で変換終了時間(秒)の指定を行います。

 作成された動画 flash_mob_inference_kapao_s_coco.mp4 のコーデックは MPEG4 Video で、このままでは扱いにくいので汎用性のあるコーデック H.264 に変換し flash_mob.mp4 で保存します。

 動画を再生します。

 

 次に、movieフォルダーの動画を変換するデモを test.py を使って行います。–name で動画の指定、–weights で学習済みパラメータの指定、–start で変換開始時間(秒)の指定、–end で変換終了時間(秒)の指定を行います。

 自分の動画でやりたい場合は、movieフォルダーに自分の動画をアップロードして、その動画を指定して下さい。

 作成された動画 output.mp4 のコーデックは MPEG4 Video で、このままでは扱いにくいので汎用性のあるコーデック H.264 に変換し out.mp4 で保存します。

 動画を再生します。

では、また。

(オリジナルgithub)https://github.com/wmcnally/kapao

2022.1 colabアップデート

リンク:https://github.com/cedro3/kapao/blob/master/kapao_latest.ipynb

(twitter投稿)

15 件のコメント

  • これって、AlphaPoseやOpenPoseと比べどれくらい処理が軽いでしょうか。
    また、精度はどうですか?

    ヒートマップを使わない事にメリット等はあるのでしょうか。

    • traceさん
      論文では、KapaoをAlphaPoseやOpenposeと比較した場合、処理がどの程度早いかの記載はありませんが、シングルステージでは精度は確実に高いようです。
      ヒートマップを使わないメリットは、後処理に関わる負担を軽減でき量子化誤差の影響を受けないことです。

    • traceさん
      残念ながら、こちらでは再現ができません。
      —start はいくつでしょうか? —start 0 —end 100 になっていれば、100秒以内の長さの動画は全て変換されるはずです。

  • やはりエラーが出ます

    Using device: cuda:0
    /usr/local/lib/python3.7/dist-packages/torch/functional.py:445: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at ../aten/src/ATen/native/TensorShape.cpp:2157.)
    return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]
    Writing inference video: 45% 135/300 [00:09<00:11, 13.76it/s]
    Traceback (most recent call last):
    File "test.py", line 122, in
    bboxes, poses, _, _, _ = post_process_batch(data, img, [], [[im0.shape[:2]]], person_dets, kp_dets)
    File “/content/kapao/val.py”, line 108, in post_process_batch
    kpd[:, :4] = scale_coords(imgs[si].shape[1:], kpd[:, :4], shape)
    RuntimeError: unsupported operation: some elements of the input tensor and the written-to tensor refer to a single memory location. Please clone() the tensor before performing the operation.

      • traceさん
        変換開始4秒後にエラーが発生して停止するのであれば、ちょうど4秒後に姿勢検出を失敗する画像に出くわした事が考えられます。
        エラーが発生した画像を確認してみて下さい。多分、姿勢推定が難しい画像になっていると思います。

  • endを20秒に設定したのですが、11秒で終わってしまいました。traceさんと同じメッセージが出ています。姿勢推定が難しい画像になっているのでしょうか?
    Using device: cuda:0
    /usr/local/lib/python3.7/dist-packages/torch/functional.py:445: UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at ../aten/src/ATen/native/TensorShape.cpp:2157.)
    return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]
    Writing inference video: 57% 341/600 [00:29<00:22, 11.73it/s]

    • bravoastroさん
      そうだと思います。Kapaoは姿勢推定に失敗するとエラーを起こして止まる設計になっているようです。姿勢推定に失敗したであろうシーンをチェックしてみて下さい。

  • サンプルソースありがとうございました。いろいろと動画試してみてうまく動きました。
    推定したデータから良し悪しを測れるようになればいろいろと活用幅が広がりそうですね。
    そういう推定結果データも出力できるものなんですかね?

    • ドイさん
      現状は良し悪しの判定はできません。対象の教師データがあれば、そのデータと比較することで判定できるように見直すことはできると思います ^^

  • trace へ返信する コメントをキャンセル

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

    ABOUTこの記事をかいた人

    アバター

    ディープラーニング・エンジニアを趣味でやってます。E資格ホルダー。 好きなものは、膨大な凡ショットから生まれる奇跡の1枚、右肩上がりのワクワク感、暑い国の新たな価値観、何もしない南の島、コード通りに動くチップ、完璧なハーモニー、仲間とのバンド演奏、数えきれない流れ星。