Spaces:
Sleeping
Sleeping
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 |
|