OphtalmoCapture / README.md
TheBug95's picture
cambios en el readme para que HF funcione y en la base de datos
749d250
---
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 |