pythonのインストール確認

MediaPipeのインストール前に、以下の手順でpythonがちゃんと入っているかどうか確認します。

  • Windowsキーを押しながら「R」キーを押し、「ファイル名を指定して実行」のウィンドウを出す。
  • 「cmd」と入力、Enter、コマンドラインを起動する。
  • 「python -V」と入力。(Vは大文字)

バージョン名が表示されればpythonは無事インストールされています。

venvの利用

そのままOpenCVとMediaPipeを入れても良いですが、ライブラリをインストールする環境を分けたい場合はvenvを使うと良いでしょう。もちろんそのまま次のセクションへ行っても構いません。具体的な手順は以下です。

  • Win+r, cmdで起動されるコマンドラインはカレントディレクトリがユーザーディレクトリなので、その下に「…\python\venv\」というディレクトリを作り、仮想環境を利用する。
    • 「mkdir python」「cd python」—>pythonディレクトリへ移動。
    • 「mkdir venv」「cd venv」 —>更にその下にvenvディレクトリを作って移動。
  • そこで「python -m venv .\Mediapipe」
  • 「.\Mediapipe\Scripts\Activate」 —>仮想環境を実行。

コマンドラインではTabキーによる補完機能を利用しましょう。例えば
「Win+r, cmd, cd py(Tab), \, v(Tab), (Enter)」「m(Tab), \, s(Tab), \, a(Tab), (Enter)」…という具合です。

OpenCVとMediaPipeのインストール

画像処理ライブラリのOpenCVとAIライブラリのMediaPipeを入れます。ネットワークの通信速度が十分あれば、あっさり終わります。

  • 「pip install opencv-python」と入力、OpenCVをインストール。
  • 「pip install mediapipe」と入力、MediaPipeをインストール。
  • もちろん「pip install opencv-python mediapipe」と一度に入れても構いません。

動作確認とエラー修正など

pythonをインタラクティブモードで起動して、

  • import cv2
  • import mediapipe

と打ち込んでエラーが出なければOKです。もしMediaPipeに関して、Protobufについてのエラーが出たら、

  • pip install –upgrade protobuf==3.20.0

と打ち込んでバージョンを揃えます。(まっさらなWindows11で試したら上記エラーが出ました。)

サンプルプログラムの実行

公式ページのサンプルを抜粋したものを以下に記します。コマンドプロンプトからメモ帳を起動して、コピペして、保存して、実行しましょう。

  • Win+r、cmd、コマンドプロンプトを起動して適当なディレクトリに移動。
  • notepad mediapipe_test.py と打ち込んで「新しく作成しますか?」に「はい」と答える。
  • サンプルをコピペして保存。Shiftキーとクリックなどで適宜選択して、Ctrl+c、Ctrl+v、Ctrl+s。
  • もしvenvを使って仮想環境を構築している人で上記インストール作業と、このサンプルプログラムの実行の間が開いてしまった人はここで
    「….\python\venv\Mediapipe\Scripts\Activate」 の実行を忘れずに。
  • 準備ができたらmediapipe_test.pyのファイルの見えるディレクトリで
    python mediapipe_test.py を実行します。
  • ちなみにコマンドプロンプトで「start .(ピリオド)」とするとカレントディレクトリをエクスプローラで開いてくれますので、GUIでファイル操作した方が楽な方はエクスプローラでやりましょう。

サンプルコードは単にスケルトン描画してくれるだけですが、2011年~あたりのKinectとかの時代を知っている人は「こ、こんなに簡単に!?」と驚きます。時代ですねぇ。

poseのサンプルコード抜粋

import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose

# For webcam input:
cap = cv2.VideoCapture(0)
with mp_pose.Pose(
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5) as pose:
  while cap.isOpened():
    success, image = cap.read()
    if not success:
      print("Ignoring empty camera frame.")
      continue
    image.flags.writeable = False
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    results = pose.process(image)

    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    mp_drawing.draw_landmarks(
        image,
        results.pose_landmarks,
        mp_pose.POSE_CONNECTIONS,
        landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style())
    # Flip the image horizontally for a selfie-view display.
    cv2.imshow('MediaPipe Pose', cv2.flip(image, 1))
    if cv2.waitKey(5) & 0xFF == 27:
      break
cap.release()

人体モデルを検出するposeの場合は、以下のように配列の番号が決まっているみたいです。公式ページより抜粋。

FaceMeshのサンプルコード抜粋

ついでにFaceMeshのカメラ入力用の部分だけを以下に記します。ESCキーで終了します。

import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_face_mesh = mp.solutions.face_mesh

drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)
cap = cv2.VideoCapture(0)
with mp_face_mesh.FaceMesh(
    max_num_faces=1,
    refine_landmarks=True,
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5) as face_mesh:
  while cap.isOpened():
    success, image = cap.read()
    if not success:
      print("Ignoring empty camera frame.")
      continue

    image.flags.writeable = False
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    results = face_mesh.process(image)

    # Draw the face mesh annotations on the image.
    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    if results.multi_face_landmarks:
      for face_landmarks in results.multi_face_landmarks:
        mp_drawing.draw_landmarks(
            image=image,
            landmark_list=face_landmarks,
            connections=mp_face_mesh.FACEMESH_TESSELATION,
            landmark_drawing_spec=None,
            connection_drawing_spec=mp_drawing_styles
            .get_default_face_mesh_tesselation_style())
        mp_drawing.draw_landmarks(
            image=image,
            landmark_list=face_landmarks,
            connections=mp_face_mesh.FACEMESH_CONTOURS,
            landmark_drawing_spec=None,
            connection_drawing_spec=mp_drawing_styles
            .get_default_face_mesh_contours_style())
        mp_drawing.draw_landmarks(
            image=image,
            landmark_list=face_landmarks,
            connections=mp_face_mesh.FACEMESH_IRISES,
            landmark_drawing_spec=None,
            connection_drawing_spec=mp_drawing_styles
            .get_default_face_mesh_iris_connections_style())
    cv2.imshow('MediaPipe Face Mesh', cv2.flip(image, 1))
    if cv2.waitKey(5) & 0xFF == 27:
      break
cap.release()