見出し画像

映画 『THE FIRST SLAM DUNK』でも使われていたモーションキャプチャは個人では難しいので代わりにOpenPoseを試してみる

こんにちは。すうちです。

先日、映画『THE FIRST SLAM DUNK』の感想を書きました。

個人的に観終わった後の満足度は高かったです。上記で少し触れましたが、映画では人間のリアルな動きを再現するためモーションキャプチャの技術が使われていました。

モーションキャプチャの一般的な方法は、身体に高精度なセンサを着けて、何台もカメラを使って様々な角度から撮影する等、専用の設備が必要で個人で気軽に試せる代物ではないです。

自宅で何か近いことを試せないかと考えてた所、OpenPoseならできそうと思い出しました。

今回は、そんなOpenPose(姿勢推定のアルゴリズム)に関する話です。


はじめに

OpenPoseとは

入力画像に対する人間の各部位(肩、肘、手首、腰など:計18個)を推定して、それらを線(計37個)で結び人間の動きを再現する技術です。よく姿勢推定とか骨格推定のアルゴリズムとして紹介されています。

https://cmu-perceptual-computing-lab.github.io/openpose/web/html/doc/index.html
テスト画像から引用

広い意味では前述のモーションキャプチャのビデオ式の分類に含まれるかもしれません。

また最近では、防犯カメラの映像と連動して、不審な動きや体調悪い人を検知する目的でも利用されていると聞きます。


GitHub /OpenPose(オリジナル)

https://github.com/CMU-Perceptual-Computing-Lab/openpose

オリジナルのカーネギーメロン大学の実装はGitHubに公開されていますが、商用利用は有償など条件があり、使う場合はライセンスに注意必要です。


OpenPose技術(概略)

ここではOpenPoseの概略のみ紹介します。技術的な詳細は他でも多く説明されているので、興味ある方はそちらも参照頂ければと思います。

ざっくりAIの仕組み

OpenPoseの前にざっくりAIの仕組みのおさらいです。
教科書では、AIのモデルを以下で単純化した表記があります。

Y=WX+b
(Y:出力, X:入力, W:重み, b:バイアス)

AIの学習は「ある入力Xに対して出力Yが期待値になるようにWbを調整する」ことです(実際は何層にも渡ってWbを調整するので、パラメータ数も多くかなり複雑ですが…)。

OpenPoseでいうと検出の期待値である人間の各部位(肩、肘、手首、腰など)をマーキングした画像を入力の正解画像として学ばせます。その意味では、モーションキャプチャ検出の仕組みと基本的に同じですね。


余談ですが、以前書いたAIの学習(概要)の記事です。もしご興味あればこちらも参照頂ければと思います。


各部位の推定(分類)

画像に存在する物体を画素単位でその形や範囲を推定(分類)する方法で、セマンティック・セグメンテーションというものがあります。

例えば、人物のラベルを’1’、人物以外を’0’で学習した場合、画像の人物とそれ以外の領域を以下のように画素単位で分類した結果が出力されます。

セマンティック・セグメンテーション適用例

OpenPoseも基本はこれと同じ仕組みを使っているようです。前述の学習から画像における人間の各部位(肩、肘、手首、腰など)を検出してこれらをHeatmapの形で出力します。


肘検出のHeatmap画像
手首検出のHeatmap画像

Heatmapで出力するのは、検出対象の座標1点のみとすると座標が1画素ずれても不正解となるので、座標ピークをガウス分布で扱い検出幅に余裕を持たせる(誤差を許容する)ことが目的のようです。


各部位の接続(リンク)

検出された各部位はPAFs(Part Affinity Fields)というアルゴリズムを使って、ベクトル計算から確からしい予測に基づき各部位を線でつなぎます(なので間違いもある)。

肘と手首をつないだPAFS画像

ただ、PAFsについては私も正直細かい所までは理解できてません(そういうことやっているんだな程度の理解です…)

これら各部位を全て線で繋ぎ、後述の人の姿勢を表した画像が作られます。


事前準備(前提条件)

