Реалізація AI-аналізу якості сну за даними датчиків
Акселерометр на зап'ясті під час сну записує характерні патерни: глибокий сон — майже нерухомість з мікрорухами, REM — рідкісні рухи з наростаючим пульсом, неспання — явна активність. Задача моделі — правильно розмітити 8 годин цих даних. Ми вже реалізували такі системи для кількох проєктів: середня точність Wake/Sleep детектора — 85%, чотиристадійна класифікація — 70%. Вартість розробки залежить від складності інтеграції та джерел даних, а ми допомагаємо зекономити бюджет за рахунок використання наявних HealthKit-даних.
Джерела сирих даних
На iOS дані сну доступні через HealthKit як HKCategoryType(.sleepAnalysis). Apple Watch і сторонні трекери (Oura, Fitbit, Garmin) записують туди етапи сну. Але якщо потрібні сирі дані акселерометра та гіроскопа для власної ML-класифікації — HealthKit їх не віддає ретроспективно. Потрібен фоновий застосунок з CMMotionManager, який записує дані на диск.
class NightMotionRecorder {
private let motionManager = CMMotionManager()
private var dataBuffer: [(timestamp: Date, x: Double, y: Double, z: Double)] = []
func startNightRecording() {
guard motionManager.isAccelerometerAvailable else { return }
motionManager.accelerometerUpdateInterval = 1.0 / 25.0 // 25 Hz достатньо для сну
motionManager.startAccelerometerUpdates(to: .main) { [weak self] data, error in
guard let data = data else { return }
self?.dataBuffer.append((
timestamp: Date(),
x: data.acceleration.x,
y: data.acceleration.y,
z: data.acceleration.z
))
}
}
}
25 Hz — баланс між точністю та витратою батареї. Сон не потребує 100 Hz акселерометра. Background режим для CMMotionManager потрібен через UIBackgroundModes: motion в Info.plist — але iOS агресивно завершує фонові завдання. Надійніше: BGProcessingTask для нічної обробки даних з частковими записами.
Дані пульсоксиметрії через HKQuantityType(.oxygenSaturation). Apple Watch Series 6+ записує SpO2 кожні 1-2 години вночі у фоні. Падіння нижче 90% — ознака апное сну. Але Apple не записує нічний SpO2 безперервно (через батарею), тому переривчасті дані потрібно інтерполювати обережно. В одному з проєктів ми використовували кубічну інтерполяцію з урахуванням часу пробуджень. Дослідження Sleep Heart Health Study підтверджує ефективність такого підходу при достатній кількості точок.
Як будується класифікація фаз сну?
Завдання — 4 класи: Wake, Light NREM, Deep NREM (N3), REM. Клінічний стандарт — полісомнографія (PSG) з ЕЕГ. Акселерометра та ЧСС достатньо для Wake/Sleep розділення з точністю ~85%, повна 4-стадійна класифікація — 60–75% agreement з PSG.
Feature engineering з акселерометра
Із сирого 25 Hz сигналу за 30-секундні епохи обчислюємо:
- Activity count — сума абсолютних змін вектора прискорення (Cole-Kripke алгоритм)
- ZCR (Zero Crossing Rate) — частота перетинів нуля, корелює з дрібною моторикою
- ENMO (Euclidean Norm Minus One) — стандарт в актиграфії,
sqrt(x²+y²+z²) - 1g, прибирає гравітацію - Angle z-axis — кут зап'ястя, характерний для різних поз сну
З ЧСС (якщо є) додаємо:
- ЧСС у спокої vs поточна ЧСС (дельта)
- HRV (RMSSD з RR-інтервалів) — в REM HRV вища ніж у deep sleep
Модель
Random Forest на цих фічах дає розумну базу. Для temporal context — LSTM поверх RF-фіч: RF видає вектор ознак для кожної 30-сек епохи, LSTM враховує послідовність епох. Це патерн з досліджень Stanford Sleep Lab.
# Feature extraction для однієї епохи (30 сек, 750 семплів при 25 Hz)
def extract_epoch_features(epoch_data):
x, y, z = epoch_data[:, 0], epoch_data[:, 1], epoch_data[:, 2]
enmo = np.maximum(np.sqrt(x**2 + y**2 + z**2) - 1, 0)
angle_z = np.arctan(z / np.sqrt(x**2 + y**2 + 1e-6)) * 180 / np.pi
return {
'enmo_mean': np.mean(enmo),
'enmo_std': np.std(enmo),
'enmo_max': np.max(enmo),
'angle_z_mean': np.mean(angle_z),
'angle_z_std': np.std(angle_z),
'activity_count': np.sum(np.abs(np.diff(enmo)))
}
Як забезпечується точність класифікації?
Точність залежить від якості вхідних даних та вибору моделі. Ми проводимо крос-валідацію на розмічених наборах, таких як Sleep-EDF або власних. Додатково використовуємо ансамбль моделей та калібрування ймовірностей. Персоналізовані рекомендації сну формуються на основі виявлених патернів: наприклад, при зниженні частки N3 нижче 10% видається порада щодо збільшення часу сну.
Що входить у реалізацію?
| Етап | Тривалість | Результат |
|---|---|---|
| Аналіз джерел даних | 2-3 дні | Вибір HealthKit або сирого акселерометра, узгодження з архітектурою застосунку |
| Розробка pipeline | 5-7 днів | Нічний запис даних, обробка, зберігання |
| Feature engineering та навчання | 7-10 днів | Модель з точністю >70% на 4 класи |
| Конвертація та інтеграція | 3-5 днів | CoreML/TFLite pipeline, unit-тести |
| UI гіпнограми та рекомендацій | 5-7 днів | Компоненти для відображення та інтерактиву |
| Тестування на носимих пристроях | 3-5 днів | Порівняння з PSG (якщо доступна) або валідація на тестовій вибірці |
Детальніше про pipeline обробки
Пайплайн включає модуль запису даних (CMMotionManager), препроцесинг (фільтрація, інтерполяція), обчислення фіч, виведення моделі та постобробку (згладжування гіпнограми). Всі модулі покриті unit-тестами.
Підсумкові deliverables: документація по моделі, код інтеграції, доступ до репозиторію, навчання команди. Оцінимо ваш проєкт після аналізу поточного застосунку.
Як інтерпретувати результати?
Гіпнограма (графік фаз сну по осі часу) — стандартний спосіб відображення. Додатково: Sleep Score як агрегатна метрика, breakdown за часом у кожній фазі, виявлені патерни (пізнє засинання, часті пробудження).
Рекомендації прив'язуємо до конкретних патернів: «Частка N3 (глибокого сну) впала з 18% до 9% за останні 5 ночей» + конкретна порада, а не «покращте якість сну». Наші інженери мають досвід роботи з HealthKit і Core ML понад 5 років, гарантуємо коректну обробку фонових завдань та дотримання App Store Review Guidelines.
Процес роботи
- Аналітика: вибір джерел даних (HealthKit vs сирий акселерометр), оцінка точності.
- Проєктування: pipeline обробки нічних даних, архітектура ML.
- Реалізація: feature engineering, навчання моделі, конвертація.
- Тестування: на реальних даних з носимих пристроїв, A/B тести.
- Деплой: інтеграція в застосунок, моніторинг.
Зв'яжіться з нами для консультації — оцінимо проєкт безкоштовно. Замовте попередній аудит вашого застосунку для оцінки можливості інтеграції AI-аналізу сну.







