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は使っていません。

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

 

 次に、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投稿)

18 件のコメント

  • %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です。

  • こんにちはこんばんは、このエラーが発生します。
    私はすでにargparseをpycharm1.4を含む最新バージョンに更新しました、そしてそれは出続けます、私は何ができますか?

    ファイル “C:\ Users \ JUnty \ Desktop \ Tska \ RULA \ Holistic.py”、58行目、メイン
    holistic = mp_holistic.Holistic(
    TypeError:__ init __()が予期しないキーワード引数 ‘upper_body_only’を取得しました

    • Linaさん
      ご連絡ありがとうございます。
      Mediapipeがアップデートされ、今まで使われていた引数が使われなくなりエラーが発生していました。助かりました。
      コードは修正済みですので、もう一度使ってみて下さい。

  • 自分で撮った動画でキャプション出来るかをgoogle colaboで試してみました。mediapipe/imageに動画のpngが出来ていることは確認できましたが、そのあとに次のエラーが出ます。何かお判りでしょうか?上のコメントと同じようにMediapipeのアップデートでしょうか?cedroさんがForkされていても影響を受けるのでしょうか?
    AttributeError Traceback (most recent call last)
    in ()
    23 image=annotated_image,
    24 landmark_list=results.face_landmarks,
    —> 25 connections=mp_holistic.FACE_CONNECTIONS,
    26 landmark_drawing_spec=drawing_spec,
    27 connection_drawing_spec=drawing_spec)

    AttributeError: module ‘mediapipe.python.solutions.holistic’ has no attribute ‘FACE_CONNECTIONS’

    • bravoastroさん
      こんにちは。
      お察しの通り、Mediapipeがアップデートされて、当初のままではエラーが発生していたのでgithub(google colab含む)の一部をアップデートしました。
      再度、ブログのリンクから飛んで下さい。

  • cedro様

    お世話になります。
    Jupyter Notebookにて、
    # MediaPipeをインストール
    !pip install mediapipe
    # Gitgub からコードをコピー
    !git clone https://github.com/cedro3/mediapipe.git
    %cd mediapipe/
    を実行し、mediapipeのファイルがインストールされております。次に
    !python sample_holistic.py
    を実行しますと、
    Traceback (most recent call last):
    File “sample_holistic.py”, line 6, in
    import cv2 as cv
    ModuleNotFoundError: No module named ‘cv2’
    というエラーが表示されます。
    これは、
    !python sample_hand.py
    !python sample_pose.py
    でも同じエラーメッセージが出てまいります。
    どのように対処すれば良いかをお教えいただけませんでしょうか?
    よろしくお願いいたします。

  • cedro様
    お世話になります。OpenCVをJupyter Notebookにインストールできていませんでした。やってみます。ご指導ありがとうございました。

  • コメントを残す

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

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

    ABOUTこの記事をかいた人

    アバター

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