# Objetivos concretos y metodología de trabajo

## 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 (Doran, 1981)

**Tabla 13.** *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:** [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md).

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

La metodología se estructura en cinco fases secuenciales, cada una de las cuales produce resultados que alimentan la siguiente. Desde la preparación del dataset hasta la validación final, el proceso sigue un diseño experimental. Esto permite reproducir y verificar cada paso.

```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 (PyMuPDF, 2024)
- **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 se encuentra en:

- [`src/prepare_dataset.ipynb`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/prepare_dataset.ipynb)
- [`src/paddle_ocr/dataset_manager.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/dataset_manager.py)
- [`src/easyocr_service/dataset_manager.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service/dataset_manager.py)
- [`src/doctr_service/dataset_manager.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/dataset_manager.py)

### Fase 2: Benchmark Comparativo

#### Modelos Evaluados

**Tabla 14.** *Modelos OCR evaluados en el benchmark inicial.*

| Modelo | Versión | Configuración |
|--------|---------|---------------|
| EasyOCR | - | Idiomas: ['es', 'en'] |
| PaddleOCR | PP-OCRv5 | Modelos Mobile (limitación de VRAM) |
| DocTR | - | db_resnet50 + sar_resnet31 |

**Fuente:** [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md).

#### 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 se encuentra en:

- [`src/paddle_ocr/paddle_ocr_tuning_rest.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/paddle_ocr_tuning_rest.py)
- [`src/easyocr_service/easyocr_tuning_rest.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service/easyocr_tuning_rest.py)
- [`src/doctr_service/doctr_tuning_rest.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/doctr_tuning_rest.py)

### Fase 3: Espacio de Búsqueda

#### Hiperparámetros Seleccionados

**Tabla 15.** *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`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune/raytune_ocr.py) (ver Anexo A). Ray Tune se apoya en el ecosistema Ray para escalar la búsqueda (Moritz et al., 2018).

### 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 Desarrollo de la comparativa en el [Capítulo 4](#capitulo-4) para detalles de la arquitectura).

#### Ejecución con Docker Compose

Los servicios se orquestan mediante Docker Compose:

- [`src/docker-compose.tuning.paddle.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.paddle.yml)
- [`src/docker-compose.tuning.doctr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.doctr.yml)
- [`src/docker-compose.tuning.easyocr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.easyocr.yml)
- [`src/docker-compose.tuning.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/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. Ejemplo real de un trial con mejor CER:

```json
{
    "CER": 0.007884,
    "WER": 0.077848,
    "TIME_PER_PAGE": 0.5895
}
```

**Fuente:** [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).

### 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 16.** *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:** [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md).

#### Software

**Tabla 17.** *Software utilizado en el entorno de desarrollo.*

| Componente | Versión |
|------------|---------|
| PaddlePaddle | 3.2.2 |
| PaddleOCR | 3.3.2 |
| Ray Tune | 2.52.1 |
| Optuna | 4.7.0 |
| DocTR (python-doctr) | >= 0.8.0 |
| EasyOCR | >= 1.7.0 |

**Fuente:** [`src/paddle_ocr/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/requirements.txt), [`src/raytune/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune/requirements.txt), [`src/doctr_service/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/requirements.txt), [`src/easyocr_service/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service/requirements.txt).

#### 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 18.** *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:** Precios públicos de AWS y Google Cloud. Ver Anexo A, sección de fuentes de precios cloud (enero 2026).

Para las tareas específicas de este proyecto, los costos estimados en cloud serían:

**Tabla 19.** *Análisis de costos del proyecto en plataformas cloud.*

| Tarea | Tiempo GPU | Costo AWS | Costo Colab Pro |
|-------|------------|-----------|-----------------|
| Ajuste hiperparámetros (64x3 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 a partir de precios públicos. Ver Anexo A, sección de fuentes de precios cloud (enero 2026).

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 reduce costos frente a servicios cloud. Este análisis se detalla en [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md).)

### 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), y su impacto se analiza en detalle en el capítulo de desarrollo específico.

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.

## Síntesis del capítulo

Los objetivos y la metodología definidos en este capítulo establecen el marco para la experimentación. El objetivo general, alcanzar un CER inferior al 2% mediante optimización de hiperparámetros, se descompone en cinco objetivos específicos que abarcan desde la comparativa inicial de soluciones hasta la validación final de la configuración optimizada.

La metodología experimental en cinco fases garantiza un proceso sistemático y reproducible: preparación de un dataset de 45 páginas, benchmark comparativo de tres motores OCR, definición del espacio de búsqueda, ejecución de 64 trials con Ray Tune y Optuna, y validación de la configuración resultante. Las limitaciones metodológicas, como el tamaño del dataset, el subconjunto de optimización reducido y el texto de referencia automático, se reconocen explícitamente para contextualizar la interpretación de resultados.

El capítulo siguiente pone en práctica esta metodología, presentando el desarrollo experimental completo con sus resultados y análisis.
