Detecção de AFib em smartwatch com IA: pipeline, qualidade de sinal e score

Detecção de AFib em smartwatch com IA: pipeline, qualidade de sinal e score

Smartwatch já não é só “contar passos”. O ponto que me interessa é outro: com IA e sensores mais finos, esses relógios estão a começar a sinalizar riscos antes de aparecerem sintomas. Segundo o Sapo.pt, a combinação de biometria contínua com modelos de IA pode gerar alertas precoces — e uma das funcionalidades mais promissoras é a deteção de fibrilhação auricular (AFib), com taxas de correspondência relevantes em estudos com Apple Watch.

Na prática, o que o smartwatch faz não é “detectar uma doença” como um médico faz. Ele detecta padrões fisiológicos fora do normal e tenta traduzir isso em risco. E aí mora tanto a potência quanto o perigo: se você não entender o que é dado, o que é predição e o que é falso positivo, vai construir expectativas erradas (ou até decisões erradas).

Como a IA num smartwatch realmente “antecipa” doenças (sem magia)

Quando desenvolvedores ouvem “IA detetou doença”, a tendência é imaginar um classificador direto para “AFib” ou “diabetes”. Mas no mundo real, o fluxo costuma ser assim:

  • Coleta: sensores (fotopletismografia para batimentos/variabilidade, eletrocardiograma em modelos com eletrodos, acelerômetro, temperatura/pele em alguns casos).
  • Pré-processamento: limpar ruído (movimento, má aderência, iluminação, artefatos).
  • Extração de features: extrair métricas relevantes (intervalos RR, irregularidade, padrões de condução, variação ao longo do tempo).
  • Modelo de IA: classificar “evento provável” vs “sem evento” com base no histórico e no contexto.
  • Personalização: comparar com o “normal” do próprio utilizador, porque cada corpo tem baseline.
  • Alertas e triagem: reduzir alarmes e pedir confirmação/ação quando a confiança é alta.

O Sapo.pt descreve exatamente essa lógica ao afirmar que o relógio não “descobre” diretamente a doença; ele compara indicadores fisiológicos com padrões habituais e alerta quando múltiplas alterações aparecem simultaneamente.

AFib como caso de uso: por que esse é o mais falado

Fibrilhação auricular (AFib) é uma arritmia associada a risco aumentado de AVC. Em estudos citados pelo Sapo.pt, os alertas de ritmo cardíaco irregular do Apple Watch corresponderam a casos de AFib em cerca de 84% nas situações analisadas.

O que isso significa para quem programa? Que o problema de classificação provavelmente está bem escolhido para “sinais” detectáveis por sensores e algoritmos, e que o conjunto de dados (com rótulos clínicos) permite treinar modelos com desempenho clinicamente útil. Mas também significa que 16% das vezes o alerta pode não ser AFib — e isso precisa virar produto responsável: reduzir pânico, orientar verificação e não tratar como diagnóstico definitivo.

Arquitetura típica: o que dá errado quando a IA vai para o wearable

Eu já vi várias versões de pipeline falhar nesse tipo de produto. Não é porque a IA é “ruim”. É porque a realidade do campo é caótica. Alguns pontos técnicos que entram forte aqui:

  • Ruído do sensor: movimento e má adaptação do relógio na pele. Isso muda completamente o sinal.
  • Deriva do baseline: o “normal” do utilizador muda com treino, stress, sono, álcool, febre.
  • Dados desbalanceados: eventos raros (AFib) vs horas/dias de ritmo normal.
  • Privacidade: nem sempre dá para enviar tudo para a nuvem; às vezes parte do modelo roda on-device.
  • Calibração e qualidade: sem um gate de qualidade, você treina e alerta no lixo.

O “porquê” dessas decisões: em saúde, o custo do erro não é simétrico. Falso positivo pode causar ansiedade e exames desnecessários. Falso negativo pode atrasar cuidado. Então o produto precisa de métricas que reflitam isso (sensibilidade vs especificidade, curva ROC/PR, e calibragem de probabilidade).

On-device vs cloud: trade-off real

Uma comparação prática que sempre volta:

  • On-device: menor latência, melhor privacidade, mas limita modelo grande e atualização frequente.
  • Cloud: mais capacidade e atualização, mas adiciona latência, dependência de conectividade e riscos de privacidade.

