OpenPoseだけじゃない!無料でつかえる高精度な姿勢推定を実行してみよう【HRNet】(2020年8月)

プログラミング・数学・英会話
スポンサーリンク

この記事は下記のような方に向けて姿勢推定(Pose Estimation)の実行方法について説明していきます

  • 物体検知以外のAI技術に触れてみたい
  • 姿勢推定って聞いたことあるけどどういう技術なのか知りたい
  • 姿勢推定を実際に好きな画像・動画・カメラで試してみたい
  • HRNetを試してみたいけど実行方法がいまいちわからない
  • AI技術にとりあえず触れてみたい
  • OpenPoseは商用利用時に有料なので無料の姿勢推定手法を知りたい

まずは姿勢推定についての概要を紹介して、そのあと実際に実行するまでの方法を解説していきたいと思います

スポンサーリンク

姿勢推定とは?

みなさん姿勢推定というのをご存知でしょうか?

昨今のAI技術を使って、画像のデータからその画像データ内に写っている人を検知して、その人がどういう姿勢なのかを推定して関節にあたるジョイントと腕や足などの骨の部分にあたるボーンの状態を点と線を使って表示するような技術です

実際の動画を見た方が早いかもしれませんね

関節部分のところに点があり、その点の間の骨の部分に線が描画されていることがわかります

人を検知するところでは以前本ブログでも紹介した物体検知の技術が使われています

画像内に人を検知した場合に姿勢推定の処理を実行するという流れになってます

今回はHRNet(High Resolution Network)という姿勢推定のモデルを使いやすい形にしてgithubにあげてくださっている方がいらっしゃったので、そちらのgithubのコードを用いて、HRNetを使った姿勢推定を実行するところまでをやっていこうと思います

元の論文は下記になりますので詳しく理解したい方は読んでみてください

HigherHRNet: Scale-Aware Representation Learning for Bottom-Up Human Pose Estimation
Bottom-up human pose estimation methods have difficulties in predicting the correct pose for small persons due to challenges in scale variation. In this paper, ...

HRNet以外ではOpenPoseなども有名ですね

ただOpenPoseはオープンと行っていますが商用利用が有料になったと思いますので、業務等で使おうという方はご注意ください!

CMU-Perceptual-Computing-Lab/openpose
OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation - CMU-Perceptual-Computing-Lab/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で保存してください

Attention Required! | Cloudflare

先ほど結果をお見せしたブレイクダンスをしている動画あたりがわかりやすいと思いますが、他のサンプルを試したい場合はそちらでも構いません

おそらく体の全体が写っている方が精度は良いと思います

Anacondaで作業環境を作成

下記作業は必須ではありませんが、環境を分けて管理した方がライブラリとかの管理がしやすいです

$ conda create -n hrnet python==3.7 anaconda

HRNetによる姿勢推定

インストール手順

今回は下記のgithubを使用します

stefanopini/simple-HRNet
Multi-person Human Pose Estimation with HRNet in Pytorch - stefanopini/simple-HRNet

ちなみに今回は使用しませんが論文の著者の元のgithubはこちらになります

HRNet/HigherHRNet-Human-Pose-Estimation
This is an official implementation of our CVPR 2020 paper "HigherHRNet: Scale-Aware Representation Learning for Bottom-Up Human Pose Estimation" ( - H...

適当なディレクトリにて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をダウンロードしてください

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について下記の書籍に解説とコードが載っています

コメント

Copied title and URL