本日は
姿勢推定(Pose Estimation) をご存知でしょうか? 人間の関節点(例えば、肩や肘、手首など)をキーポイントとして検知し、それらをつなぎ合わせることで、人の骨格を形成し人の姿勢を推定する技術です。OpenPose は姿勢推定を深層学習で行う手法・実装の一つです。
- https://github.com/CMU-Perceptual-Computing-Lab/openpose
- https://github.com/ZheC/Realtime_Multi-Person_Pose_Estimation
これらのTensorFlowによる実装、Chainerによる実装が各々公開されています。
- https://github.com/ildoonet/tf-pose-estimation
- https://github.com/DeNA/Chainer_Realtime_Multi-Person_Pose_Estimation
今回は最近発表された姿勢推定のモデルである Pose Proposal Network [1] とそれの Chainer による実装を紹介をします。
Pose Proposal Network(PPN)1
- Pose Proposal Network(以下PPNと略す) は姿勢推定を行うネットワークアーキテクチャの一つです。論文はこちら [1]。
- 関節点推定を物体検出の文脈に落とし込みます。 YOLOと同様、入力画像をグリッドで分割し各々のグリットにいる Bounding Box が関節点を検知します。検知された関節点をBottom Up 方式でつなぎ合わせる事で画像内にいる複数の人間を検知することができます。
- PPNのネットワークは特徴量を抽出する役割を果たすベースネットワーク(例えばResNet18)に上記のBBoxのデータおよび関節点同士を結びつけるために必要なデータを持った特徴マップを出力するためのCNNを一つ加えたものになります。OpenPoseに比べると比較的浅いネットワークで実現することができ、推論において高速に姿勢推定を行うことができます。
- 著者の YouTube デモ動画 でその速度を実感することができます。
実装例の紹介
論文の著者による実装はいまのところ見つかっていません。
ここでは論文をベースに Chainer で実装された
を紹介します2。
動かし方
- README.md の通りです。GPU付きUbuntuマシーンであれば Docker、NVIDIA Container Runtime for Docker をインストールしておくとスムーズにことが運ぶはず。
- COCO または MPII によるデータセットで学習することができます。
- 学習済みモデルが近いうちに公開される予定です。
- 追記:公開されました。リポジトリの releaes ページからダウンロードできます。
動かした結果
- ベースをResNet18にして、insize=224x224, COCOをデータセットにした場合の結果です。2
- 関節点がバウンディングボックスによって検出されている様子がわかります。
- 紹介しているリポジトリでは instance (白色のBBox) を検知することで、人間の存在を確認します。そのあと、 instance から伸びるエッジを辿ることで、上半身から下半身に伸びる形で、関節、関節同士をつなぎ合わせて一つの人間を形成していきます。
- 30FPSでも速いですが 2、オリジナルの論文の結果には届いていません。リポジトリにある
high_speed.py
を実行することで、動画キャプチャー、モデルの推論、後処理を別スレッドで行うことで推論速度を向上させることができます。また、カメラのキャプチャーが遅いとそれ以上のスピードは出ませんので、USBカメラもリ60FPS出るような高性能のものを用意する必要があります。
ラズパイ版
- ベースを MobileNetV2 に, insize 224x224,データはCOCO.
- できないことはない! だいたい 0.5 FPS 3
おまけ機能
にあるように実は instance をマスクする機能があります。手持ちの画像をリポジトリ直下に mask.png
としておくと instance 部分を隠すことができます。MPIIでは instance が顔の周りなので笑い男もどきができます。
Reference
[1] Taiki Sekii.: Pose Proposal Networks. In: ECCV. (2018)