Para IA de saúde, eu costumo defender uma abordagem híbrida: pré-processamento e detecção preliminar on-device, com confirmação/calibração em algum fluxo seguro quando necessário. Isso reduz custo e aumenta responsividade.

Na Prática: como implementar um “alerta de irregularidade” com qualidade de dados

Vou mostrar um exemplo didático e funcional: um pipeline simples para detetar irregularidade em séries de intervalos RR (batimento a batimento). Não é AFib de produção, mas serve para mostrar o que importa: qualidade do sinal, features e decisão com thresholds.

Passo a passo

  1. Receber dados: intervalo RR (ms) ou timestamp por batimento.
  2. Validar qualidade: remover segmentos com poucos batimentos, outliers extremos e janelas “corrompidas”.
  3. Gerar features: usar variabilidade (ex.: SDNN), irregularidade (ex.: RMSSD) e métricas de “mudança brusca”.
  4. Comparar com baseline: em vez de um threshold universal, usar estatísticas do próprio usuário.
  5. Gerar score: combinar features num score e aplicar limiar com margem.
  6. Alertar com contexto: mandar “possível evento” com instruções claras (“verificar com ECG/consulta”), não “você tem a doença”.

Exemplo de código (Python): score simples + gate de qualidade

import numpy as np

def rmssd(rr_ms: np.ndarray) -> float:
    # RMSSD: sqrt(mean(diff(RR)^2))
    d = np.diff(rr_ms)
    return float(np.sqrt(np.mean(d ** 2)))

def sdnn(rr_ms: np.ndarray) -> float:
    # SDNN: desvio padrão dos intervalos RR
    return float(np.std(rr_ms, ddof=1))

def quality_gate(rr_ms: np.ndarray, min_beats: int = 30) -> bool:
    if rr_ms.size < min_beats:
        return False
    # remove RR absurdos (ex.: < 300ms > 2000ms)
    if np.any(rr_ms < 300) or np.any(rr_ms > 2000):
        return False
    return True

def irregularity_score(rr_ms: np.ndarray, baseline: dict) -> float:
    """
    baseline: {"rmssd_mean": ..., "rmssd_std": ..., "sdnn_mean": ..., "sdnn_std": ...}
    """
    if not quality_gate(rr_ms):
        return 0.0

    r = rmssd(rr_ms)
    s = sdnn(rr_ms)

    # z-scores com baseline do próprio utilizador
    z_r = 0.0 if baseline["rmssd_std"] == 0 else (r - baseline["rmssd_mean"]) / baseline["rmssd_std"]
    z_s = 0.0 if baseline["sdnn_std"] == 0 else (s - baseline["sdnn_mean"]) / baseline["sdnn_std"]

    # score simples: combina irregularidade e variabilidade
    # porquê: junta múltiplas dimensões para reduzir falso positivo isolado
    score = 0.6 * z_r + 0.4 * z_s

    return float(score)

# Exemplo de uso:
baseline = {"rmssd_mean": 35.0, "rmssd_std": 10.0, "sdnn_mean": 55.0, "sdnn_std": 15.0}

# rr_ms de uma janela capturada
rr = np.array([810, 790, 820, 760, 830, 780, 840, 770, 820] + [800]*40, dtype=float)

score = irregularity_score(rr, baseline)

THRESHOLD = 2.0
if score > THRESHOLD:
    alert = "Possível irregularidade. Confirmar com ECG e procurar orientação médica."
else:
    alert = "Sem evidência suficiente na janela atual."

print(score, alert)

O que eu gosto nesse exemplo é o “porquê” por trás dos componentes:

  • Gate de qualidade evita que você alerte no sinal ruim.
  • Baseline por utilizador reduz erros por variações individuais.
  • Score baseado em múltiplas features evita depender de uma métrica única.
  • Alertar como “possível” protege o usuário e reduz responsabilidade incorreta.

Alternativas reais: comparação com métodos clássicos e com outros sensores

Do ponto de vista de engenharia, IA não é a única opção. Você tem caminhos alternativos — e isso importa para decidir arquitetura.

  • Métodos heurísticos (ex.: limiares de irregularidade): simples, rápidos, mas sofrem com mudanças de baseline e ruído.
  • Modelos estatísticos (ex.: HMM/Markov, modelos de séries temporais): podem capturar sequência melhor, mas exigem modelagem cuidadosa e calibragem.
  • Redes neurais (1D CNN, Transformers leves): geralmente melhores em padrões complexos, mas precisam de dados rotulados e gestão de viés.
  • Fusão multimodal: usar acelerômetro + qualidade de sinal + biometria. Isso reduz alertas em movimento.

