Засичане на пушене с Apple Watch: как изграждам Still Mirror (Swift, SWT)

Пътят ми в изграждането на „Still Mirror“ - Apple Watch приложение за пасивно засичане на пушене/вейпване чрез HealthKit, Swift, Xcode и стационарна уейвлет трансформация (SWT).

Идеята да разбираме истински навиците си, особено онези, които извършваме почти несъзнателно, винаги ме е вълнувала. Ами ако носимите ни устройства можеха да ни предложат меко, неосъдително огледало за тези модели? Този въпрос запали проекта "Still Mirror": опит да се засичат пасивно събития на пушене или вейпване чрез богатите физиологични данни от Apple Watch, без потребителят да въвежда нищо ръчно. Това не е опит да се построи поредното приложение за отказване, а инструмент за чисто, неподправено осъзнаване.

Предизвикателството: шепот в симфония от шум

Основното предизвикателство е огромно: как различаваш фината физиологична следа на пушене/вейпване от безбройните други ежедневни дейности и телесни реакции? Стрес, бърза разходка, стряскащ шум или дори чаша кафе могат да причинят краткотрайни промени в сърдечната честота (HR) и вариабилността на сърдечната честота (HRV). Сигналът, който търсим, често е шепот в симфония от физиологичен шум.

Но за да изолирам истински тези мимолетни събития, ми трябваше по-сложна техника за обработка на сигнали.

Работно място на разработчик с Xcode, показващ Swift код за Apple Watch приложение, с графики от HealthKit данни на заден план.
Фиг. 1. – Екосистемата за Apple разработка: Xcode, Swift и HealthKit са в центъра на оживяването на 'Still Mirror' върху Apple Watch.

Избор на инструментариум: Apple екосистема и Swift

За проект, насочен към Apple Watch, изборът на екосистема е ясен:

  • Xcode и Swift: Нативната среда за разработка за Apple платформи. Това означаваше да навляза по-дълбоко в Swift, език, който намирам за елегантен и мощен, и да се оправям с особеностите на Xcode.
  • HealthKit: Framework-ът на Apple е входът към основните потоци от данни: сърдечна честота, HRV (SDNN/RMSSD), SpO2 (особено релевантно при горене спрямо вейпване) и нива на активност. Privacy-centric дизайнът на HealthKit е ключов за приложение, което работи с толкова чувствителни данни.
  • Ограничения на watchOS: Разработката за часовника означава постоянно балансиране между функционалност и ресурсни ограничения - батерията и възможностите за background processing винаги са на преден план.

Алгоритмичното сърце: стационарна уейвлет трансформация (SWT)

Традиционният анализ на времеви редове често се затруднява с нестационарни сигнали - сигнали, чиито статистически свойства (като средна стойност и дисперсия) се променят във времето. Физиологичните данни са пословично нестационарни. Тук влиза в игра Stationary Wavelet Transform (SWT).

За разлика от стандартната Discrete Wavelet Transform (DWT), която е shift-variant (тоест малко изместване във входния сигнал може драматично да промени уейвлет коефициентите), SWT е shift-invariant. Това я прави по-устойчива при анализ на сигнали, където точният момент на събитията е критичен, но може леко да варира.

Защо SWT за този проблем?

  1. Time-Frequency Localization: SWT може да разложи сигнал на различни честотни ленти, като запази времевата информация. Това означава, че можем да търсим конкретни честотни характеристики (например внезапни изблици на високочестотна активност в HR или специфични промени в HRV честотни ленти), които се случват в точни моменти.
  2. Denoising: Физиологичните сигнали са шумни. SWT може да помогне да отделим подлежащия "истински" сигнал от случайния шум чрез анализ на уейвлет коефициенти на различни мащаби.
  3. Засичане на преходни събития: Тя е особено добра в разпознаването на резки промени, пикове или преходни събития в сигнал - точно това, което бихме очаквали от острата физиологична реакция към прием на никотин.
Абстрактна визуализация на физиологичен сигнал, разложен чрез Stationary Wavelet Transform на множество честотни ленти.
Фиг. 2. – Визуализация на Stationary Wavelet Transform, която разлага сигнал на съставните му честотни компоненти във времето и помага за разпознаване на модели.

По същество SWT действа като сложен набор от филтри, който ни позволява да "видим" модели в HR, HRV и потенциално SpO2 данните, които иначе могат да бъдат скрити от шум или дългосрочни тенденции. Можем да търсим характерни "форми" или промени в енергията в конкретни уейвлет подленти, които съответстват на физиологичния тласък.

