AI-Аналіз якості сну по даних датчиків мобільного додатку
Акселерометр на запястті під час сну пише характерні паттерни для різних фаз: глибокий сон—майже повна нерухомість з періодичними мікродвижениями, REM—рідкі рухи з наростаючим пульсом, бодрствування—явна активність. Задача моделі—правильно розмітити 8 годин цих даних.
Джерела сирих даних
На iOS дані сну доступні через HealthKit як HKCategoryType(.sleepAnalysis). Apple Watch та сторонні трекери (Oura, Fitbit, Garmin) записують туди етапи сну. Але для сирих даних акселерометра та GyroScope для власної 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 для ночної обробки даних з частковими записами.
SpO2 з HealthKit
Дані пульсоксиметрії через HKQuantityType(.oxygenSaturation). Apple Watch Series 6+ пише SpO2 кожні 1-2 години ночей у фоне. Падіння нижче 90%—ознака апное сну. Але Apple не пише ночний SpO2 безперервно (з міркувань батареї), тому перервані дані потребують обережної інтерполяції.
Алгоритм класифікації фаз сну
Стандартна задача—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 вище ніж у глибокому сні
Модель
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)))
}
Конвертація та деплой моделі
Для iOS: sklearn Random Forest → coremltools.converters.sklearn.convert() → .mlmodel. LSTM слой—окремо CoreML нейромережа. Об'єднуємо в CoreML Pipeline. Для Android: обидві моделі через TFLite з делегатом NNAPI для аппаратного прискорення.
UI: інтерпретація результату
Гіпнограмма (графік фаз сну за часом)—стандартний спосіб відображення. Додатково: Sleep Score як агрегатна метрика, breakdown за часом у кожній фазі, виявлені паттерни (пізне засипання, частих пробуджень).
Рекомендації привязуємо до конкретних паттернів: "Доля N3 (глибокого сну) упала з 18% до 9% за останні 5 ночей" + конкретний совет, а не "покращіть якість сну".
Процес розробки
Вибір джерел даних (HealthKit vs сирий акселерометр). Розробка pipeline обробки ночних даних. Feature engineering та обучение моделі класифікації. Конвертація та інтеграція в додаток. UI компоненти гіпнограми та рекомендацій. Тестування точності на реальних даних з носимих пристроїв.
Орієнтири за часом
Wake/Sleep детектор з актиграфією та базовим UI—1–2 тижні. Повноцінний 4-стадійний класифікатор з гіпнограмою та персоналізованими рекомендаціями—3–5 тижнів.







