この記事は下記のような方に向けて姿勢推定(Pose Estimation)の実行方法について説明していきます
- 物体検知以外のAI技術に触れてみたい
- 姿勢推定って聞いたことあるけどどういう技術なのか知りたい
- 姿勢推定を実際に好きな画像・動画・カメラで試してみたい
- HRNetを試してみたいけど実行方法がいまいちわからない
- AI技術にとりあえず触れてみたい
- OpenPoseは商用利用時に有料なので無料の姿勢推定手法を知りたい
まずは姿勢推定についての概要を紹介して、そのあと実際に実行するまでの方法を解説していきたいと思います
姿勢推定とは?
みなさん姿勢推定というのをご存知でしょうか?
昨今のAI技術を使って、画像のデータからその画像データ内に写っている人を検知して、その人がどういう姿勢なのかを推定して関節にあたるジョイントと腕や足などの骨の部分にあたるボーンの状態を点と線を使って表示するような技術です
実際の動画を見た方が早いかもしれませんね
関節部分のところに点があり、その点の間の骨の部分に線が描画されていることがわかります
人を検知するところでは以前本ブログでも紹介した物体検知の技術が使われています
画像内に人を検知した場合に姿勢推定の処理を実行するという流れになってます
今回はHRNet(High Resolution Network)という姿勢推定のモデルを使いやすい形にしてgithubにあげてくださっている方がいらっしゃったので、そちらのgithubのコードを用いて、HRNetを使った姿勢推定を実行するところまでをやっていこうと思います
元の論文は下記になりますので詳しく理解したい方は読んでみてください
HRNet以外ではOpenPoseなども有名ですね
ただOpenPoseはオープンと行っていますが商用利用が有料になったと思いますので、業務等で使おうという方はご注意ください!
実験環境
今回姿勢推定を試す環境は以下のとおりですが同じである必要はありません
メモリはできれば8GB以上、GPUはNVIDIA、OSはUbuntuであれば同じように実行できるかと思いますが、何か差分があればご質問いただくか適宜お調べください
- PC
- メモリ 16GB
- NVIDIA GeForce 1070
- OS
- Ubuntu 18.04LTS
- 言語
- Python
- 使用ライブラリ
- git
- opencv-python
- matplotlib
事前準備
NVIDIAドライバ、CUDA、cuDNNなどのインストールは下記の記事を参考に行ってください
今回姿勢推定を行うためのサンプル動画を下記からダウンロードしてください
ファイル名はinput.mp4で保存してください
先ほど結果をお見せしたブレイクダンスをしている動画あたりがわかりやすいと思いますが、他のサンプルを試したい場合はそちらでも構いません
おそらく体の全体が写っている方が精度は良いと思います
Anacondaで作業環境を作成
下記作業は必須ではありませんが、環境を分けて管理した方がライブラリとかの管理がしやすいです
$ conda create -n hrnet python==3.7 anaconda
HRNetによる姿勢推定
インストール手順
今回は下記のgithubを使用します
ちなみに今回は使用しませんが論文の著者の元のgithubはこちらになります
適当なディレクトリにてgit cloneを使って、githubからコードをcloneしてきましょう
$ git clone https://github.com/stefanopini/simple-HRNet.git
$ cd simple-HRNet
必要なライブラリをインストールします
$ pip install pip --upgrade
$ pip install tensorboard==1.14 PyHamcrest
$ pip install -r requirements.txt
もしこの時点でなんらかのエラーが出た場合は事前にインストールされていたライブラリのバージョン等と競合している可能性がありますのでエラー内容にしたがって解決するようにしてください
競合しているライブラリを下記のように一度アンインストールするなどして試してください
$ pip uninstall [アンインストールしたいライブラリ名]
下記からpose_hrnet_w48_384x288.pthをダウンロードしてください
こちらはpthファイルはpytorchの事前に学習したモデルファイルになっており、これを使って姿勢推定を行います
下記のようにsimplte-HRNetディレクトリ配下でweightsディレクトリを作成し、そこに先ほどダウンロードしたpthファイルを移動します
$ mkdir weights
$ mv pose_hrnet_w48_384x288.pth weights/.
続いて人の物体検知用にYOLOv3関連のインストールを行います
simple-HRNet/models/detectorsに移動してYOLOv3のgithubからファイルをクローンしてきます
$ cd models/detectors
$ git clone https://github.com/eriklindernoren/PyTorch-YOLOv3.git
すでにあるyoloフォルダをクローンしたディレクトリに置き換えます
$ rm -r yolo
$ mv PyTorch-YOLOv3 yolo
$ cd yolo
yoloディレクトリ配下でYOLOv3に必要なライブラリをインストールします
$ pip install -r requirements.txt
yolo/weightsフォルダに移動してweightsファイルをダウンロードします
$ cd weights
$ bash download_weights.sh
最低限下記のようなディレクトリ、ファイル構成になっていれば今までの手順が正しく行われています
simple-HR-Net
|-- datasets
|-- losses
|-- misc
|-- models
| |--detectors
| |--yolo
| |--weights
| |--yolov3.weights
|--scripts
|--testing
|--training
|--weights
|--pose_hrnet_w48_384x288.pth
カメラを使ったリアルタイムの姿勢推定の実行
PCにカメラを繋いだ状態でsimple-HRNetディレクトリ配下で以下のように実行すると、カメラ映像に対してリアルタイムで姿勢推定を行って、結果をディスプレイに表示するとともに動画出力されます
$ python scripts/live-demo.py --camera_id 0 --save_video
output.aviというファイルでビデオが出力されていれば成功です
動画データに対する姿勢推定の実行
つづいてカメラではなく動画データに対して姿勢推定処理を行う方法です
先ほどダウンロードしておいたinput.mp4をsimple-HRNet配下に移動して、下記のようにコマンドを実行してください
$ python scripts/live-demo.py --filename input.mp4 --save_video
先ほどと同様に結果をディスプレイに表示するとともに動画出力されます
output.aviというファイルでビデオが出力されていれば成功です
再掲になりますが下記のようになっていれば上手くいっています
画像データに対する姿勢推定の実行方法
人の全体像が写っていればなんでも良いですが、画像ファイルを用意してinput.jpgという名前でsimple-HRNetディレクトリに配置してください
simple-HRNet配下で下記image_pose.pyを作成してください
$ vi image_pose.py
import cv2
import argparse
from SimpleHRNet import SimpleHRNet
import os
import sys
import cv2
import numpy as np
sys.path.insert(1, os.getcwd())
from SimpleHRNet import SimpleHRNet
from misc.visualization import draw_points, draw_skeleton, draw_points_and_skeleton, joints_dict, check_video_rotation
from misc.utils import find_person_id_associations
parse = argparse.ArgumentParser()
parse.add_argument("--input", "-i", help="target image", type=str, default="input.jpg")
parse.add_argument("--output", "-o", help="output file name", type=str, default="output.jpg")
args = parse.parse_args()
# Model parameters
nchannels=48
njoints=17
# Creat the HRNet model
model = SimpleHRNet(nchannels, njoints, "./weights/pose_hrnet_w48_384x288.pth")
# Load the input image
image = cv2.imread(args.input, cv2.IMREAD_COLOR)
# Perform the prediction for pose estimation
pts = model.predict(image)
person_ids = np.arange(len(pts), dtype=np.int32)
# Draw the joints and bones
for i, (pt, pid) in enumerate(zip(pts, person_ids)):
frame = draw_points_and_skeleton(image, pt, joints_dict()['coco']['skeleton'], person_index=pid, points_color_palette='gist_rainbow', skeleton_color_palette='jet',points_palette_samples=10)
# Ouput the results
cv2.imwrite(args.output, frame)
それではinput.jpgに対してresult.jpgという名前で姿勢推定結果を出力してみましょう!
$ python image_pose.py --input input.jpg --output result.jpg
エラーが出た場合はファイル名が間違っているか、画像内に人が検知できなかったのいずれかだと思いますので、ファイル名を確認いただき、必要であればinput.jpgを別のファイルで試してください
下記のような結果が得られれば成功です

