cedro-blog

MediaPipeで、顔・手・ポーズのリアルタイム検出を行う

1.はじめに

 ちょっと前まで、顔・手・ポーズのリアルタイム検出をしようと思ったら高性能なGPUを積んだPCが必要でしたが、今回はこれらをCPUだけでも行える MediaPipe をご紹介します。

2.MediaPipeとは?

 MediaPipieは、Googleが提供しているライブメディアやストリーミングメディア向けのMLソリューションで、以下の特徴があります。

 現在、4つのプラットフォームで、15種類のソリューションを提供されています。今回はその中から、Pythonプラットフォームの、顔検出、手検出、ポーズ検出、ホリスティック検出(顔・手・ポーズの統合検出)についてご紹介します。

3.コード(動画から検出)

 最初のデモはオジサンより、女優やダンサーの方が見ていて楽しいと思うので、あえて動画からホリスティック検出(顔・手・ポーズの統合検出)をやってみます。

 コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。なお、GPUは使っていません。

 まず、セットアップを行います。

 

 次に、video で指定した動画を読み込み静止画に分解し、framesフォルダ に保管します。既に frames フォルダがある場合(2回目以降)は、既にあるフォルダを一旦削除してから処理を開始します。ここでは、video = satomi.mp4 を指定しています。

 ご自分の動画を使いたい場合は、その動画をPCから videoフォルダにドラッグ&ドロップでアップロードして下さい。

fps = 30.0
frames = 106
interval = 1

 読み込んだ動画の最初のフレームのみを表示しています。

 そして、MediaPipeを使って、frames フォルダの中にある静止画から顔・手・ポーズを検出し、結果を images フォルダに保管して行きます。既に images フォルダがある場合(2回目以降)は、既にあるフォルダを一旦削除してから処理を開始します。

 

 最後に、images フォルダの中にある検出結果を読み込んでmp4動画を作成します。このとき、with_sound チェックボックスにチェックを入れておくと、元動画の音声を検出動画に付加します。元動画に音声が付いていない場合にチェックを入れるとエラーになりますので、ご注意下さい。

 顔と手は、かなり細かい検出がされていることが分かります。写っている範囲が狭いので、ポーズは肩の線のみ見えています。作成したmp4動画は、下記を実行するとダウンロードできます。

 

ビデオ指定のところを、video = mana.mp4 に変更して、それ以降のコードを実行すると、

 上半身が写ると、ポーズも検出していることが分かります。シングルパーソン用のため、より大きく写っている人物を優先して検出するので、後ろの男性は検出されません。

 ビデオ指定のところを、video = dance.mp4 に変更して、それ以降のコードを実行すると、

 全身を写した場合の検出例です。一時的に右手の検出が外れますが、まずまずではないでしょうか。

4.コード(PCのカメラから検出)

※ご注意

 以下のコードは、google colabでは動作しません。ご自分のPCに、このリンクを参考にJupyter Notebookをインストールして実行して下さい。また、Git(コードをコピーするライブラリー)をインストールしてなければ、このリンクを参考に合わせてインストールして下さい。

 いよいよ、メインのリアルタイム検出です。カメラ付きのPCで Jupyter Nootbook を開いて、適当なフォルダーに移動し、下記のコードを実行します。GPUは不要です。

 ホリスティック検出(顔・手・ポーズの統合検出)をする場合は、下記のコードを実行するだけです。左上にFPSが表示されています。私のPCは3年前に買った MacbookAir ですが、それでも10FPSくらい出ます。凄い!

 顔の検出をする場合は、下記のコードを実行します。顔だけだと、20〜30FPSくらいでしょうか。

 手の検出をする場合は、下記のコードを実行します。手だけだと、15FPSくらいでしょうか。

 ポーズの検出をする場合は、下記のコードを実行します。ポーズだけだと、15FPSくらいでしょうか。

 MediaPipeの狙いはエッジデバイスでの検出です。特に、スマホで、顔・手・ポーズなどの検出を使って色々な応用が出来そうですね。

 では、また。

(Googleオリジナル) https://mediapipe.dev/index.html

(Githubオリジナル)https://github.com/Kazuhito00/mediapipe-python-sample

(Twitter投稿)