File size: 6,506 Bytes
749d250
 
 
 
 
 
 
 
 
 
b0c3a57
a99c555
b0c3a57
a99c555
b0c3a57
a99c555
b0c3a57
a99c555
b0c3a57
a99c555
b0c3a57
 
 
 
 
 
a99c555
b0c3a57
a99c555
b0c3a57
 
 
 
 
 
 
 
 
 
a99c555
 
b0c3a57
a99c555
b0c3a57
 
a99c555
b0c3a57
 
 
a99c555
b0c3a57
a99c555
b0c3a57
 
 
a99c555
b0c3a57
a99c555
b0c3a57
 
 
 
 
a99c555
b0c3a57
a99c555
b0c3a57
 
 
a99c555
b0c3a57
 
 
 
a99c555
b0c3a57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a99c555
b0c3a57
a99c555
b0c3a57
a99c555
b0c3a57
a99c555
b0c3a57
 
 
 
 
 
 
 
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
---
title: OphthalmoCapture
emoji: 👁️
colorFrom: blue
colorTo: green
sdk: docker
app_file: interface/main.py
pinned: false
---

# 👁️ OphthalmoCapture

**Sistema de Etiquetado Médico Oftalmológico** — Interfaz web para cargar imágenes de fondo de ojo, etiquetarlas (catarata / no catarata), dictar observaciones por voz con transcripción automática (Whisper) y descargar el paquete de etiquetado completo.

> **Modelo de sesión efímera:** las imágenes y el audio viven únicamente en la memoria del navegador/servidor durante la sesión. Nunca se persisten en disco ni en base de datos. Solo se almacenan metadatos de auditoría (etiqueta, transcripción, médico, fecha).

---

## 1. Requisitos previos