最後に
今回は姿勢推定のうち比較的最近論文に発表されたHRNetを取り上げてみました
今回は学習済モデルを使用し、有志の方が公開されていたコードを利用させていただきましたが、もちろん独自に学習させたり、コードを自分なりに実装して、姿勢推定を活用したユースケースに対応することも可能です
他の姿勢推定の手法や学習方法、理論的な部分の解説などもいずれ本ブログでしていければと思います
またHRNetは姿勢推定以外にもセマンティックセグメンテーション、画像分類、物体検知、顔の特徴検知といった手法にも応用されているモデルですので、そのあたりもいつか取り上げるかもしれません
本ブログでは、引き続き以下のような技術についてもいずれ紹介していきたいと思いますので、よろしければまた見に来てください
- 画像分類 (Image Classification)
- 物体検知 (Object Detection)
- 物体トラッキング (Object Tracking)
- 姿勢推定 (Pose Estimation)
- 自然言語処理 (Natural Language Processing)
- 3次元再構成 (3D Reconstruction)
- …etc
CenterNetというモデルでも姿勢推定や物体検知を実行する方法を紹介してます
物体検知の基本的なところを知りたい方はこちらもどうぞ
関連文献
今回取り上げなかった姿勢推定手法であるOpenPoseについて下記の書籍に解説とコードが載っています
コメント