victormattosli's picture
Update README.md
c316bdf verified
---
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
![Matriz de Confusão do Modelo ViT](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/confusion-matrix.png)
*(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.