--- 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 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 |