今回OpenPoseを試すに辺り、モデル(書籍)は以下参考にしました。

モデル

pytorch_advanced/4_pose_estimation at master · YutaroOgawa/pytorch_advanced · GitHub

こちらは本家のカーネギーメロン大学の実装ではなく、論文を元に独自実装されたGitHub - tensorboy/pytorch_Realtime_Multi-Person_Pose_Estimationを参考にしてるようです(後述の学習済み重みパラメータ含む)。


関連書籍

本書は以前AIの基礎を学んでた頃に購入しました。技術的な理論から実装の詳細まで平易な文章で解説が詳しいので、AI初心者にも比較的読みやすくおススメです。


動作テスト(実装)

今回はOpenPoseを試すのが目的だったので、モデルの学習はスキップして代わりに学習済の重みパラメータ(.ptn)を使いました。

その他、基本的にモデルの実装部分はそのまま使って、今回の目的にあわせてデータの入出力(動画や静止画データ取り込み、出力された画像を再構成する)のみ実装しました。


使用素材(写真や動画)

今回使わせて頂いた写真や動画は、Pexelsの素材です。

Pexels

無料の写真素材と動画のライセンス - Pexels

Pexelsは全ての写真や動画は無料でダウンロード可で商用利用OK(※)とのことです。※ただし、投稿者の尊厳を害するような利用は禁止


実際にOpenPoseを試してみる


静止画の例

まずは、静止画からです。

元画像

https://www.pexels.com/ja-jp/photo/7955065/

OpenPose適用後

左手の方は服で隠れてる所もありますが、手首までラインで繋げています。右手(オレンジの線)の方は間違ってますね。


元画像

https://www.pexels.com/ja-jp/photo/6944802/

OpenPose適用後

こちらは身体全体がはっきり見えているためか、全ての姿勢推定のラインは上手くいっているように見えます。


動画の例(今回試したかったこと)

バスケットの動画にOpenPoseを適用してみました。動きに合わせて姿勢推定されていることがわかります。

元画像

PexelsでのPavel Danilyukによる動画

元画像(1/4リサイズ)


OpenPose適用後

最初後ろ向きでは顔(目、鼻、耳)の検出は当然ありませんが、後半振り返って顔が見えた辺りから、ちゃんと検出できています(すごい…)。


モーションキャプチャ、個人で試せる時代でした…

モーションキャプチャOpenPoseの記事を書くにあたり、個人的に調べていたら今年Sonyからモバイルモーションキャプチャなるものが発売されたようです。

6つのセンサを身体に着けて、ワイヤレスイヤホンと同様にBluetoothで(最初のみ)ペアリング後は動きを検出可能。価格は約5万円でスマホに専用アプリを入れて使うようです(個人のアバターやVTuber等の利用想定!?)。

センサが6つなので、細かい動作やゆっくりした動きの追従性がよくないとの意見もあるようですが、自宅でモーションキャプチャが使えるとは驚きです。今後一般にも普及していく可能性もあるのかなと思いました。

記事書いた後知りましたが、個人でもモーションキャプチャを試せる時代になってました。。。


最後に

前回の投稿から抜粋です。

大迫力でリアルなバスケシーン
とにかく映像がキレイなのと人物の動きがリアルです。特にバスケシーンは本物の試合を見てるような臨場感がありました。

複数人が激しく動く場面は、手書きは相当大変だろうなと思ってましたが、少し調べた所、最近映画でもよく使われるモーションキャプチャCGの技術を取り入れているようです。

今回半分以上は、バスケットシーンでOpenPoseを試したくて本記事を書きました…笑

映画『THE FIRST SLAM DUNK』は登場人物の花道流川リョータ役の方々(多分バスケ熟練者)がいて、実際バスケの試合シーンをもっと本格的なモーションキャプチャで取り込んで映像が作られていると想像します。

IT技術が日常の生活や映画にも適用されていることを知ると、少し視点も変わって、あらためて興味深いなと感じました。

最後まで読んで頂き、ありがとうございました。

いいなと思ったら応援しよう!