Na prática, eu vejo que os produtos mais sólidos tendem a combinar: heurísticas de qualidade + modelo ML para classificação + regras de produto para reduzir alertas desnecessários.

Erros Comuns: o que evitar quando você tenta fazer “detecção precoce”

Aqui vão armadilhas que devs cometem (e que eu já vi virar bug clínico/produto):

  • Confundir “correlação” com “diagnóstico”: alertas devem ser triagem. Sempre trate como risco, não como certeza.
  • Sem gate de qualidade: se o sensor está “ruim”, qualquer modelo vira ruído. Resultado: falso positivo em massa.
  • Treinar em dados limpos e testar no mundo real: o mundo real tem aderência ruim, ruído e usuários inconsistentes.
  • Threshold fixo universal: cada pessoa tem baseline e fisiologia própria. Você precisa de personalização ou calibração.
  • Ignorar custo de falso positivo: em saúde, “errado para cima” custa caro. Use métricas alinhadas com o risco.
  • Logs sem consentimento e sem minimização: privacidade é requisito, não detalhe. Crie pipelines de dados com governança.

O detalhe que quase ninguém pensa: mesmo com alta taxa de acerto (como o 84% citado pelo Sapo.pt), ainda existem cenários de erro que podem ser raros, mas impactantes. Por isso, produto e UX têm de guiar o usuário para confirmação (ex.: ECG, consulta) quando o sistema detecta irregularidade.

Implicações práticas para quem desenvolve e para o dia a dia do usuário

Se você programa sistemas ligados a saúde, o Sapo.pt sugere uma tendência: wearables viram “camada de monitorização e triagem”. Isso muda exigências:

  • Observabilidade: você precisa saber quando o modelo alerta por qualidade baixa vs qualidade boa.
  • Calibração e atualização: o baseline muda; o modelo precisa se adaptar (ou ao menos reavaliar thresholds).
  • Design de alertas: mensagens curtas e acionáveis. Nada de “tem a doença”.
  • Testes com usuários reais: laboratório não reflete movimento, pele e uso no cotidiano.

Para o usuário avançado (ou engenheiro que usa wearable), a melhor prática é entender que um alerta é um sinal para agir, não uma sentença. Quando a tecnologia está bem desenhada, ela reduz o tempo até confirmação clínica. Quando está mal desenhada, ela só multiplica ansiedade.

FAQ

Um smartwatch “diagnostica” fibrilhação auricular?

Não. Ele gera alertas com base em padrões e comparação com baseline. Segundo o Sapo.pt, no estudo com Apple Watch os alertas de ritmo irregular corresponderam a AFib em cerca de 84% das situações analisadas, mas isso ainda não é um diagnóstico final.

Por que o sistema precisa comparar com o “normal” da pessoa?

Porque a variabilidade fisiológica é individual. Um threshold universal produz muitos falsos positivos/negativos. A personalização melhora sensibilidade sem explodir alertas em usuários específicos.

Quais sensores são mais relevantes para esse tipo de detecção?

Em geral, frequência cardíaca via fotopletismografia e, em alguns modelos, ECG. Mas o “pulo do gato” costuma ser a fusão com sinais de qualidade (movimento/aderência) e o pré-processamento para remover artefatos.

Como reduzir falso positivo nos alertas?

Use gate de qualidade, combine múltiplas features (não só uma métrica), aplique thresholds calibrados por usuário e introduza confirmação quando a confiança do modelo for alta o suficiente.

Isso substitui consulta médica?

Não. O objetivo é triagem e prevenção. Alertas devem orientar passos de confirmação (por exemplo, ECG adicional) e procurar avaliação quando necessário.

Gostou? Me segue no GitHub e deixa um comentário se tiver dúvida ou quiser aprofundar algum ponto.

Y

Yuri Sousa

Front-End Developer / Designer

Desenvolvedor apaixonado por criar experiências digitais acessíveis e visualmente perfeitas. Escrevo sobre desenvolvimento web, design e tecnologia.