Python とコンピューターのカメラを使用して腕立て伏せを数える

Python とコンピューターのカメラを使用して腕立て伏せを数える

多くのプロジェクトを使用して、コンピューター ビジョンと Python のスキルを強化できます。これらのプロジェクトの 1 つは、Python を使用して簡単な腕立て伏せカウンターを作成することです。このプロジェクトのプログラムは、1 つのファイルに記述できます。

このプログラムは、ビデオ入力またはカメラからのリアルタイム入力を受け取り、入力に対して人間の姿勢推定を実行し、その人が行っている腕立て伏せの回数をカウントします。人間のポーズ推定を実行するために、プログラムは MediaPipe 人間のポーズ推定モデルを使用します。

MediaPipe 人間姿勢推定モデルとは?

Google が開発した、人体の 33 か所のランドマークを追跡するモデルです。また、2 クラスのセグメンテーションとして表す全身のセグメンテーションも予測します。次の画像は、モデルが識別できるすべてのランドマークを示しています。番号が付けられたポイントは、各ランドマークを識別し、線で互いに接続します。

MediaPipe 人間の姿勢推定ランドマーク
画像クレジット: MediaPipe/ GitHub

プッシュアップ カウンター プログラムでは、肩と肘の位置を利用します。上の画像では、肩のランドマークは 11 と 12 で、肘のランドマークは 13 と 14 です。

環境のセットアップ

Python の基本については既に理解しているはずです。Python IDE を開き、新しい Python ファイルを作成します。ターミナルで次のコマンドを実行して、環境にそれぞれのパッケージをインストールします。

pip install OpenCV-Python

プログラムでビデオ入力を取得して処理するには、OpenCV-Python を使用します。このライブラリは、プログラムにコンピューター ビジョン機能を提供します。

pip install MediaPipe

MediaPipe を使用して、入力に対して人間の姿勢推定を実行します。

pip install imutils

imutils を使用して、ビデオ入力を目的の幅にサイズ変更します。

ターミナルへの Python ライブラリのインストール

インポートと MediaPipe の初期化

以前に環境にインストールした 3 つのライブラリをインポートします。これにより、プロジェクトで依存関係を使用できるようになります。

import cv2
import imutils
import mediapipe as mp

次に、3 つの MediaPipe オブジェクトを作成し、それぞれの関数を使用してそれらを初期化します。mp.solutions.drawing_utils 関数を使用して、入力にさまざまなランドマークを描画します。mp.solutions.drawing_styles を使用して、ランドマークの描画が表示されるスタイルを変更します。mp.solutions.pose は、これらのランドマークを識別するために使用するモデルです。

mp_draw = mp.solutions.drawing_utils
mp_draw_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose

人間の姿勢推定の実行

人間の姿勢を検出することは、関節を識別して分類することにより、身体の向きを識別するプロセスです。

変数の宣言

腕立て伏せの回数、肩と肘の位置、およびビデオ入力を格納するために使用する変数を宣言します。

count = 0
position = None
cap = cv2.VideoCapture("v4.mp4")

位置変数を None に初期化します。プログラムは、肘と肩の位置に応じて更新します。

MediaPipe 姿勢推定モデルの呼び出し

入力で人間のポーズを検出する MediaPipe ポーズ推定モデルを呼び出します。

with mp_pose.Pose(
    min_detection_confidence = 0.7,
    min_tracking_confidence = 0.7) as pose:

検出の信頼度と追跡の信頼度の初期化は、モデルに必要な精度のレベルを表します。0.7 は 70% の精度に似ています。お好みのレベルに変更できます。

入力の取得と前処理

後で姿勢推定モデルに渡す入力を取得します。imutils ライブラリを使用してビデオ入力の幅を変更します。 MediaPipe は RGB 入力のみで動作するため、入力をBGR から RGB に変換します。最後に、変換された入力を人間の姿勢推定モデルに渡してランドマークを識別します。

while cap.isOpened():
    success, image=cap.read()

    if not success:
        print("empty camera")
        break


    image = imutils.resize(image, width=500)
    image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
    result = pose.process(image)

入力を処理した後、入力のランドマークを特定しました。

入力で識別されたランドマークを描画する

各ランドマークの座標を格納する空のリストを作成します。draw_landmarks クラスを使用して、各ランドマークとそれらの間の接続にドットを描画します。for ループを使用してランドマークを反復処理し、作成したリストに各ランドマークの ID と座標を格納します。image.shape クラスを使用して、ビデオ入力の幅と高さを計算します。

lmList = []

if result.pose_landmarks:
    # Draws the landmarks' points and connects them
    mp_draw.draw_landmarks(image, result.pose_landmarks,
                               mp_pose.POSE_CONNECTIONS)

    for id, im in enumerate(result.pose_landmarks.landmark):
        # Finding the length and width of the video input
        h, w, _ = image.shape

        # Finding the exact coordinates of the body points
        X, Y = int(im.x * w), int(im.y * h)
        lmList.append([id, X, Y])

ID は、MediaPipe ポーズ推定モデルによって特定のランドマークに付けられた番号です。入力で人間のポーズを識別したら、腕立て伏せの回数を数える必要があります。

腕立て伏せの回数を数える

肩の位置と肘の位置をチェックする条件を作成します。入力の人の肩が肘よりも高い場合、その人は起きています。肩が肘より低いとき、その人は倒れています。これは、肩のランドマークの ID と肘のランドマークの ID を比較することで確認します。

# Checking whether there are any identified landmarks
if len(lmList)! = 0:
    # Condition that identifies the down position
    if (lmList[12][2] and lmList[11][2] >= lmList[14][2] and lmList[13][2]):
        position = "down"

    # Condition that identifies the up position
    if (lmList[12][2] and lmList[11][2] <= lmList[14][2] and lmList[13][2])
    and position == "down":
         position = "up"
         count +=1

腕立て伏せを完全に 1 回完了するには、ダウン ポジションを取り、アップ ポジションに戻る必要があります。完全な腕立て伏せの後、プログラムはカウントを 1 つ更新できます。

出力の表示

プログラムがカウントした腕立て伏せの回数を表示する必要があります。ユーザーが完全な腕立て伏せを行うたびに、カウントの値を端末に出力します。最後に、腕立て伏せをしている人の出力を、身体にランドマークを描いて表示します。

            print(count)

    cv2.imshow("Push-up counter", cv2.flip(image, 1))
    key = cv2.waitKey(1)

    # Program terminates when q is pressed
    if key == ord('q'):
        break

cap.release()

出力は次のようになります。

腕立て伏せをしている人のプログラムの出力

出力の人物が完全な腕立て伏せを行うので、端末の更新を観察する必要があります。

コンピューター ビジョンのスキルを強化する

コンピュータビジョンは広い。腕立て伏せカウンターは、コンピューター ビジョンのスキルを実践するために使用できる多くのプロジェクトの 1 つです。これらのスキルを強化する最善の方法は、コンピューター ビジョンを含むプロジェクトをさらに構築することです。

構築するプロジェクトが多ければ多いほど、より多くのことを学ぶことができます!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です