AI・機械学習

姿勢が崩れたら即アラート!MediaPipeとElectronでAI姿勢モニターを自作しよう

「気づいたら背中が丸まって、首が画面に近づいていた…」なんてこと、ありますよね😅 長時間のコーディングセッションで、いつの間にか猫背モードに突入してしまうのは、エンジニアあるあるだと思います。

今回は、そんな慢性的な姿勢崩れをAIの力でリアルタイム検知してくれるシステムを自作する方法をご紹介します!使うのはMediaPipe Pose(Googleの姿勢推定ライブラリ)とElectron(デスクトップアプリフレームワーク)の組み合わせです。

🎯 この記事の対象読者・難易度

posture monitor computer vision
posture monitor computer vision / Photo by cottonbro studio via Pexels
  • ✅ Pythonの基本が書ける方(初〜中級者向け)
  • ✅ コンピュータビジョンやAIに興味がある方
  • ✅ 「むずかしそう」を「できそう」に変えたい方

🤖 MediaPipe Poseってどんなもの?

MediaPipe Poseは、Googleが開発したリアルタイム姿勢推定ライブラリです。カメラ映像から人体の関節(肩・腰・膝など)を33点自動検出してくれます。難しい機械学習の知識がなくても、数行のコードで骨格検出ができてしまうのが最大の魅力ですよ。

イメージとしては、カメラの前に座っているあなたの体に「見えない点」をどんどんマッピングしていく感じです📍

🛠️ 仕組みのざっくりした流れ

  1. Webカメラで映像をキャプチャ
  2. MediaPipeで肩・耳・腰の座標を取得
  3. 座標から姿勢の傾きを計算(角度チェック)
  4. しきい値を超えたらElectronアプリが通知を飛ばす

ざっくりとした流れがつかめましたか?では実際のコードを見てみましょう。

💻 Pythonで姿勢を検出するコアコード

まずはMediaPipeで姿勢を検出し、肩の傾き角度を計算する部分です。ここが姿勢判定のキモになります。

import cv2
import mediapipe as mp
import numpy as np

# MediaPipe Poseの初期化
mp_pose = mp.solutions.pose
mp_drawing = mp.solutions.drawing_utils

def calculate_angle(a, b, c):
    """3点の座標から角度を計算する関数"""
    a = np.array(a)  # 始点
    b = np.array(b)  # 中心点(関節)
    c = np.array(c)  # 終点

    # ベクトルの角度をラジアンで計算 → 度数に変換
    radians = np.arctan2(c[1] - b[1], c[0] - b[0]) - \
              np.arctan2(a[1] - b[1], a[0] - b[0])
    angle = np.abs(radians * 180.0 / np.pi)

    if angle > 180.0:
        angle = 360 - angle
    return angle

def detect_posture(frame, pose):
    """フレームから姿勢を判定してステータスを返す"""
    image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    results = pose.process(image)

    if not results.pose_landmarks:
        return "検出できません", frame

    landmarks = results.pose_landmarks.landmark

    # 肩・耳・腰の座標を取得
    left_shoulder = [
        landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,
        landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y
    ]
    left_ear = [
        landmarks[mp_pose.PoseLandmark.LEFT_EAR.value].x,
        landmarks[mp_pose.PoseLandmark.LEFT_EAR.value].y
    ]
    left_hip = [
        landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].x,
        landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].y
    ]

    # 背骨の角度を計算(耳→肩→腰)
    spine_angle = calculate_angle(left_ear, left_shoulder, left_hip)

    # しきい値160度未満なら猫背と判定
    if spine_angle < 160:
        status = "⚠️ 姿勢が崩れています!"
        color = (0, 0, 255)  # 赤色で警告
    else:
        status = "✅ 良い姿勢です!"
        color = (0, 255, 0)  # 緑色でOK

    # 骨格をフレームに描画
    mp_drawing.draw_landmarks(frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
    cv2.putText(frame, f'Angle: {int(spine_angle)}', (50, 50),
                cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2)

    return status, frame

# メインループ
cap = cv2.VideoCapture(0)  # Webカメラを開く

with mp_pose.Pose(min_detection_confidence=0.5,
                  min_tracking_confidence=0.5) as pose:
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break

        status, annotated_frame = detect_posture(frame, pose)
        print(status)

        cv2.imshow('姿勢モニター', annotated_frame)

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

cap.release()
cv2.destroyAllWindows()

ポイントをまとめるとこんな感じです👇

  • 📌 耳→肩→腰の角度を計算することで「頭が前に出ているか」を判定
  • 📌 しきい値(ここでは160度)は自分の体型に合わせて調整OK
  • 📌 mp_drawing.draw_landmarks で骨格を視覚化できる

🖥️ Electronと組み合わせてデスクトップ通知を出す


このPythonスクリプトをバックエンドにして、Electronがフロントエンドとして動く構成になります。PythonプロセスとElectronはWebSocketやHTTPで通信するのが一般的なパターンです。

つまり、こんな役割分担です。

  • 🐍 Python(MediaPipe)… 姿勢の検出と判定
  • Electron… デスクトップ通知・UIの表示

まとめ

今回はMediaPipe Poseを使ってリアルタイムに姿勢を検出し、Electronと組み合わせてAI姿勢モニターを作る方法をご紹介しました。「AIは難しい」と感じていた方も、MediaPipeを使えば意外とシンプルにコンピュータビジョンアプリが作れることが伝わったら嬉しいです😊

しきい値の調整や通知音の追加など、カスタマイズの余地もたくさんあります。ぜひ自分好みの姿勢モニターに育てて、腰痛・肩こりを撃退してみてください!💪

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る

Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

もしも

Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

FastAPIでWebAPI開発を実践的に学ぶ

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

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