AI-based fitness monitoring system based on sensor data
Wearable devices—Whoops, Oura Ring, Garmin, Apple Watch—continuously collect biometric data. An AI system transforms this stream of raw data into actionable insights: assessing training readiness, recovery, and long-term progress.
Data from wearable devices
Cardiovascular metrics:
- HR (Heart Rate): resting, maximum, load zones
- HRV (Heart Rate Variability): RMSSD, SDNN - a key indicator of the autonomic nervous system
- SpO2 (blood oxygen saturation): 95-100% normal
Activity and movement:
- Steps, calories, active minutes
- Gyroscope + accelerometer: movement type (walking, running, cycling)
- GPS track (during training)
Dream:
- Stages: REM, Deep, Light sleep
- Total duration
- Sleep efficiency (time asleep / time in bed)
- Sleep consistency (regularity of sleep/wake-up time)
Skin temperature:
- Deviation from personal baseline: indicator of illness (increase), ovulation (women)
Recovery Score model
def calculate_recovery_score(hrv_today, hrv_baseline,
sleep_quality, sleep_duration,
resting_hr, resting_hr_baseline):
"""
Composite recovery score: 0-100
"""
# HRV score: нормализованное отклонение от персонального baseline
hrv_score = min(1.0, hrv_today / hrv_baseline)
# Sleep score: качество и продолжительность
sleep_score = (sleep_quality * 0.5 + min(1.0, sleep_duration / 8.0) * 0.5)
# HR score: тахикардия покоя = снижение восстановления
hr_score = max(0, 1.0 - (resting_hr - resting_hr_baseline) / resting_hr_baseline)
# Взвешенный composite
recovery = hrv_score * 0.5 + sleep_score * 0.35 + hr_score * 0.15
return recovery * 100
The Whoop system uses a similar methodology. Recovery < 33% = red (light activity), 34-66% = yellow (moderate), 67%+ = green (intense training).
Personal physiological basis
Individual baseline vs. population norms: The key principle is comparison with one's own baseline, not with the population "norm":
class PersonalBaseline:
def __init__(self, lookback_days=30, percentile=50):
self.lookback = lookback_days
self.percentile = percentile
def fit(self, history):
self.hrv_baseline = np.percentile(history['hrv'], self.percentile)
self.hr_baseline = np.percentile(history['resting_hr'], self.percentile)
self.sleep_baseline = np.percentile(history['sleep_hours'], self.percentile)
return self
def deviation(self, today):
return {
'hrv_dev': (today['hrv'] - self.hrv_baseline) / self.hrv_baseline,
'hr_dev': (today['resting_hr'] - self.hr_baseline) / self.hr_baseline,
'sleep_dev': (today['sleep_hours'] - self.sleep_baseline) / self.sleep_baseline
}
Sports results forecast
Fitness-Fatigue model (Banister):
Performance(t) = Fitness(t) - Fatigue(t)
Fitness(t) = Σ TSS(i) × exp(-(t-i)/τ_fitness), τ=45 дней
Fatigue(t) = Σ TSS(i) × exp(-(t-i)/τ_fatigue), τ=15 дней
ML enhancement: τ_fitness and τ_fatigue are personal parameters estimated from data using nonlinear optimization (scipy.optimize) based on training history and test results.
Peak performance timing: If there's a competition, we plan tapering (load reduction) so that fatigue is reduced while fitness is maintained. The model selects the optimal schedule.
Early Illness Detection
Sick day prediction:
def illness_risk_score(temp_deviation, hrv_drop, hr_elevation, symptom_report):
"""
Повышение температуры кожи + падение HRV + тахикардия покоя
= ранний признак инфекционного заболевания
"""
if temp_deviation > 0.5 and hrv_drop < -0.2 and hr_elevation > 5:
return 0.8 # высокий риск
return 0.1
Research (Garmin/Stanford COVID study, 2020) shows that wearables detected COVID 0-2 days before symptom onset in 63% of participants through changes in HRV and RHR.
Long-term progress
VO2max estimation:
- From HR and running speed data: Firstbeat methodology
- Validity: ±3-5 ml/(kg min) vs. laboratory test
Training Load Progression: Visualization of training load dynamics for weeks 12-52. Periodization: are the planned accumulation and deloading phases visible?
Adaptation tracking: With the same workload, a decrease in HR = adaptation (increased fitness). The trend of resting HR and HRV over the course of a season is an objective marker of physiological progress.
Integration and API
Device APIs:
- Garmin Health API, Garmin Connect API
- Whoop Developer API
- Apple HealthKit (iOS)
- Google Health Connect (Android)
- Polar API, Suunto API
Aggregation platforms: Terra API, Wearipedia – unified access to data from different devices.
Personal dashboard: web + mobile app. Daily recommendations, weekly summary, long-term trends.
Timeframe: Integration with 2-3 device APIs + recovery score + dashboard — 6-8 weeks. Personalized fitness-fatigue model + illness detection + trend analytics — 3-4 months.







