OpenCVでは様々な画像処理ができることをこれまでに紹介してきました。今回は画像から人物の姿勢を推定してみます。
姿勢推定とは、いわゆる骨格の検出です。画像に映る人物の骨格を検出することで、その人物の姿勢、関節の角度などがより明確になります。
姿勢推定はスポーツや医療など様々な場面で用いられています。OpenCVを使えば、姿勢推定が簡単にできます。今回はPythonでOpenCVを使って姿勢推定をやってみます。
OpenPoseの導入
OpenPoseとはオープンソースとして世間一般に公開されている骨格推定のプログラムコードです。このOpenPoseもOpenCVをもとに作られています。
learnopencvというサイトがGithub上で提供するソースコードをダウンロードします。
https://github.com/spmallick/learnopencv
このサイト自体もOpenCVにおける画像処理の手順を体系的にまとめており、非常にわかりやすいです(英語ですが)。
展開するとOpenPoseというプロジェクトがあるので、これを使います。なおフォルダの構成は以下のようになっています。
pose_iter_440000.caffemodelがないとき
プログラム内でpose_iter_440000.caffemodelというファイルを使用しているのですが、デフォルトでこのファイルがない場合があります(筆者はそのパターンでした)。
pose_iter_440000.caffemodelはOpenPose>pose>cocoに存在しているはずです。
もしこのフォルダになければ、下記URLからダウンロードしてくる必要があります。
「Download」を押せばファイルをダウンロードできるので、それを先ほどの場所に置きます。
画像で姿勢推定
まずは画像で姿勢推定をやってみます。サンプル画像として以下の画像が用意されています。
画像による姿勢推定はOpenPoseImage.pyで行います。スクリプトをそのまま実行してみます。コマンドプロンプトを開き、以下を実行してください。なお、カレントディレクトリはOpenPosenの場所を指定してください。
cd OpenPoseのパス
python OpenPoseImage.py
すると、以下のような画像が出力されるはずです。
左側の画像では人物の骨格が、右側では関節点が番号とともに描画されています。OpenPoseでは最大18点の関節を検出できます。
インプットとなる画像を指定する場合は、以下のコマンドで実行します。
python OpenPoseImage.py --image_file=画像ファイル名
もちろんPythonスクリプトなので、SpyderやVisual Studio Codeなどから直接実行することもできます。
コードをいじれば関節座標の出力などもできるので試してみて下さい。
注意
今回紹介しているOpenPoseプロジェクトでは、複数名の骨格検出ができません。試しに、以下の画像で実行してみます。
python OpenPoseImage.py --image_file=multiple.jpeg
このようにバラバラになってしまいます。複数名まとめて骨格検出する場合は、OpenPose-Multi-Personというプロジェクトを利用する必要があります。
動画で姿勢推定
動画で姿勢推定をしたい場合はOpenPoseVideo.pyを使用します。コマンドからの実行方法は先ほどとほとんど同じです。
cd OpenPoseのパス
python OpenPoseVideo.py
ファイルを指定したい場合は
python OpenPoseVideo.py --video_file=動画ファイル名
として実行します。すると、動画に骨格情報が付与されて出力されるはずです。ちなみに、動画で実行しようとするとそれなりにPCスペックが求められるのであしからず、、
OpenCVの学習におすすめ書籍
PythonでOpenCV始めてみようという方におすすめなのが以下書籍です。実装例も豊富なので、1からコードを書かずとも学習を進めることができます。
オライリーの1冊は読み物というより辞書としての利用におすすめです。お値段結構しますが、細かい情報までしっかりと詰め込まれています。
まとめ
PythonとOpenCV(OpenPose)で画像から姿勢推定をする方法を紹介しました。オープンソースで公開されており、手軽に使えるのが非常にありがたいです。Pythonに慣れている人であれば、コードを編集して座標データを出力したりなど用途はかなりあると思います。
複数名検出できるOpenPose-Multi-Personもいずれ紹介しようと思います!
OpenCVの基礎を身につけるためのロードマップは以下を参考にしてください。
ではでは👋