Running Form Tech: DIY AI 분석으로 보행을 개선하세요
Source: Dev.to
일반적인 생체역학적 오류
1. 오버스트라이드
충격 시 무릎이 펴지면 다리를 통해 충격파가 전달됩니다. 이는 정강이 각도로 측정합니다: 거의 수직에 가까운 정강이가 이상적이며, 앞쪽으로 기울어진 각도는 모멘텀에 역행하는 스트라이크를 의미합니다. 정강이 각도가 약 15°를 초과하면 러너가 오버스트라이드하고 있을 가능성이 높습니다.
2. 과도한 수직 진동
엉덩이의 수직 움직임(보통 5–10 cm)은 “튕겨 오르는” 대신 앞으로 추진하고 있는지를 보여줍니다. 큰 진동은 에너지를 낭비하고 관절에 가해지는 부하를 증가시킵니다.
영상 촬영 요구 사항
신뢰할 수 있는 데이터를 얻기 위해서는 다음 기준을 충족하는 측면 영상을 녹화하세요:
- 측면 시점 – 카메라는 러닝머신이나 달리기 경로에 수직이어야 합니다.
- 안정된 마운트 – 삼각대 등 고정된 지지대를 사용해 카메라 흔들림을 방지합니다. 흔들림은 겉보이는 “엉덩이 높이”를 왜곡할 수 있습니다.
- 관절이 보이도록 – AI가 엉덩이, 무릎, 발목 랜드마크를 명확히 인식할 수 있도록 몸에 딱 붙는 옷을 입습니다.
- 일관된 조명 – 그림자와 같은 강한 명암 차이는 포즈 추정 알고리즘을 혼란시킬 수 있으니 피합니다.
구현 개요
- 포즈 추정 – OpenCV와 MediaPipe 같은 라이브러리를 활용해 파이썬으로 각 프레임에서 33개의 신체 랜드마크를 감지합니다.
- 슬라이딩 윈도우 – 프레임 이동 창을 만들어 발목의 최저점을 추적합니다; 이는 발이 땅에 닿는 순간을 근사합니다.
- 각도 계산 – 식별된 스트라이크 프레임에서 무릎과 발목 사이의 각도를 계산해 정강이 각도를 구합니다.
- 바운스 측정 – 각 보폭마다 엉덩이의 최대·최소 Y 좌표를 기록합니다. 픽셀 차이를 알려진 기준으로 보정해 센티미터로 변환하면 수직 진동을 정량화할 수 있습니다.
# Example: calculate shin angle using MediaPipe landmarks
import cv2
import mediapipe as mp
import numpy as np
mp_pose = mp.solutions.pose
pose = mp_pose.Pose(
static_image_mode=False,
model_complexity=1,
enable_segmentation=False,
min_detection_confidence=0.5,
)
def shin_angle(landmarks):
# landmarks: list of PoseLandmark objects
knee = np.array([
landmarks[mp_pose.PoseLandmark.LEFT_KNEE].x,
landmarks[mp_pose.PoseLandmark.LEFT_KNEE].y,
])
ankle = np.array([
landmarks[mp_pose.PoseLandmark.LEFT_ANKLE].x,
landmarks[mp_pose.PoseLandmark.LEFT_ANKLE].y,
])
shin_vec = ankle - knee
angle = np.degrees(np.arctan2(shin_vec[1], shin_vec[0]))
return abs(angle)
# Process video frames...
실용적인 팁
- 정강이 각도 모니터링 – 거의 수직에 가깝게 착지하도록 목표합니다(편차 ≤ 15°). 이는 관절 충격을 줄여줍니다.
- 바운스 최소화 – 수직 에너지를 앞쪽 추진력으로 전환해 효율성을 높입니다.
- 데이터 활용 – 영상 피드백을 통해 주관적인 “느낌”을 객관적인 생체역학 지표로 전환합니다.
개발자이거나 기술에 익숙한 러너라면 직접 이 도구를 만들 준비가 된 것입니다. 전체 파이썬 코드와 튜토리얼은 WellAlly의 전체 가이드에서 확인할 수 있습니다.