Pythonとmediapipeを使って人物の動きの認識、追跡をする方法

スポンサーリンク

この記事では、画像中のポーズを検出し、画像上のランドマークとしてマークするのに役立つプログラムを実装する予定です。

まず、ポーズ検出とは何かを理解しましょう。

ポーズ推定は、人物や物体の動きを追跡するためのコンピュータビジョンのアプローチです。

これは通常、提供されたアイテムのキースポットを探し出すことで実現される。

我々は、マルチモデル機械学習パイプラインを作成するためのクロスプラットフォームオープンソースツールである mediapipe ライブラリを使用する予定です。

このライブラリは、人間の顔認識、マルチハンドトラッキング、ヘアセグメンテーション、オブジェクト検出とトラッキングなど、最先端のモデルを実装することができます

1
2
3
import cv2
import mediapipe as mp
import matplotlib.pyplot as plt
スポンサーリンク

Pythonによる画像ポスト検出器の実装

まず、プログラムに必要なライブラリを全てインポートすることから始めましょう。

OpenCV、mediapipe、matplotlib ライブラリです。

1
2
3
4
5
6
7
8
9
10
mp_pose = mp.solutions.pose
 
pose_image = mp_pose.Pose(static_image_mode=True,
                          min_detection_confidence=0.5)
 
pose_video = mp_pose.Pose(static_image_mode=False,
                          min_detection_confidence=0.7,
                          min_tracking_confidence=0.7)
 
mp_drawing = mp.solutions.drawing_utils

最初のステップは、ポーズ検出モデルを初期化することです。

これは solutions.pose 関数を用いて初期化します。

次に、Pose_imageを格納するために、mp_pose.PoseというPoseメソッドを使用します。

この関数はいくつかのパラメータを受け取ります。

パラメータは、画像で作業していることを定義し、また、信頼度スコアを設定します。

ビデオに対しても同様のPoseメソッドを設定し、必要なパラメータ値を渡します。

最後に、drawing_utils関数を用いて、画像上のポーズ推定点をすべて描画します。

以下のコードを見てください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def detectPose(image_pose, pose, draw=False, display=False):
    original_image = image_pose.copy()
    image_in_RGB = cv2.cvtColor(image_pose, cv2.COLOR_BGR2RGB)
    resultant = pose.process(image_in_RGB)
    if resultant.pose_landmarks and draw:   
        mp_drawing.draw_landmarks(image=original_image,
                                  landmark_list=resultant.pose_landmarks,
                                  connections=mp_pose.POSE_CONNECTIONS,
                                  landmark_drawing_spec=mp_drawing.DrawingSpec(color=(255,255,255),
                                                                               thickness=2, circle_radius=2),
                                  connection_drawing_spec=mp_drawing.DrawingSpec(color=(49,125,237),
                                                                               thickness=2, circle_radius=2))
    if display:
            plt.figure(figsize=[22,22])
            plt.subplot(121);plt.imshow(image_pose[:,:,::-1])
            plt.title("Input Image",size=14)
            plt.axis('off');
            plt.subplot(122);plt.imshow(original_image[:,:,::-1])
            plt.title("Pose detected Image",size=14)
            plt.axis('off');
 
    else:       
        return original_image, resultant

以下の関数はメイン関数で、関数にいくつかのパラメータを渡した後にポーズを推定します。

まず、安全なバックアップのために、ユーザーから渡されたオリジナル画像のコピーを作成します。

次に、処理を簡単にするために画像を RGB 形式に変換します。

次に、process関数を使って、RGBに変換された画像に対してポーズ検出の処理を行います。

ここでランドマークの有効性を確認し、ラインとランドマークポイントを描く必要があるかどうかを判断します。

Pose Detection Demo

最後に、上記の前のコードスニペットの関数をいくつかの画像に対してテストします。

そのうちの何枚かの出力を以下に示します。

Sample Outputs

Fake tag
Fake tag
Fake tag

まとめ

このように、Mediapipeは画像中のポーズを検出するために素晴らしい仕事をしたことが分かります。

お読みいただきありがとうございました。

タイトルとURLをコピーしました