まずはこちらをクリック!

MediaPipe(python)

サバくん
サバくん

今流行りの深層学習!!深層学習を用いた姿勢の推定を行うライブラリの1つである「MediaPipe」をPythonを使って実行する方法を記述します。具体的な流れは以下の通り

モジュールのインストール

Macであればターミナルを使います。

モジュールのimport

ここからはJupyterLabを使用します。

MediaPipeの実行

モジュールのインストール

まずはターミナルを開いてモジュールをインストールしましょう!

まずはMediaPipeのインストールです。

pip install mediapipe

次にOpenCVのインストール

pip install opencv-contrib-python
重複に注意

インストールが重複するとエラーが出てくることがあります。「pip uninstall 〇〇」でアンインストールできるので、うまく利用してください。

インストールが終わったら確認してみましょう。

pip list

モジュールのimport

次にJupyterLabを開いて必要なモジュールをimportしましょう。

import mediapipe as mp
import cv2

MediaPipeの実行

最後にMediaPipeを実行しましょう。

mp_drawing = mp.solutions.drawing_utils
mp_holistic = mp.solutions.holistic
cap = cv2.VideoCapture(0)
with mp_holistic.Holistic(min_detection_confidence=.5, min_tracking_confidence=.5) as holistic:

    while cap.isOpened():
        ret, frame = cap.read()

        image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) #BGRからRGBに変換
        
        results = holistic.process(image) # 検出
   
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # RGBからBGRに変換
        
        # 顔
        mp_drawing.draw_landmarks(image, results.face_landmarks, mp_holistic.FACEMESH_CONTOURS,
                                 mp_drawing.DrawingSpec(color=(255,0,0), thickness=2, circle_radius=1),
                                 mp_drawing.DrawingSpec(color=(255,255,255), thickness=2, circle_radius=1)
                                 )
        
        # 右手
        mp_drawing.draw_landmarks(image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS,
                                 mp_drawing.DrawingSpec(color=(255,0,0), thickness=2, circle_radius=1),
                                 mp_drawing.DrawingSpec(color=(255,255,255), thickness=2, circle_radius=1)
                                 )
        
        # 左手
        mp_drawing.draw_landmarks(image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS,
                                 mp_drawing.DrawingSpec(color=(255,0,0), thickness=2, circle_radius=1),
                                 mp_drawing.DrawingSpec(color=(255,255,255), thickness=2, circle_radius=1)
                                 )
        
        # 姿勢
        mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS,
                                 mp_drawing.DrawingSpec(color=(255,0,0), thickness=2, circle_radius=1),
                                 mp_drawing.DrawingSpec(color=(255,255,255), thickness=2, circle_radius=1)
                                 )
        
        cv2.imshow("Holistic Model Detections", image)

        # qを押したら終了する
        if cv2.waitKey(10) & 0xFF == ord("q"):
            break
            
cap.release()
cv2.destroyAllWindows()

出力結果がこちら

思ったよりも綺麗で滑らかに出力されています。qを押しても止まらないときはアイコンを右クリックして「強制終了しましょう」

データの出力

画像中の座標が知りたい場合は

results.pose_landmarks.landmark

で出力することができます。座標から角度を算出したい場合は利用してください。

MediaPipeの座標

出力された座標は0から1に標準化されています。実際の座標が欲しい場合は画像のサイズとの積を出力する必要があります。

ちなみにこの数値がどのような順番で並んでいるかは

[(i, mp_holistic.PoseLandmark(i).name) for i in range(len(mp_holistic.PoseLandmark))]))]

で確認することができます。

コメントを残す

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

CAPTCHA