Пътят на разработката: от данни към засичане

  1. Събиране на данни (HealthKit): Настройване на надеждно фоново извличане на данни от HealthKit, с уважение към потребителските разрешения и ефективна обработка на обновленията.
  2. Предварителна обработка на сигнала: Почистване на входящите HR, HRV и SpO2 данни. Това включва обработка на липсващи точки и вероятно начално филтриране преди прилагане на SWT.
  3. Прилагане на SWT: Прилагане на Stationary Wavelet Transform върху сегменти от физиологичните времеви редове. Това включва избор на подходящ mother wavelet (например Daubechies, Symlet) и ниво на разлагане.
  4. Извличане на признаци от уейвлет коефициенти: Тук се случва магията (и много експериментиране). Вместо да гледаме директно суровите HR/HRV стойности, анализираме SWT коефициентите. Релевантни признаци могат да бъдат:
    • Енергия в конкретни ленти на detail coefficients около момента на подозирано събитие.
    • Статистически свойства (дисперсия, ексцес) на коефициентите.
    • Cross-correlation между уейвлет коефициенти на различни физиологични сигнали (например HR и HRV).
  5. Логика/модел за засичане: В началото това може да бъде rule-based система, която търси конкретни модели в извлечените уейвлет признаци (например "значим energy spike в HR detail coefficients при scale X, съвпадащ с рязък спад в energy в HRV detail coefficients при scale Y, по време на период с ниска физическа активност"). С времето това може да се развие в machine learning модел, обучен върху тези признаци.
  6. Оценка на увереност: Както е описано в моя MVPS алгоритъм, генерирането на confidence score за всяко засечено събитие е ключово, защото отразява силата и яснотата на сигнатурата.
  7. Имплементация на watchOS приложението: Изпълнение на основния алгоритъм за засичане върху Apple Watch, с оптимизация за батерия (например обработка на данни на batch-ове, интелигентно задействане на анализ).
  8. iOS companion app: За показване на timeline на засечените събития, предоставяне на insights и управление на настройките. Синхронизацията на данни чрез WatchConnectivity е ключова тук.

Здравни и етични съображения: философията на "огледалото"

Важно е да повторя, че "Still Mirror" е замислен като инструмент за осъзнаване, не като медицинско устройство или програма за отказване.

  • Privacy first: Цялата обработка, особено чувствителната алгоритмична работа, в идеалния случай трябва да се случва on-device. Достъпът до HealthKit данни е строго permission-based.
  • Без осъждане: Интерфейсът на приложението и всякакви insights, които предоставя, трябва да бъдат неутрални - просто да отразяват модели без предписващи съвети или засрамване.
  • Точност и прозрачност: Потребителите трябва да разбират ограниченията на приложението. False positives и false negatives са неизбежни при толкова сложно пасивно засичане. Прозрачността за увереността на засичанията е важна.
  • Овластяване на потребителя: Целта е да дадем на хората данни за собствените им тела и навици, за да могат сами да вземат информирани решения.

Учене на Swift и навигация в Apple екосистемата

За разработчици, които идват основно от други среди (като моите PHP/Laravel корени), навлизането в Swift, SwiftUI, Xcode и конкретните ограничения на watchOS разработката е сериозна крива на учене. Framework-ите на Apple имат своя специфична философия. Управлението на жизнения цикъл на приложенията, background tasks, HealthKit queries и комуникацията между устройства (WatchConnectivity) имат свои модели и "Apple начини" за правене на нещата. Въпреки това богатата документация, силната общност и мощта на Swift правят пътуването възнаграждаващо.

Заключение: потенциалът на един мълчалив наблюдател

"Still Mirror" все още е изследване - трудно начинание, което опитва да разшири границите на това, което пасивното sensing върху потребителско wearable устройство може да постигне. Stationary Wavelet Transform предлага обещаващ път за разрязване на сложни физиологични сигнали и откриване на фините сигнатури, които търсим.

Пътят включва не само писане на Swift и борба с Xcode, но и навлизане в теория на обработката на сигнали, разбиране на човешката физиология и внимателно обмисляне на етичните последици от такава технология. Независимо дали "Still Mirror" ще стане широко използвано приложение, или ще остане сложна техническа експедиция, самият процес е свидетелство за увлекателното пресичане на AI, здраве и лична технология. Става дума за опит да се построи онази тиха, отразяваща повърхност - неподвижно огледало - за по-дълбоко самоосъзнаване.

Какво мислите за използването на advanced signal processing като SWT за пасивно засичане на навици? Ще се радвам да чуя вашите мисли в коментарите по-долу!


Коментари

Boris D. Teoharov

Автор

Здравей, аз съм Борис

Не съм писател. Не съм философ. Просто съм backend инженер от България, който живее между Laravel опашки и индекси със стотици милиони редове. През останалото време чета медицина, която няма работа да чета, френски романи, които разбирам наполовина, и каквото още малката ми гумена глава реши да дъвче. Две спасени кучета ме държат честен.