--- library_name: transformers tags: - video-classification - videomae - medical - pain-assessment - healthcare - computer-vision - pytorch metrics: - f1 - accuracy - recall - confusion_matrix - precision --- # Classificador de Dor em Vídeo Este modelo foi treinado para classificar vídeos de expressões faciais em três níveis de dor: - **High_Pain** (Dor Intensa) - **Low_Pain** (Dor Leve) - **No_Pain** (Sem Dor) ## Modelo O modelo é baseado no [VideoMAE](https://huggingface.co/MCG-NJU/videomae-base) (Video Masked Autoencoder) e foi refinado (fine-tuned) especificamente para detectar e classificar níveis de dor a partir de vídeos de expressões faciais. ## Exemplo de uso ```python import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' from transformers import VideoMAEImageProcessor, AutoModelForVideoClassification import torch import numpy as np import av def extract_frames(video_path, num_frames=16): frames = [] try: container = av.open(video_path) stream = container.streams.video[0] indices = np.linspace(0, stream.frames - 1, num=num_frames, dtype=int) for i, frame in enumerate(container.decode(stream)): if i in indices: img = frame.to_ndarray(format="rgb24") frames.append(img) if len(frames) == num_frames: break container.close() except Exception as e: print(f"Erro ao processar o vídeo: {e}") if len(frames) < num_frames: pad_size = num_frames - len(frames) if frames: last_frame = frames[-1] frames += [last_frame.copy() for _ in range(pad_size)] else: frames = [np.zeros((224, 224, 3), dtype=np.uint8)] * num_frames return frames processor = VideoMAEImageProcessor.from_pretrained("maike616/pain-classifier-video") model = AutoModelForVideoClassification.from_pretrained("maike616/pain-classifier-video") high = r'AI4Pain Dataset\Validation\video\high_pain\1_Pain_HIGH_20.mp4' low = r'AI4Pain Dataset\Validation\video\low_pain\1_Pain_LOW_3.mp4' no_pain = r'AI4Pain Dataset\Validation\video\no_pain\1_Rest_1.mp4' video_frames = extract_frames(no_pain) inputs = processor(video_frames, return_tensors="pt") with torch.no_grad(): outputs = model(**inputs) probs = torch.softmax(outputs.logits, dim=1) predicted_class_idx = outputs.logits.argmax(-1).item() predicted_class = model.config.id2label[predicted_class_idx] print(f"Classe predita: {predicted_class}") print(f"Probabilidades: {probs[0].tolist()}") ``` ## Detalhes do Treinamento ### Dataset O modelo foi treinado com um dataset de vídeos classificados em três categorias de intensidade de dor. ### Hiperparâmetros - **Arquitetura base**: VideoMAE - **Taxa de aprendizado**: 3e-5 - **Optimizer**: AdamW com weight decay de 0.01 - **Scheduler**: OneCycleLR - **Batch size**: 32 - **Número de frames**: 16 ### Técnicas aplicadas - Mixed Precision Training - Early Stopping baseado em F1-score - Amostragem uniforme de frames ## Métricas de Desempenho O modelo foi selecionado com base no F1-score macro na validação. As métricas incluem: - F1-score - Precision e Recall por classe - ROC AUC - Matrizes de confusão O monitoramento de métricas foi realizado usando Weights & Biases. ## Limitações - O modelo foi treinado para processar exatamente 16 frames por vídeo - O desempenho pode ser afetado pela qualidade da imagem, iluminação, e posicionamento facial - O modelo foi treinado com expressões faciais específicas e pode não generalizar bem para todos os tipos de expressão de dor ## Casos de Uso Este modelo é adequado para: - Pesquisa em análise de dor - Aplicações em saúde para monitoramento de pacientes - Estudos sobre expressões faciais e dor ## Créditos Este modelo utiliza o VideoMAE como base, desenvolvido pela MCG-NJU. O treinamento e adaptação para classificação de dor foram realizados como parte do projeto de pesquisa desenvolvido na WP3-Ceteli.