Windows 10でMediaPipeで遊ぶ(VSCodeを添えて)
GitHubに、google/mediapipeというレポジトリがあります。
今回初めて知ったのですが、Google製の物体認識関係のエンジンで、AndroidやiOSを含む、多くのデバイスで共通で動かせるとのこと。以前は物体認識としてYOLOv3で遊んだのですが、こちらは物体認識以外にもPose Estimation(ポーズの推測)ほかいろいろな機能があり、特に実用性の高そうな人の動きを認識させることが可能です。手の動きを認識する機能にちょっと興味がでたので、今回はこれを動かします。
これ自体は「チュートリアル動かしてみた」程度のことなのですが、Visual Studio Codeから動かせるようにするのに少し苦労したので環境構築部分のメモを残しておきます。
Python 3.9環境を作成
Windows環境のPythonでは、普段はAnacondaを使っているのですが、今回はまともにMediaPipeを動かすことができませんでした。試行錯誤の結果Windows StoreにあるPython 3.9で動かしています。多分だけれど、Anacondaにデフォルトで入っているOpenCV2や他の類似のエンジンと、どこかでモジュール名がかぶっているのかもしれません。
ざっくり下のような手順で、まっさらなPython環境を作りました。
C:\Users\windv>cd Python3.9_MediaPipe
C:\Users\windv\Python3.9_MediaPipe>python -m venv mp_env python=3.9
C:\Users\windv\Python3.9_MediaPipe>.\mp_env\Scripts\activate
(mp_env) C:\Users\windv\Python3.9_MediaPipe>python -V
Python 3.9.5
(mp_env) C:\Users\windv\Python3.9_MediaPipe>
(mp_env) C:\Users\windv\Python3.9_MediaPipe>pip install mediapipe
VSCodeから利用
このあと、ソースフォルダを作成してそこをVSCodeで開きます。
そしてPythonのスクリプトをなにか作成して、その状態でターミナルを開き、ターミナルの種類をPowershellに変更、さらにVSCode上でCtrl+Shift+Pで「Python: Select Interpreter」を選びます。
そのあとvenvにあるpython.exeのある場所を指定すればOKでした。
(おまけ)サンプル動きました。
USBカメラ(解像度はそれほど高くない、安いもので十分)、をつなぎ、下のMediaPipe Handsサンプルを動かしました。
import cv2 import mediapipe as mp mp_drawing = mp.solutions.drawing_utils mp_hands = mp.solutions.hands drawing_styles = mp.solutions.drawing_styles # For webcam input: cap = cv2.VideoCapture(0) with mp_hands.Hands( min_detection_confidence=0.5, min_tracking_confidence=0.5) as hands: while cap.isOpened(): success, image = cap.read() if not success: print("Ignoring empty camera frame.") # If loading a video, use 'break' instead of 'continue'. continue # Flip the image horizontally for a later selfie-view display, and convert # the BGR image to RGB. image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB) # To improve performance, optionally mark the image as not writeable to # pass by reference. image.flags.writeable = False results = hands.process(image) # Draw the hand annotations on the image. image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: mp_drawing.draw_landmarks( image, hand_landmarks, mp_hands.HAND_CONNECTIONS, drawing_styles.get_default_hand_landmark_style(), drawing_styles.get_default_hand_connection_style()) cv2.imshow('MediaPipe Hands', image) # ESCキーで終了 if cv2.waitKey(5) & 0xFF == 27: break cap.release()
まだ最初の一歩だけなのですが、YouTubeの動画と連携する機能があったりして、なにかおもしろい遊びができるかもしれません。