Translate

【初心者向け】とりあえずmediapipeを動かして座標データを取り出すところまでやってみた

 こんにちは

google から出させているmediapipeと呼ばれるパッケージが結構面白いので動かしてみました。

mediapipeは、googleから出させているパッケージの一つで、映像データから身体の関節表点の位置や手の形状、顔の形状を検出することができるものです。

人の動きが簡単に取得できるので、いろいろと使えそうですね。OpenPoseとかみたいなやつだと自分でいろいろとCUDAの設定をしたりだの、いろんなパッケージを入れないといけないこともあったりするので煩雑なのですが、こちらのmediapipeは非常に簡単に実装することが可能です。

今回はとりあえず動画データを読み込んでpythonを使ってmediapipeを動かして関節表点を取り出す所までのコードを紹介したいと思います。間違いとかあったらすみません。

mediapipeのインストール



mediapipeは他のpythonのパッケージと同じようにanacondaからパッケージをインストールすることによって使うことができます。

普段の例のごとく、anaconda promptを開いて「pip install mediapipe」とコマンドをたたくことによってmediapipeを自身のpythonにインストールすることができます。 

mediapipeを動かすpythonコード

#必要なパッケージのインポート
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose
import numpy as np
mp_drawing = mp.solutions.drawing_utils
mp_holistic = mp.solutions.holistic

data_land = np.zeros((0,99))
# stream mp4 file
cap = cv2.VideoCapture('_____.mp4')#load mp4 file
with mp_holistic.Holistic(
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5) as holistic:
  while cap.isOpened():
    success, image = cap.read()
    if not success:
      print("Ignoring empty camera frame.")
      break


    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

    image.flags.writeable = False
    results = holistic.process(image)
    

    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

    mp_drawing.draw_landmarks(
        image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
    mp_drawing.draw_landmarks(
        image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
    mp_drawing.draw_landmarks(
        image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS)
    
    #get coordinate
    data_land2 = np.zeros((1,3))
    
    for x in range (0,33):
        data1 = results.pose_landmarks.landmark[x].x
        data2 = results.pose_landmarks.landmark[x].y
        data3 = results.pose_landmarks.landmark[x].z
        keydata = np.hstack((data1,data2,data3)).reshape(1,-1)
        data_land2 = np.hstack((data_land2,keydata))

    data_land2 = data_land2[:,3:]
    data_land = np.vstack((data_land,data_land2))
    cv2.imshow('MediaPipe Holistic', image)
    if cv2.waitKey(5) & 0xFF == 27:
      break
cap.release()

np.savetxt('keypoint_results.csv',data_land,delimiter = ',')


実際に書くとこんな感じのコードになります。前半部分はほとんど公式HPのサンプルコードのままです。mp4ファイルをロードする行の所を、お手持ちのmp4ファイル名に変えて、該当のmp4ファイルを同じディレクトリにおいてあげれば動きます。

ただし、このコードの問題点が残っていて、画面内に人物が映っていない区間があると、人物が映っていないということで途中で止まってしまいますので御注意。あくまで止まるのは、関節表点を記録する部分なので、そこの部分をコメント化(#get coordinate~data_land = np.vstack((data_land,data_land2)))してやれば、形状検出された動画に重ね書きされた動画は出力されます。

今回の関節表点は、身体各所33か所のXYZ座標をcsvファイルで出力されるように作っています。各表点は公式の順番通りなので、そちらを参照してもらえると幸いです。

mediapipe公式のサンプルコードもわかりやすく、短いコードで記述できるため非常に良いですね。

mediapipeを使ったより実践的なpythonスクリプトについてはこちらになりますので、特に理学療法士で研究をやったり、動画データを使って評価をしてみたいという人にはお勧めとなっております。