サバくん
今流行りの深層学習!!深層学習を用いた姿勢の推定を行うライブラリの1つである「MediaPipe」をPythonを使って実行する方法を記述します。具体的な流れは以下の通り
モジュールのインストール
Macであればターミナルを使います。
モジュールのimport
ここからはJupyterLabを使用します。
MediaPipeの実行
目次
まずはターミナルを開いてモジュールをインストールしましょう!
まずはMediaPipeのインストールです。
pip install mediapipe
次にOpenCVのインストール
pip install opencv-contrib-python
インストールが終わったら確認してみましょう。
pip list
次にJupyterLabを開いて必要なモジュールをimportしましょう。
import mediapipe as mp
import cv2
最後に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
で出力することができます。座標から角度を算出したい場合は利用してください。
ちなみにこの数値がどのような順番で並んでいるかは
[(i, mp_holistic.PoseLandmark(i).name) for i in range(len(mp_holistic.PoseLandmark))]))]
で確認することができます。