日記とか、工作記録とか

自分に書けることを何でも書いてゆきます。作った物、買ったもの、コンピュータ系の話題が多くなるかもしれません。

Windows 10でMediaPipeで遊ぶ(VSCodeを添えて)

GitHubに、google/mediapipeというレポジトリがあります。

github.com

今回初めて知ったのですが、Google製の物体認識関係のエンジンで、AndroidiOSを含む、多くのデバイスで共通で動かせるとのこと。以前は物体認識としてYOLOv3で遊んだのですが、こちらは物体認識以外にもPose Estimation(ポーズの推測)ほかいろいろな機能があり、特に実用性の高そうな人の動きを認識させることが可能です。手の動きを認識する機能にちょっと興味がでたので、今回はこれを動かします。

f:id:WindVoice:20210807223945j:plain
MediaPipe Handsで私の手が写っているところ

これ自体は「チュートリアル動かしてみた」程度のことなのですが、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」を選びます。

f:id:WindVoice:20210807224850p:plain

そのあと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の動画と連携する機能があったりして、なにかおもしろい遊びができるかもしれません。