Профессиональная AI-обработка данных носимых устройств
Представьте: ваш носимый устройство собирает терабайты сырых данных, но извлечь клинически значимые метрики не удаётся. Артефакты движения, дрейф базовой линии, шум датчиков — всё это делает необработанные сигналы непригодными для диагностики. Мы разрабатываем пайплайны, которые превращают сырые показания PPG, акселерометра, ЭКГ и CGM в готовые биомаркеры. Клиенты приходят с этой проблемой, и мы решаем её с помощью адаптивных фильтров и ML-моделей.
С какими устройствами и данными работаем
| Тип | Примеры | Основные сигналы | Частота дискретизации |
|---|---|---|---|
| Потребительские | Apple Watch, Whoop, Oura Ring | PPG, акселерометр, SpO₂ | 25-100 Гц |
| Медицинские | Holter (iRhythm Zio), CGM (Abbott LibreLink) | ЭКГ (1-2 канала), глюкоза | 200-500 Гц (ЭКГ), каждые 5 мин (CGM) |
| Спортивные | Garmin HRM-Pro, Catapult | R-R интервалы, GPS+IMU | 100 Гц (IMU), 1 Гц (GPS) |
Почему сырые сигналы нельзя использовать напрямую?
Основные проблемы: артефакты движения (PPG при ходьбе искажается на 30-50%), дрейф базовой линии, пропущенные R-пики на ЭКГ, разряжение батареи на CGM. Если не очистить, метрики будут недостоверны. Например, стандартный полосовой фильтр уменьшает ошибку ЧСС лишь на 10-15%, а наш адаптивный метод — в 2,5 раза больше.
Как очищаем PPG от артефактов движения?
Используем акселерометр как референсный сигнал и адаптивные фильтры. Алгоритмы TROIKA и JOSS снижают среднюю ошибку ЧСС с 8 до 3 BPM в тестовых датасетах (IEEE SP Cup). Пример полосовой фильтрации для PPG:
from scipy.signal import butter, filtfilt, find_peaks import numpy as np def ppg_to_hr(ppg_signal, sampling_rate=25): nyq = sampling_rate / 2 low, high = 0.5 / nyq, 4.0 / nyq b, a = butter(4, [low, high], btype='band') filtered = filtfilt(b, a, ppg_signal) peaks, _ = find_peaks(filtered, distance=sampling_rate * 0.4) rr_intervals_sec = np.diff(peaks) / sampling_rate hr_bpm = 60 / np.mean(rr_intervals_sec) return hr_bpm, rr_intervals_sec Анализ вариабельности сердечного ритма (HRV)
Из чистых R-R интервалов считаем временные и частотные метрики:
def compute_hrv_metrics(rr_intervals_ms): rr = np.array(rr_intervals_ms) return { 'rmssd': np.sqrt(np.mean(np.diff(rr)**2)), 'sdnn': np.std(rr), 'pnn50': np.mean(np.abs(np.diff(rr)) > 50), 'mean_rr': np.mean(rr), 'mean_hr': 60000 / np.mean(rr) } Вариабельность сердечного ритма — золотой стандарт для оценки восстановления после нагрузок. RMSSD — маркер парасимпатической активности, SDNN — общий показатель вегетативного тонуса. Наши пайплайны позволяют считать их в реальном времени на edge.
Как классифицируем активность по IMU?
IMU (акселерометр + гироскоп) даёт трёхосные данные. Извлекаем фичи в скользящем окне: среднее, стандартное отклонение, 95-й перцентиль, энергия, SMA, частота пересечения нуля, доминирующая частота, спектральная энтропия. Классификатор RandomForest обучен на 10 000 окон открытых датасетов (WISDM, UCI HAR). Точность: 94% на 6 классах (покой, ходьба, бег, велосипед, подъём, падение).
А стадии сна: как отличить REM от глубокого без PSG?
Эпохи по 30 секунд (как в полисомнографии) с фичами: движение, ЧСС, RMSSD, время от засыпания. Добиваемся 82% согласования с PSG при 4 классах (Wake/Light/Deep/REM). Это не уступает дорогим клиническим системам, но стоит на порядок меньше.
Непрерывный мониторинг глюкозы: метрики и прогноз
CGM даёт поток значений глюкозы каждые 5 минут. Извлекаем time-in-range, коэффициент вариации, GMI, детектируем постпрандиальные пики. Модель прогноза гипогликемии (на основе LSTM) предсказывает события за 30 минут с AUC 0,89.
Каждая модель сопровождается model card: описание обучающей выборки, распределение классов, accuracy/recall/precision per class, метрики для разных подгрупп (пол, возраст). Используем Weights & Biases для трекинга экспериментов, MLflow для версионирования. Регулярно переобучаем на новых данных.
Этапы обработки сигналов
| Этап | Длительность |
|---|---|
| Анализ сырых данных и определение требований | 1 неделя |
| Разработка пайплайна очистки и извлечения фич | 2-3 недели |
| Обучение и валидация ML-моделей | 2-4 недели |
| Развёртывание на edge и интеграция | 1-2 недели |
| Тестирование и документирование | 1 неделя |
Что входит в работу?
- Консультация по выбору датчиков, частот дискретизации, протокола хранения.
- Пайплайн обработки сигналов на Python (SciPy, custom C++ для edge).
- ML-модели (PyTorch / scikit-learn) для классификации, регрессии, прогноза.
- Развёртывание на edge (Triton, ONNX Runtime) или в облаке (Kubeflow).
- Документация: model card, описание фич, инструкция по интеграции.
- Обучение вашей команды работе с моделями.
Сроки и стоимость
Ориентировочные сроки зависят от сложности и количества датчиков.
- Базовая обработка одного сигнала (PPG или IMU) + дашборд: 4-5 недель.
- Полный стек (PPG + IMU + сон + CGM): 2-3 месяца.
Стоимость рассчитывается индивидуально. Получите консультацию — оценим ваш проект. У нас более 5 лет опыта в биомедицинской обработке сигналов.
Конфиденциальность
Работаем с медицинскими данными по стандартам HIPAA/GDPR. Обработка на edge, передача только агрегатов. При публикации — k-анонимность и differential privacy. Гарантируем безопасность ваших данных.
Свяжитесь с нами для детального обсуждения вашего проекта.