| Requisito | Versión mínima | Notas |
|-----------|---------------|-------|
| **Python** | 3.10+ | Recomendado 3.11 |
| **pip** | 23+ | — |
| **FFmpeg** | cualquier versión reciente | Necesario para OpenAI Whisper. [Instrucciones de instalación](https://ffmpeg.org/download.html) |
| **GPU (opcional)** | CUDA 11.8+ | Acelera la transcripción con Whisper. Funciona sin GPU usando CPU. |

---

## 2. Instalación

### A. Clonar el repositorio

```bash
git clone <URL_DEL_REPO>
cd Automatic-Labeling-with-Medgemma
```

### B. Crear un entorno virtual (recomendado)

```bash
python -m venv .venv

# Windows
.venv\Scripts\activate

# Linux / macOS
source .venv/bin/activate
```

### C. Instalar dependencias

```bash
pip install -r requirements.txt
```

Esto instala: `streamlit`, `openai-whisper`, `torch`, `pandas`, `pillow`, `streamlit-authenticator` y demás dependencias.

> **Nota sobre PyTorch:** si tienes GPU NVIDIA y quieres usarla para Whisper, instala la versión con CUDA antes de instalar los requisitos:
> ```bash
> pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
> pip install -r requirements.txt
> ```

### D. Verificar FFmpeg

```bash
ffmpeg -version
```

Si no está instalado:
- **Windows:** `winget install ffmpeg` o descargar desde [ffmpeg.org](https://ffmpeg.org/download.html)
- **macOS:** `brew install ffmpeg`
- **Linux:** `sudo apt install ffmpeg`

---

## 3. Ejecutar la interfaz web (Streamlit)

```bash
streamlit run interface/main.py
```

Se abrirá automáticamente en el navegador en **http://localhost:8501**.

### Flujo de uso

1. **Autenticación** — Si `streamlit-authenticator` está instalado, inicia sesión con las credenciales configuradas. Si no, entra en modo anónimo automáticamente.
2. **Cargar imágenes** — Arrastra o selecciona imágenes de fondo de ojo (JPG, PNG, TIFF, máx. 50 MB cada una).
3. **Galería** — Se muestra una tira de miniaturas con indicadores 🔴 (pendiente) / 🟢 (etiquetada). Haz clic para seleccionar.
4. **Etiquetar** — Clasifica la imagen como *Catarata* o *No Catarata*.
5. **Dictar observaciones** — Graba audio con el micrófono. Whisper transcribe automáticamente con timestamps. Puedes editar el texto resultante.
6. **Descargar** — Descarga un ZIP individual (imagen + metadatos + audio + transcripción) o un paquete de la sesión completa. También disponible en formatos ML (HuggingFace CSV, JSONL).
7. **Finalizar sesión** — El botón del sidebar limpia toda la memoria. También hay timeout automático de 30 min de inactividad.

### Configuración

Los parámetros se encuentran en `interface/config.py`:

| Parámetro | Valor por defecto | Descripción |
|-----------|-------------------|-------------|
| `SESSION_TIMEOUT_MINUTES` | 30 | Minutos de inactividad antes de limpiar la sesión |
| `MAX_UPLOAD_SIZE_MB` | 50 | Tamaño máximo por imagen |
| `ALLOWED_EXTENSIONS` | jpg, jpeg, png, tif | Formatos de imagen aceptados |
| `WHISPER_MODEL_OPTIONS` | tiny → turbo | Modelos de Whisper disponibles |
| `DEFAULT_WHISPER_LANGUAGE` | es | Idioma por defecto para transcripción |
| `UI_LANGUAGE` | es | Idioma de la interfaz (es / en) |
| `LABEL_OPTIONS` | Catarata, No Catarata | Categorías de etiquetado |

### Credenciales por defecto (modo autenticación)

| Usuario | Contraseña | Rol |
|---------|------------|-----|
| admin | admin123 | Administrador |
| doctor1 | admin123 | Médico |
| doctor2 | admin123 | Médico |

> ⚠️ Cambia estas credenciales en `interface/services/auth_service.py` antes de cualquier uso en producción.

---

## 4. Estructura del proyecto

```
interface/
├── main.py                  # Orquestador principal de Streamlit
├── config.py                # Constantes de configuración
├── database.py              # Persistencia de metadatos (SQLite)
├── utils.py                 # Utilidades generales (validación de imágenes)
├── i18n.py                  # Internacionalización (es/en)
├── components/
│   ├── uploader.py          # Carga de imágenes con validación
│   ├── gallery.py           # Galería de miniaturas con estado
│   ├── labeler.py           # Clasificación (catarata / no catarata)
│   ├── recorder.py          # Grabación de audio + transcripción Whisper
│   └── downloader.py        # Descarga individual, masiva y formatos ML
├── services/
│   ├── session_manager.py   # Gestión de sesión efímera en memoria
│   ├── whisper_service.py   # Carga y transcripción con Whisper
│   ├── export_service.py    # Generación de ZIP, CSV, JSONL
│   └── auth_service.py      # Autenticación (opcional)
└── .streamlit/
    └── config.toml          # Configuración de Streamlit
```

---

## 5. Ejecutar el Notebook (Jupyter)

Para explorar el modelo MedGemma, afinar parámetros o depurar:

```bash
jupyter notebook medgemma.ipynb
```

Ejecuta las celdas secuencialmente con **Shift + Enter**.

---

## 6. Solución de problemas

| Problema | Solución |
|----------|----------|
| `ModuleNotFoundError: No module named 'whisper'` | `pip install openai-whisper` |
| `FileNotFoundError: ffmpeg not found` | Instala FFmpeg (ver sección 2.D) |
| Audio no se graba en el navegador | Asegúrate de acceder por `localhost` o HTTPS. Los navegadores bloquean el micrófono en HTTP no local. |
| `streamlit-authenticator` no disponible | La app funciona en modo anónimo automáticamente. Instalar con `pip install streamlit-authenticator` si se desea autenticación. |
| Timeout de sesión inesperado | Ajusta `SESSION_TIMEOUT_MINUTES` en `config.py` |
| Imágenes no se cargan | Verifica que el formato sea JPG/PNG/TIFF y que no supere 50 MB |