Реализация 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-анализа сна.







