Реализация AI-анализа ЭКГ с носимого устройства в мобильном приложении
ЭКГ с Apple Watch Series 4+ или AliveCor KardiaMobile — это одноканальная запись, 30 секунд, 512 Hz. Достаточно для детекции фибрилляции предсердий и других ритмических нарушений. Задача разработчика — принять этот сигнал, правильно его обработать и применить модель, не допустив ни ложноотрицательных результатов, ни регуляторных нарушений.
Получение ЭКГ данных
Apple Watch + HealthKit
Apple Watch Series 4+ пишет ЭКГ через HKElectrocardiogram. Доступ через HealthKit:
import HealthKit
func fetchLatestECG() async throws -> (HKElectrocardiogram, [Double]) {
let ecgType = HKObjectType.electrocardiogramType()
let query = HKSampleQuery(
sampleType: ecgType,
predicate: nil,
limit: 1,
sortDescriptors: [NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)]
) { _, samples, error in
// handle
}
// Для получения voltage данных — отдельный подзапрос
let voltageQuery = HKElectrocardiogramQuery(ecg) { _, result in
switch result {
case .measurement(let measurement):
if let voltage = measurement.quantity(for: .appleWatchSimilarToLeadI) {
let microvolts = voltage.doubleValue(for: .volt()) * 1_000_000
voltageData.append(microvolts)
}
case .done: break
case .error(let error): print(error)
}
}
healthStore.execute(voltageQuery)
}
Apple возвращает сырой сигнал в вольтах, выбранный Lead I (запястье). Частота дискретизации — 512 Hz, длина — около 15360 семплов на 30 секунд.
Сторонние устройства: BLE + Protocoll
AliveCor KardiaMobile, Withings Move ECG и аналоги передают ЭКГ через BLE с проприетарными протоколами. Большинство предоставляют SDK: KardiaMobile SDK для iOS/Android, Withings SDK. Без SDK — анализ BLE-пакетов через CBCentralManager и реверс-инжиниринг протокола (долго и ненадёжно).
Предобработка сигнала: без этого модель не работает
Сырой ЭКГ-сигнал содержит шумы: baseline wander (дрейф изолинии от дыхания), мышечные артефакты, электрические помехи 50/60 Hz. Перед подачей в модель — фильтрация обязательна.
Bandpass фильтр 0.5–40 Hz убирает baseline wander и высокочастотный шум:
from scipy.signal import butter, filtfilt
def bandpass_filter(signal, fs=512, lowcut=0.5, highcut=40):
nyq = fs / 2
low = lowcut / nyq
high = highcut / nyq
b, a = butter(4, [low, high], btype='band')
return filtfilt(b, a, signal)
R-peak детекция (алгоритм Pan-Tompkins) нужна для расчёта RR-интервалов — основного признака для детекции аритмий. Библиотека neurokit2 реализует Pan-Tompkins, BioSPPy. На мобиле фильтр реализуем нативно: в Swift через Accelerate framework (vDSP), в Kotlin — через KotlinDL или портируем scipy-код через TFLite custom ops.
Модели для детекции аритмий
CNN для классификации ритма
Стандартный подход — 1D CNN на окне сигнала 2.5–10 секунд. Входной тензор: [batch, time_steps, 1]. Архитектура: несколько Conv1D → MaxPool → Dense → Softmax.
Публичные датасеты для обучения: PhysioNet MIT-BIH Arrhythmia Database (48 двухканальных записей), PTB-XL (21 799 клинических ЭКГ с 71 диагнозом). MIT-BIH доступен через wfdb библиотеку.
После обучения конвертируем в CoreML:
import coremltools as ct
spec = ct.convert(
torch_model,
inputs=[ct.TensorType(shape=(1, 2560, 1), dtype=np.float32)],
compute_precision=ct.precision.FLOAT16,
compute_units=ct.ComputeUnit.CPU_AND_NE
)
spec.save("ECGClassifier.mlpackage")
FLOAT16 квантизация уменьшает размер модели вдвое без значимой потери точности для ЭКГ-классификации. Neural Engine (NE) ускоряет инференс на устройствах с A12+.
Ограничения on-device анализа
Одноканальная ЭКГ с запястья — не клиническая 12-канальная ЭКГ. Чувствительность алгоритмов Apple по данным их исследований: ФП — 99.3%, но это специфический ритм. Другие нарушения (блокады, WPW) требуют 12-канальной записи.
Регуляторные требования — самое важное
Если приложение заявляет о диагностике заболеваний — это медицинское изделие (СЕ Class IIa в ЕС, FDA 510(k)/De Novo в США). Разработка займёт в разы больше из-за требований к клиническим испытаниям, design control, software validation.
Если приложение позиционируется как information only («показывает паттерны ритма, не является диагностическим инструментом») — регуляторная нагрузка ниже. Все дисклеймеры должны быть на экранах с результатами анализа, не только в ToS.
Apple сам это делает: каждый результат ЭКГ в Apple Health сопровождается явным «consult your doctor».
Процесс работы
Согласование регуляторной стратегии до начала разработки. Интеграция с HealthKit или сторонним SDK. Реализация сигнальной обработки (фильтры, R-peak детекция). Разработка и валидация ML-модели на открытых датасетах. Конвертация в CoreML/TFLite. UI: визуализация ЭКГ-сигнала, результат анализа, обязательные дисклеймеры.
Ориентиры по срокам
Базовый ФП-детектор с CoreML и HealthKit интеграцией — 3–5 недель. Расширенная система с несколькими типами аритмий, валидацией на клинических данных — от 2 до 3 месяцев. Полный медицинский прибор с регуляторной документацией — отдельный многомесячный проект.







