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

1.はじめに

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

2.MediaPipeとは?

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

  • 高速なエンドツーエンド処理一般的なハードウェアでも高速化されたML推論と処理を実現
  • 様々なプラットフォームで使用可能Android、iOS、C++、Pythonに対応
  • 無料のオープンソース Apache 2.0で、拡張やカスタマイズが可能

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

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

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

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

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

 

 次に、サンプル動画を読み込み静止画に分解し、imagesフォルダーに保管します。既にimages フォルダーがある場合(2回目以降)は、既にあるフォルダーを一旦削除してから処理を開始します。

 ご自分の動画を使いたい場合は、その動画をPCから./mediappipe/video にドラッグ&ドロップでアップロードし、video_path = ‘./video/***.mp4 の***.mp4 をご自分で用意されたファイル名に変更すればOKです。

 そして、MediaPipeを使って、images フォルダーの中にある静止画から顔・手・ポーズを検出し、結果を上書きして行きます。

 最後に、images フォルダーの中にある検出結果を読み込んでmp4動画を作成します。

 顔と手は、かなり細かい検出がされていることが分かります。写っている範囲が狭いので、ポーズは肩の線のみ見えています。作成したmp4動画は、左側のファイル欄にある ./mediapipe/output.mp4 を右クリックするとダウンロードできます。

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

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

 ビデオ指定のところを、video_path = ‘./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投稿)

11 件のコメント

  • %cd mediapipe/ の後、!python sample_holistic.py
    を実行したが、何も表示されません。他の3つも同じです。webカメラのライトが正常なら2つ点灯するのですが、最初から点灯している1つしか点灯していません。

    • bravoastroさん
      コメントありがとうございます。
      詳しい状況を知りたいので、下記3点教えて下さい。

      1)下記を実行した時に、返って来るコメントを教えて下さい。
      ————
      # MediaPipeをインストール
      !pip install mediapipe 
      # Gitgub からコードをコピー
      !git clone https://github.com/cedro3/mediapipe.git
      %cd mediapipe/
      ————

      2)下記を実行した時に、返って来るコメントを教えて下さい。
      ——-
      !python sample_holistic.py
      ——-

      3)ご自分で設定したフォルダーの中に、mediapipeというファルダーは出来ていますでしょうか。

      • !python sample_holistic.py を実行した時のメッセージを次に示します。
        [ WARN:0] global /io/opencv/modules/videoio/src/cap_v4l.cpp (802) open VIDEOIO ERROR: V4L: can’t open camera by index 0
        INFO: Created TensorFlow Lite XNNPACK delegate for CPU.

        また、「自分で設定したフォルダー」と言う意味が分かりません。%cd mediapipe を実行しても何のエラーも出ないので出来ているのではないでしょうか?

        • bravoastro さん

          ご連絡ありがとうございます。
          !python sample_holistic.py を実行した時のメッセージを拝見しますと、google colabで動かそうとされている様です。このコードは、google colabでは動作しません。

          ブログにあります様に、リンク(https://qiita.com/tttamaki/items/0d4fc01c10dd40a13552)をご覧頂き、PCにJupyter Notebook をインストールして実行して下さい。
          また、Git(コードをコピーするライブラリー)をインストールしてなければ、このリンク(https://qiita.com/libra219/items/e49f9cc833ad9bb5d1ca)を参考に合わせてインストールして下さい。

          *「自分で設定したフォルダー」というは、!git clone する時のディレクトリという意味です。分かり難くてすみません。

  • cedro様

    姿勢推定について最近調べ始めたAIも全く分からない素人です。
    今週になってCOLAB等で姿勢推定が比較的簡単にできることを知りました。

    さて、拝見したコードをそのままコピペして試していますが、MP4を自分で用意したものに変えて動かしてみたいのですが、ファイルをPCのどこに保存すればよいのか分かりません。

    # ビデオの指定
    video_path = ‘./video/satomi.mp4’

    この部分を変更すればよいと記載があるものの、実際にファイルをPCのどこに格納すればよいかが分かりません。

    ご教示賜れますでしょうか。
    よろしくお願いいたします。

    • ! python sample_holistic.py
      を使おうと思ったとき
      Traceback (most recent call last):
      File “sample_holistic.py”, line 662, in
      main()
      File “sample_holistic.py”, line 58, in main
      holistic = mp_holistic.Holistic(
      TypeError: __init__() got an unexpected keyword argument ‘upper_body_only’
      [ WARN:0] global C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-k1ohfcms\opencv\modules\videoio\src\cap_msmf.cpp (438) `anonymous-namespace’::SourceReaderCB::~SourceReaderCB terminating async callback
      というエラーがおきました。
      upper_body_onlyが必要ないhand.pyのみうまくいきましたが、それ以外はこのエラーが起きてしまいます。
      理由などが分かれば返信よろしくお願いいたします。

      • 諸橋さん
        コメントありがとうございます。
        先ほど、こちらでも試してみましたがご連絡頂いたエラーが再現しません。
        ライブラリーの何かのバージョンが古いせいかもしれませんね。
        試しに、argparse のバージョンをアップデートしてみて下さい。

    • G3さん

      コメントありがとうございます。
      ブログにあるcolabリンクをお使いですよね。
      その場合は、ご自分で用意されたmp4動画を、PCからドラッグ&ドロップで、./mediapipe/video フォルダーにアップロードして下さい。あとは、video_path = ‘./video/***.mp4 の***.mp4 をご自分で用意されたファイル名に変更すればOKです。

  • g3 へ返信する コメントをキャンセル

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

    ABOUTこの記事をかいた人

    アバター

    ディープラーニング・エンジニアを趣味でやってます。E資格ホルダー。 好きなものは、膨大な凡ショットから生まれる奇跡の1枚、右肩上がりのワクワク感、暑い国の新たな価値観、何もしない南の島、コード通りに動くチップ、完璧なハーモニー、仲間とのバンド演奏、数えきれない流れ星。