File size: 4,082 Bytes
24b727a
 
35e1ecb
 
 
 
 
 
 
 
 
 
 
 
 
 
24b727a
 
2c9648a
24b727a
32e8f6f
24b727a
32e8f6f
 
 
24b727a
32e8f6f
24b727a
32e8f6f
24b727a
35e1ecb
 
 
 
24b727a
 
35e1ecb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32e8f6f
24b727a
32e8f6f
 
24b727a
32e8f6f
 
 
 
 
 
 
24b727a
32e8f6f
 
 
 
24b727a
32e8f6f
24b727a
32e8f6f
24b727a
32e8f6f
 
 
 
24b727a
32e8f6f
24b727a
32e8f6f
24b727a
32e8f6f
 
 
24b727a
32e8f6f
24b727a
32e8f6f
 
 
 
2c9648a
 
 
 
 
32e8f6f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
---
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.