CPUだけで顔・手・ポーズのリアルタイム検出を行う

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回目以降)は、既にあるフォルダーを一旦削除してから処理を開始します。

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

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

 顔と手は、かなり細かい検出がされていることが分かります。写っている範囲が狭いので、ポーズは肩の線のみ見えています。

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

5 件のコメント

  • %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 する時のディレクトリという意味です。分かり難くてすみません。

  • コメントを残す

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

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

    ABOUTこの記事をかいた人

    アバター

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