2018/02/28 使用するプログラム修正
Kinect使わずに単眼カメラで骨格検出ができる
人の骨格を検出する技術というものがあって、ひと昔前まではKinectを代表とするデプスカメラ(3次元情報をリアルタイムに取得できるカメラ)を用いたものが一般的でした。たまに、アミューズメントパークなどである、人の動きに合わせて色々な音楽や映像を出すようなインスタレーションを見かけますが、ああいうものには、大抵Kinectセンサが使われています(よく探すと、大体プロジェクタの近くとかに隠されています)。
個人でもここらへんの技術は比較的簡単に扱うことができて、例えばMacでもProcessingというプログラミング環境を用いることで、色々遊ぶことができます。詳しくは以下参照下さい。
ところが、最近は骨格検出をディープラーニングを始めとする高度な画像処理を用いて、なんとデプスカメラでなく普通の単眼カメラで実現する技術が出て来ました。3次元センサ用いず骨格検出するなんて想像もしたことなかったので、自分のような凡人には結構衝撃大きかったです。
そして、論文が発表されたら、すぐ実装してオープンソースとして公開されるという世の中の流れ、頭がクラクラしてくるようなスピード感ですね。一般にはOpenPoseが有名なのですが、ちょっと動かすのが大変そうだったので色々探したら、DeNAのエンジニアさんがChainerというディープラーニングのフレームワークを用いて実装した「Realtime Multi-Person Pose Estimation」というのが、セットアップ簡単で、本当に自宅のPCで骨格検出が実現できたので、使い方とテスト結果を紹介してみたいと思います。
Realtime Multi-Person Pose Estimation の使い方
技術的な説明などは、DeNAのエンジニアのleetenkiさんが公開している以下記事を参照下さい。
コードはGitHubで公開されていて以下となります(日本語のREADMEへのリンクもあります)。
注意点としてはライセンスです。ソフトウェアの利用は学術的用途や非商業用途に限られるということです。なので、勝手にこのソフトを組み込んだシステムを商業施設で使用したり、ソフトとして販売したらNGですので気を付けましょう。
動かし方は基本的には、上記のREADMEの通りにやればOKなのですが、自分の環境だと何故かエラーが出てしまったので、何時ものように勘で直して動くようにしました。 開発者のleetenkiさんが本記事を見て修正下さりなおっております。
以下は自分の環境でのセットアップ方法のメモです。MacでCPUのみで試してみたいという方には参考になるかもしれません(速度的にはあまり実用的ではないです)。
セットアップ方法
自分の環境はiMac (Retina 4K, 21.5-inch, 2017) macOS Sierra 10.12.6で試しています。他の環境(Linux、Windows)では、テストしていないので恐らくそのままでは動かないと思いますが、何かの参考くらいにはなると思います。
Pythonの環境に関しては、以下記事参考にセットアップ下さい。
Anaconda3.0を入れれば、あとは必要なライブラリはOpenCVとChainerくらいでよいと思います。Chainerのバージョンは2.0以上で必須のようです。私は3.3.0で試しましたが、問題なく動きました。Chainerはバージョンによって動かない可能性あるので、以下のようにバージョン固定しておくと良いと思います。
$ pip install chainer==3.3.0
あとは、ターミナルで以下の通りコマンドを実行して、ソフトをCloneして、必要なモデルファイルをダウンロードして変換をするだけです。
$ git clone https://github.com/DeNA/Chainer_Realtime_Multi-Person_Pose_Estimation $ cd Chainer_Realtime_Multi-Person_Pose_Estimation/models $ wget http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/coco/pose_iter_440000.caffemodel $ python convert_model.py posenet pose_iter_440000.caffemodel coco_posenet.npz $ cd ..
これで準備完了です。もし動かない場合は、バージョン違いかもしれません。とりあえず1行目を以下に変えて私がforkしたバージョンに変えると動いたりするかもしれません。
$ git clone https://github.com/karaage0703/Chainer_Realtime_Multi-Person_Pose_Estimation
「Realtime Multi-Person Pose Estimation」テスト結果
以下コマンドを実行するとソフトが動きます。iMacの場合は内蔵のカメラが勝手に起動しましたが、カメラが無いPCの場合は、Webカメラなどを適当に接続しましょう。
$ python camera_pose_demo.py
動作結果は、以下のような感じです。
恥ずかしいので顔を紙袋で隠しているので、顔は検出できていない点、ご容赦ください。ちなみにリアルタイムっぽく見えますが、iMacの環境だと骨格検出には5,6秒程度かかります。リアルタイムに実現するには、今のPCスペックだとGPUが必須ですね。
CPUでもリアルタイムに骨格検出が実現できる「tf-pose-estimation」
ものの数ヶ月で、CPUでリアルタイムに骨格検出が実現ができる技術が出てきました。しかもApache 2.0ライセンスで使いやすい!README通りにセットアップしたら、簡単に動かせました。凄い…
まとめ:「Realtime Multi-Person Pose Estimation」を試してみて
単眼カメラで骨格検出できる「Realtime Multi-Person Pose Estimation」を試してみました。CPUだけでリアルタイムに処理できれば、昔作ったヒューマンシーケンサ(下記記事参照)の単眼カメラバージョンを作ろうかと思っていたのですが、GPUが無いと流石に厳しそうですね。
しかし、これだけのことが単眼カメラだけで出来てしまうのは驚きですね。Kinectが出たときは、これからカメラがもっと高性能になっていくのかと思っていたのですが、最近の研究の流れを見ていると、今後は普通のカメラと高度な画像処理を組み合わせて、様々な機能を実現するという方向に世の中は向かっていくのかもしれないないですね。Kinectは生産中止になってしまいましたし…個人的には、高精度なデプスカメラまだまだ需要あると思うのですが、今だとそこそこ安価で使えそうなデプスカメラはIntel Realsenseシリーズくらいでしょうか。
デジカメの分野だと、日本のメーカはセンサやレンズの性能でまだ大きく優位性がありますが、今のうちに手を打たないと他の分野のようにソフトで負けちゃわないかな、とか少しだけ日本のカメラファンとして杞憂しています。ディープラーニング等の技術を使えば、豆粒センサとレンズでもフルサイズセンサのようなボケとか、超望遠レンズのような画角って実は実現できてしまったりします。
今はクオリティはそれほど高くはないのですが、ソフトウェアの進化のスピードを考えると数年後はどうなるのでしょうね。nvidiaのチップが載ったデジカメが出てくるのもそう遠い未来ではないかもしれません。
参考リンク
深層学習を用いたコンピュータビジョン技術とスマートショップの実現
夏のトップカンファレンス論文読み会 / Realtime Multi-Person 2D Pose Estimation using Pa…
OpenPoseのPAFモデル - mabonki0725の日記