Some checks failed
build_docker / build_cpu (pull_request) Has been cancelled
build_docker / build_gpu (pull_request) Has been cancelled
build_docker / build_easyocr (pull_request) Has been cancelled
build_docker / build_easyocr_gpu (pull_request) Has been cancelled
build_docker / build_doctr (pull_request) Has been cancelled
build_docker / build_doctr_gpu (pull_request) Has been cancelled
build_docker / build_raytune (pull_request) Has been cancelled
build_docker / essential (pull_request) Successful in 0s
293 lines
12 KiB
Markdown
293 lines
12 KiB
Markdown
# Objetivos concretos y metodología de trabajo
|
||
|
||
Este capítulo establece los objetivos del trabajo siguiendo la metodología SMART (Doran, 1981) y describe la metodología experimental empleada para alcanzarlos. Se define un objetivo general y cinco objetivos específicos, todos ellos medibles y verificables.
|
||
|
||
## Objetivo general
|
||
|
||
> **Optimizar el rendimiento de PaddleOCR para documentos académicos en español mediante ajuste de hiperparámetros, alcanzando un CER inferior al 2% sin requerir fine-tuning del modelo.**
|
||
|
||
### Justificación SMART del Objetivo General
|
||
|
||
**Tabla 4.** *Justificación SMART del objetivo general.*
|
||
|
||
| Criterio | Cumplimiento |
|
||
|----------|--------------|
|
||
| **Específico (S)** | Se define claramente qué se quiere lograr: optimizar PaddleOCR mediante ajuste de hiperparámetros para documentos en español |
|
||
| **Medible (M)** | Se establece una métrica cuantificable: CER < 2% |
|
||
| **Alcanzable (A)** | Es viable dado que: (1) PaddleOCR permite configuración de hiperparámetros, (2) Ray Tune posibilita búsqueda automatizada, (3) Aceleración GPU disponible para experimentación eficiente |
|
||
| **Relevante (R)** | El impacto es demostrable: mejora la extracción de texto en documentos académicos sin costes adicionales de infraestructura |
|
||
| **Temporal (T)** | El plazo es un cuatrimestre, correspondiente al TFM |
|
||
|
||
*Fuente: Elaboración propia.*
|
||
|
||
## Objetivos específicos
|
||
|
||
### OE1: Comparar soluciones OCR de código abierto
|
||
> **Evaluar el rendimiento base de EasyOCR, PaddleOCR y DocTR en documentos académicos en español, utilizando CER y WER como métricas, para seleccionar el modelo más prometedor.**
|
||
|
||
### OE2: Preparar un dataset de evaluación
|
||
> **Construir un dataset estructurado de imágenes de documentos académicos en español con su texto de referencia (ground truth) extraído del PDF original.**
|
||
|
||
### OE3: Identificar hiperparámetros críticos
|
||
> **Analizar la correlación entre los hiperparámetros de PaddleOCR y las métricas de error para identificar los parámetros con mayor impacto en el rendimiento.**
|
||
|
||
### OE4: Optimizar hiperparámetros con Ray Tune
|
||
> **Ejecutar una búsqueda automatizada de hiperparámetros utilizando Ray Tune con Optuna, evaluando al menos 50 configuraciones diferentes.**
|
||
|
||
### OE5: Validar la configuración optimizada
|
||
> **Comparar el rendimiento de la configuración baseline versus la configuración optimizada sobre el dataset completo, documentando la mejora obtenida.**
|
||
|
||
## Metodología del trabajo
|
||
|
||
### Visión General
|
||
|
||
|
||
|
||
```mermaid
|
||
---
|
||
title: "Fases de la metodología experimental"
|
||
config:
|
||
theme: base
|
||
themeVariables:
|
||
primaryColor: "#E6F4F9"
|
||
primaryTextColor: "#404040"
|
||
primaryBorderColor: "#0098CD"
|
||
lineColor: "#0098CD"
|
||
---
|
||
flowchart LR
|
||
A["Fase 1<br/>Dataset"] --> B["Fase 2<br/>Benchmark"] --> C["Fase 3<br/>Espacio"] --> D["Fase 4<br/>Optimización"] --> E["Fase 5<br/>Validación"]
|
||
```
|
||
|
||
**Descripción de las fases:**
|
||
|
||
- **Fase 1 - Preparación del Dataset**: Conversión PDF a imágenes (300 DPI), extracción de ground truth con PyMuPDF
|
||
- **Fase 2 - Benchmark Comparativo**: Evaluación de EasyOCR, PaddleOCR, DocTR con métricas CER/WER
|
||
- **Fase 3 - Espacio de Búsqueda**: Identificación de hiperparámetros y configuración de Ray Tune + Optuna
|
||
- **Fase 4 - Optimización**: Ejecución de 64 trials con paralelización (2 concurrentes)
|
||
- **Fase 5 - Validación**: Comparación baseline vs optimizado, análisis de correlaciones
|
||
|
||
### Fase 1: Preparación del Dataset
|
||
|
||
#### Fuente de Datos
|
||
Se utilizaron documentos PDF académicos de UNIR (Universidad Internacional de La Rioja), específicamente las instrucciones para la elaboración del TFE del Máster en Inteligencia Artificial.
|
||
|
||
#### Proceso de Conversión
|
||
El script `prepare_dataset.ipynb` implementa:
|
||
|
||
1. **Conversión PDF a imágenes**:
|
||
- Biblioteca: PyMuPDF (fitz)
|
||
- Resolución: 300 DPI
|
||
- Formato de salida: PNG
|
||
|
||
2. **Extracción de texto de referencia**:
|
||
- Método: `page.get_text("dict")` de PyMuPDF
|
||
- Preservación de estructura de líneas
|
||
- Tratamiento de texto vertical/marginal
|
||
- Normalización de espacios y saltos de línea
|
||
|
||
#### Estructura del Dataset
|
||
|
||
```mermaid
|
||
---
|
||
title: "Estructura del dataset de evaluación"
|
||
config:
|
||
theme: base
|
||
themeVariables:
|
||
primaryColor: "#E6F4F9"
|
||
primaryTextColor: "#404040"
|
||
primaryBorderColor: "#0098CD"
|
||
lineColor: "#0098CD"
|
||
---
|
||
flowchart LR
|
||
dataset["dataset/"] --> d0["0/"]
|
||
|
||
d0 --> pdf["instrucciones.pdf"]
|
||
|
||
d0 --> img["img/"]
|
||
img --> img1["page_0001.png"]
|
||
img --> img2["page_0002.png"]
|
||
img --> imgN["..."]
|
||
|
||
d0 --> txt["txt/"]
|
||
txt --> txt1["page_0001.txt"]
|
||
txt --> txt2["page_0002.txt"]
|
||
txt --> txtN["..."]
|
||
|
||
dataset --> dots["..."]
|
||
```
|
||
|
||
#### Clase ImageTextDataset
|
||
|
||
Se implementó una clase Python para cargar pares imagen-texto que retorna tuplas (PIL.Image, str) desde carpetas pareadas. La implementación completa está disponible en `src/ocr_benchmark_notebook.ipynb` (ver Anexo A).
|
||
|
||
### Fase 2: Benchmark Comparativo
|
||
|
||
#### Modelos Evaluados
|
||
|
||
**Tabla 5.** *Modelos OCR evaluados en el benchmark inicial.*
|
||
|
||
| Modelo | Versión | Configuración |
|
||
|--------|---------|---------------|
|
||
| EasyOCR | - | Idiomas: ['es', 'en'] |
|
||
| PaddleOCR | PP-OCRv5 | Modelos server_det + server_rec |
|
||
| DocTR | - | db_resnet50 + sar_resnet31 |
|
||
|
||
*Fuente: Elaboración propia.*
|
||
|
||
#### Métricas de Evaluación
|
||
|
||
Se utilizó la biblioteca `jiwer` para calcular CER y WER comparando el texto de referencia con la predicción del modelo OCR. La implementación está disponible en `src/ocr_benchmark_notebook.ipynb` (ver Anexo A).
|
||
|
||
### Fase 3: Espacio de Búsqueda
|
||
|
||
#### Hiperparámetros Seleccionados
|
||
|
||
**Tabla 6.** *Hiperparámetros seleccionados para optimización.*
|
||
|
||
| Parámetro | Tipo | Rango/Valores | Descripción |
|
||
|-----------|------|---------------|-------------|
|
||
| `use_doc_orientation_classify` | Booleano | [True, False] | Clasificación de orientación del documento |
|
||
| `use_doc_unwarping` | Booleano | [True, False] | Corrección de deformación del documento |
|
||
| `textline_orientation` | Booleano | [True, False] | Clasificación de orientación de línea de texto |
|
||
| `text_det_thresh` | Continuo | [0.0, 0.7] | Umbral de detección de píxeles de texto |
|
||
| `text_det_box_thresh` | Continuo | [0.0, 0.7] | Umbral de caja de detección |
|
||
| `text_det_unclip_ratio` | Fijo | 0.0 | Coeficiente de expansión (fijado) |
|
||
| `text_rec_score_thresh` | Continuo | [0.0, 0.7] | Umbral de confianza de reconocimiento |
|
||
|
||
*Fuente: Elaboración propia.*
|
||
|
||
#### Configuración de Ray Tune
|
||
|
||
El espacio de búsqueda se definió utilizando `tune.choice()` para parámetros booleanos y `tune.uniform()` para parámetros continuos, con OptunaSearch como algoritmo de optimización configurado para minimizar CER en 64 trials. La implementación completa está disponible en `src/raytune/raytune_ocr.py` (ver Anexo A).
|
||
|
||
### Fase 4: Ejecución de Optimización
|
||
|
||
#### Arquitectura de Ejecución
|
||
|
||
Se implementó una arquitectura basada en contenedores Docker para aislar los servicios OCR y facilitar la reproducibilidad (ver sección 4.2.3 para detalles de la arquitectura).
|
||
|
||
#### Ejecución con Docker Compose
|
||
|
||
Los servicios se orquestan mediante Docker Compose (`src/docker-compose.tuning.*.yml`):
|
||
|
||
```bash
|
||
# Iniciar servicio OCR
|
||
docker compose -f docker-compose.tuning.doctr.yml up -d doctr-gpu
|
||
|
||
# Ejecutar optimización (64 trials)
|
||
docker compose -f docker-compose.tuning.doctr.yml run raytune --service doctr --samples 64
|
||
|
||
# Detener servicios
|
||
docker compose -f docker-compose.tuning.doctr.yml down
|
||
```
|
||
|
||
El servicio OCR expone una API REST que retorna métricas en formato JSON:
|
||
|
||
```json
|
||
{
|
||
"CER": 0.0149,
|
||
"WER": 0.0762,
|
||
"TIME": 15.8,
|
||
"PAGES": 5,
|
||
"TIME_PER_PAGE": 3.16
|
||
}
|
||
```
|
||
|
||
### Fase 5: Validación
|
||
|
||
#### Protocolo de Validación
|
||
|
||
1. **Baseline**: Ejecución con configuración por defecto de PaddleOCR
|
||
2. **Optimizado**: Ejecución con mejor configuración encontrada
|
||
3. **Comparación**: Evaluación sobre las 45 páginas del dataset completo
|
||
4. **Métricas reportadas**: CER, WER, tiempo de procesamiento
|
||
|
||
### Entorno de Ejecución
|
||
|
||
#### Hardware
|
||
|
||
**Tabla 7.** *Especificaciones de hardware del entorno de desarrollo.*
|
||
|
||
| Componente | Especificación |
|
||
|------------|----------------|
|
||
| CPU | AMD Ryzen 7 5800H |
|
||
| RAM | 16 GB DDR4 |
|
||
| GPU | NVIDIA RTX 3060 Laptop (5.66 GB VRAM) |
|
||
| Almacenamiento | SSD |
|
||
|
||
*Fuente: Elaboración propia.*
|
||
|
||
#### Software
|
||
|
||
**Tabla 8.** *Versiones de software utilizadas.*
|
||
|
||
| Componente | Versión |
|
||
|------------|---------|
|
||
| Sistema Operativo | Ubuntu 24.04.3 LTS |
|
||
| Python | 3.12.3 |
|
||
| PaddleOCR | 3.3.2 |
|
||
| PaddlePaddle | 3.2.2 |
|
||
| Ray | 2.52.1 |
|
||
| Optuna | 4.7.0 |
|
||
|
||
*Fuente: Elaboración propia.*
|
||
|
||
#### Justificación de Ejecución Local vs Cloud
|
||
|
||
La decisión de ejecutar los experimentos en hardware local en lugar de utilizar servicios cloud se fundamenta en un análisis de costos y beneficios operativos.
|
||
|
||
**Tabla 9.** *Costos de GPU en plataformas cloud.*
|
||
|
||
| Plataforma | GPU | Costo/Hora | Costo Mensual |
|
||
|------------|-----|------------|---------------|
|
||
| AWS EC2 g4dn.xlarge | NVIDIA T4 (16 GB) | $0.526 | ~$384 |
|
||
| Google Colab Pro | T4/P100 | ~$1.30 | $10 + CU extras |
|
||
| Google Colab Pro+ | T4/V100/A100 | ~$1.30 | $50 + CU extras |
|
||
|
||
*Fuente: Elaboración propia a partir de precios públicos de AWS y Google Cloud (enero 2026).*
|
||
|
||
Para las tareas específicas de este proyecto, los costos estimados en cloud serían:
|
||
|
||
**Tabla 10.** *Análisis de costos del proyecto en plataformas cloud.*
|
||
|
||
| Tarea | Tiempo GPU | Costo AWS | Costo Colab Pro |
|
||
|-------|------------|-----------|-----------------|
|
||
| Ajuste hiperparámetros (64×3 trials) | ~3 horas | ~$1.58 | ~$3.90 |
|
||
| Evaluación completa (45 páginas) | ~5 min | ~$0.04 | ~$0.11 |
|
||
| Desarrollo y depuración (20 horas/mes) | 20 horas | ~$10.52 | ~$26.00 |
|
||
|
||
*Fuente: Elaboración propia.*
|
||
|
||
Las ventajas de la ejecución local incluyen:
|
||
|
||
1. **Costo cero de GPU**: La RTX 3060 ya está disponible en el equipo de desarrollo
|
||
2. **Sin límites de tiempo**: AWS y Colab imponen timeouts de sesión que interrumpen experimentos largos
|
||
3. **Acceso instantáneo**: Sin tiempo de aprovisionamiento de instancias cloud
|
||
4. **Almacenamiento local**: Dataset y resultados en disco sin costos de transferencia
|
||
5. **Iteración rápida**: Reinicio inmediato de contenedores Docker para depuración
|
||
|
||
Para un proyecto de investigación con múltiples iteraciones de ajuste de hiperparámetros, la ejecución local ahorra aproximadamente $50-100 mensuales comparado con servicios cloud, además de ofrecer mayor flexibilidad en la velocidad de iteración durante el desarrollo.
|
||
|
||
### Limitaciones Metodológicas
|
||
|
||
1. **Tamaño del dataset**: El dataset contiene 45 páginas de documentos académicos UNIR. Resultados pueden no generalizar a otros formatos.
|
||
|
||
2. **Subconjunto de optimización**: El ajuste de hiperparámetros se realizó sobre 5 páginas (páginas 5-10), lo que contribuyó al sobreajuste observado en la validación del dataset completo.
|
||
|
||
3. **Texto de referencia imperfecto**: El texto de referencia extraído de PDF puede contener errores en documentos con diseños complejos.
|
||
|
||
4. **Parámetro fijo**: `text_det_unclip_ratio` quedó fijado en 0.0 durante todo el experimento por decisión de diseño inicial.
|
||
|
||
## Resumen del capítulo
|
||
|
||
Este capítulo ha establecido:
|
||
|
||
1. Un objetivo general SMART: alcanzar CER < 2% mediante optimización de hiperparámetros (logrado en el mejor trial: 0.79%)
|
||
2. Cinco objetivos específicos medibles y alcanzables
|
||
3. Una metodología experimental en cinco fases claramente definidas
|
||
4. El espacio de búsqueda de hiperparámetros y la configuración de Ray Tune
|
||
5. Las limitaciones reconocidas del enfoque
|
||
|
||
El siguiente capítulo presenta el desarrollo específico de la contribución, incluyendo el benchmark comparativo de soluciones OCR, la optimización de hiperparámetros y el análisis de resultados.
|
||
|