|
--- |
|
license: mit |
|
language: pt |
|
library_name: transformers |
|
tags: |
|
- audio |
|
- audio-classification |
|
- image-classification |
|
- heart-sound |
|
- phonocardiogram |
|
- vit |
|
- medical-ai |
|
datasets: |
|
- PhysioNet/CinC-Challenge-2016 |
|
metrics: |
|
- accuracy |
|
- f1 |
|
- precision |
|
- recall |
|
--- |
|
|
|
# Modelo Vision Transformer (ViT) para Classificação de Sons Cardíacos |
|
|
|
Este repositório contém um modelo de classificação de áudio, baseado na arquitetura **Vision Transformer (ViT)**, treinado para classificar sons cardíacos (Fonocardiogramas - PCG) como `normal` ou `abnormal`. |
|
|
|
O modelo foi desenvolvido utilizando uma abordagem de "som como imagem", onde os arquivos de áudio são convertidos em imagens de **espectrograma** e então classificados por um modelo de visão computacional de ponta, pré-treinado em milhões de imagens. |
|
|
|
- **Modelo Base:** `google/vit-base-patch16-224-in21k` |
|
- **Dataset de Treinamento:** [PhysioNet/CinC Challenge 2016](https://physionet.org/content/challenge-2016/1.0.0/) |
|
|
|
## Performance do Modelo |
|
|
|
O modelo foi avaliado em um conjunto de validação separado contendo 301 gravações. Os resultados demonstram um desempenho robusto, especialmente na identificação de casos anormais, resolvendo o principal desafio do modelo CNN anterior. |
|
|
|
- **Acurácia Geral:** 86% |
|
- **F1-Score (Macro Avg):** 0.86 |
|
- **Recall para "Anormal":** 89% |
|
|
|
### Matriz de Confusão |
|
|
|
 |
|
*(Nota: Após o upload, você pode substituir este link pelo link direto da sua imagem `matriz_confusao_vit.png` no repositório)* |
|
|
|
| | Previsto: Anormal | Previsto: Normal | |
|
| :------------ | :---------------: | :--------------: | |
|
| **Real: Anormal** | **134** (VP) | **17** (FN) | |
|
| **Real: Normal** | **24** (FP) | **126** (VN) | |
|
|
|
O ponto mais importante é o baixo número de **Falsos Negativos (17)**, indicando que o modelo tem alta sensibilidade para detectar casos anormais. |
|
|
|
### Relatório de Classificação |
|
|
|
precision recall f1-score support |
|
|
|
abnormal 0.85 0.89 0.87 151 |
|
normal 0.88 0.84 0.86 150 |
|
|
|
accuracy 0.86 301 |
|
macro avg 0.86 0.86 0.86 301 |
|
weighted avg 0.86 0.86 0.86 301 |
|
|
|
## Como Usar o Modelo |
|
|
|
Abaixo está um exemplo de como carregar o modelo e o processador a partir do Hub para fazer uma predição em um novo arquivo de áudio. |
|
|
|
```python |
|
import torch |
|
import librosa |
|
import numpy as np |
|
from transformers import AutoImageProcessor, AutoModelForImageClassification |
|
from PIL import Image |
|
from scipy.signal import butter, lfilter |
|
|
|
# --- Parâmetros de Processamento --- |
|
TARGET_SR = 2000 |
|
LOWCUT = 20.0 |
|
HIGHCUT = 200.0 |
|
|
|
# --- Funções de Pré-processamento (do nosso audio_processor.py) --- |
|
def butter_bandpass_filter(data, fs, order=3): |
|
nyq = 0.5 * fs |
|
low = LOWCUT / nyq |
|
high = HIGHCUT / nyq |
|
b, a = butter(order, [low, high], btype='band') |
|
return lfilter(b, a, data) |
|
|
|
def create_spectrogram_image(audio_array, sr): |
|
mel_spec = librosa.feature.melspectrogram(y=audio_array, sr=sr, n_mels=128) |
|
S_DB = librosa.power_to_db(mel_spec, ref=np.max) |
|
img_array = (S_DB - S_DB.min()) / (S_DB.max() - S_DB.min() + 1e-6) * 255.0 |
|
return Image.fromarray(img_array.astype(np.uint8)).convert("RGB") |
|
|
|
# --- Carregar Modelo e Processador --- |
|
model_name_or_path = "SEU_USUARIO/SEU_NOME_DE_REPOSITORIO" # <-- TROCAR AQUI |
|
processor = AutoImageProcessor.from_pretrained(model_name_or_path) |
|
model = AutoModelForImageClassification.from_pretrained(model_name_or_path) |
|
|
|
# --- Fazer a Predição --- |
|
audio_file_path = "caminho/para/seu/audio.wav" |
|
|
|
# 1. Carregar e reamostrar o áudio |
|
y, sr_orig = librosa.load(audio_file_path, sr=None) |
|
y_resampled = librosa.resample(y=y, orig_sr=sr_orig, target_sr=TARGET_SR) |
|
|
|
# 2. Limpar o áudio com o filtro |
|
y_cleaned = butter_bandpass_filter(y_resampled, fs=TARGET_SR) |
|
|
|
# 3. Criar a imagem do espectrograma |
|
spectrogram = create_spectrogram_image(y_cleaned, sr=TARGET_SR) |
|
|
|
# 4. Processar a imagem e fazer a predição |
|
inputs = processor(images=spectrogram, return_tensors="pt") |
|
with torch.no_grad(): |
|
outputs = model(**inputs) |
|
logits = outputs.logits |
|
|
|
predicted_class_idx = logits.argmax(-1).item() |
|
predicted_class = model.config.id2label[predicted_class_idx] |
|
print(f"Resultado da Predição: {predicted_class.upper()}") |
|
|
|
⚠️ Limitações e Uso Responsável |
|
ESTE MODELO É UM PROTÓTIPO PARA FINS DE PESQUISA E EDUCACIONAIS. ELE NÃO É UM DISPOSITIVO MÉDICO E NÃO SUBSTITUI O DIAGNÓSTICO DE UM PROFISSIONAL DE SAÚDE QUALIFICADO. |
|
|
|
A performance do modelo depende criticamente da qualidade da gravação de áudio (posição do microfone, ruído ambiente, etc.). |
|
|
|
O modelo foi treinado em um dataset específico e pode não generalizar perfeitamente para áudios capturados com equipamentos diferentes. |
|
|
|
Nunca utilize os resultados deste modelo para tomar decisões sobre sua saúde. Sempre consulte um médico cardiologista para qualquer preocupação. |