# Desarrollo específico de la contribución

## Planteamiento de la comparativa

Antes de abordar la optimización de hiperparámetros, era necesario seleccionar el motor OCR que serviría como base para la experimentación. Para ello, se realizó un estudio comparativo entre tres soluciones de código abierto representativas del estado del arte: EasyOCR, PaddleOCR y DocTR. Los experimentos, documentados en los informes de métricas y en los CSV de resultados del repositorio, permitieron identificar el modelo más prometedor para la fase de optimización posterior.

### Identificación del Problema

El reconocimiento óptico de caracteres en documentos académicos en español presenta desafíos específicos que la literatura no ha abordado en profundidad. A diferencia de los benchmarks estándar en inglés, los documentos académicos hispanohablantes combinan características ortográficas propias, como acentos, eñes, diéresis y signos de puntuación invertidos, con una estructura sencilla basada en índice y encabezados.

Los documentos académicos típicos incluyen texto corrido con índice, listas numeradas, encabezados multinivel y notas al pie, lo que complica la tarea de ordenación del texto reconocido. A esto se suma el uso de tipografía profesional con múltiples fuentes, tamaños y estilos (negrita, cursiva), que puede confundir a los modelos de reconocimiento. Aunque los PDFs digitales suelen tener alta calidad, pueden contener artefactos de compresión que degradan la legibilidad de caracteres pequeños o de bajo contraste.

### Alternativas Evaluadas

Se seleccionaron tres soluciones OCR de código abierto representativas del estado del arte:

**Tabla 20.** *Soluciones OCR del benchmark.*

| Solución | Desarrollador | Versión | Justificación de selección |
|----------|---------------|---------|----------------------------|
| EasyOCR | Jaided AI | Última estable | Popularidad, facilidad de uso |
| PaddleOCR | Baidu | PP-OCRv5 | Estado del arte industrial |
| DocTR | Mindee | Última estable | Orientación académica |

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

Imágenes Docker disponibles en el registro del proyecto:
- PaddleOCR: [`seryus.ddns.net/unir/paddle-ocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/paddle-ocr-gpu/latest), [`seryus.ddns.net/unir/paddle-ocr-cpu`](https://seryus.ddns.net/unir/-/packages/container/paddle-ocr-cpu/latest)
- EasyOCR: [`seryus.ddns.net/unir/easyocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/easyocr-gpu/latest)
- DocTR: [`seryus.ddns.net/unir/doctr-gpu`](https://seryus.ddns.net/unir/-/packages/container/doctr-gpu/latest)

### Criterios de Éxito

Los criterios establecidos para evaluar las soluciones fueron:

1. **Precisión (CER < 5%)**: Error de caracteres aceptable para documentos académicos
2. **Configurabilidad**: Disponibilidad de hiperparámetros ajustables
3. **Soporte para español**: Modelos preentrenados que incluyan el idioma
4. **Documentación**: Calidad de la documentación técnica
5. **Mantenimiento activo**: Actualizaciones recientes y comunidad activa

### Configuración del Experimento

#### Dataset de Evaluación

Se utilizó el documento "Instrucciones para la redacción y elaboración del TFE" del Máster Universitario en Inteligencia Artificial de UNIR, ubicado en la carpeta [`instructions/`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/instructions/).

**Tabla 21.** *Características del dataset de evaluación inicial.*

| Característica | Valor |
|----------------|-------|
| Documento fuente | Instrucciones TFE UNIR |
| Número de páginas evaluadas | 5 (benchmark inicial) |
| Formato | PDF digital (no escaneado) |
| Idioma principal | Español |
| Resolución de conversión | 300 DPI |
| Formato de imagen | PNG |

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

#### Proceso de Conversión

La conversión del PDF a imágenes se realizó mediante PyMuPDF (fitz) a 300 DPI, resolución estándar para OCR que proporciona suficiente detalle para caracteres pequeños sin generar archivos excesivamente grandes. La implementación está disponible en [`src/prepare_dataset.ipynb`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/prepare_dataset.ipynb).

#### Extracción del Ground Truth

El texto de referencia se extrajo directamente del PDF mediante PyMuPDF, preservando la estructura de líneas del documento original. Esta aproximación puede introducir errores en el orden de lectura cuando hay secciones con encabezados, listas o saltos de línea, por lo que se documenta junto al pipeline de preparación en [`src/prepare_dataset.ipynb`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/prepare_dataset.ipynb). Para la comparación entre motores, las salidas se guardan en `debugset/` al activar `save_output=True`, y el flujo de trabajo se describe en [`src/README.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/README.md) y en los README de cada servicio: [`src/paddle_ocr/README.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/README.md), [`src/easyocr_service/README.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service/README.md), [`src/doctr_service/README.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/README.md).

#### Configuración de los Modelos

La configuración de cada modelo se detalla en los README de cada servicio y sus ficheros de dependencias:

- **EasyOCR**: Configurado con soporte para español e inglés, permitiendo reconocer palabras en ambos idiomas que puedan aparecer en documentos académicos (referencias, términos técnicos).

- **PaddleOCR (PP-OCRv5)**: Se utilizaron los modelos Mobile, adecuados para la VRAM disponible. Los modelos Server se probaron y produjeron OOM en este hardware. La versión utilizada fue PaddleOCR 3.3.2.

- **DocTR**: Se seleccionaron las arquitecturas db_resnet50 para detección y sar_resnet31 para reconocimiento, representando una configuración de alta precisión.

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

#### Métricas de Evaluación

Se utilizó la biblioteca `jiwer` para calcular CER y WER de manera estandarizada. La normalización a minúsculas y eliminación de espacios extremos asegura una comparación justa que no penaliza diferencias de capitalización. La implementación está disponible 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) y [`src/doctr_service/doctr_tuning_rest.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/doctr_tuning_rest.py).

### Resultados del Benchmark

#### Resultados de PaddleOCR (Configuración Baseline)

Durante el benchmark inicial se evaluó PaddleOCR con configuración por defecto en un subconjunto del dataset. Los resultados preliminares mostraron variabilidad significativa entre páginas, en función de los cambios de formato y de la estructura del texto.

**Tabla 22.** *Variabilidad del error por tipo de contenido.*

| Tipo de contenido | Nivel de error | Observaciones |
|-------------------|---------------|---------------|
| Texto corrido | Bajo | Mejor rendimiento |
| Texto con listas | Medio | Rendimiento intermedio |
| Índice y encabezados | Medio | Orden de lectura sensible |
| Encabezados + notas | Medio | Variación tipográfica |

**Fuente:** Elaboración propia a partir del benchmark.

**Observaciones del benchmark inicial:**

1. Las páginas con más cambios de formato y listados presentaron mayor error debido a la dificultad de ordenar correctamente las líneas de texto.

2. La página con texto corrido continuo obtuvo el mejor resultado, demostrando la capacidad del modelo para texto estándar.

3. El promedio general se situó en un rango medio de error, con margen de mejora.

4. Los errores más frecuentes fueron: confusión de acentos, caracteres duplicados, y errores en signos de puntuación.

#### Comparativa de Modelos

Los tres modelos evaluados representan diferentes paradigmas de OCR:

**Tabla 23.** *Comparativa de arquitecturas OCR evaluadas.*

| Modelo | Tipo | Componentes | Fortalezas Clave |
|--------|------|-------------|------------------|
| **EasyOCR** | End-to-end (det + rec) | CRAFT + CRNN/Transformer | Ligero, fácil de usar, multilingüe |
| **PaddleOCR** | End-to-end (det + rec + cls) | DB + SVTR/CRNN | Soporte multilingüe robusto, pipeline configurable |
| **DocTR** | End-to-end (det + rec) | DB/LinkNet + CRNN/SAR/ViTSTR | Orientado a investigación, API limpia |

**Fuente:** Documentación oficial de cada herramienta (JaidedAI, 2020; PaddlePaddle, 2024; Mindee, 2021).

#### Análisis Cualitativo de Errores

Un análisis cualitativo de los errores producidos reveló patrones específicos:

**Errores de acentuación:**
- `información` → `informacion` (pérdida de acento)
- `más` → `mas` (cambio de significado)
- `él` → `el` (cambio de significado)

**Errores de caracteres especiales:**
- `año` → `ano` (pérdida de eñe)
- `¿Cómo` → `Como` (pérdida de signos invertidos)

**Errores de duplicación:**
- `titulación` → `titulacióon` (carácter duplicado)
- `documento` → `doccumento` (consonante duplicada)

**Ejemplo de predicción de PaddleOCR para una página:**

> "Escribe siempre al menos un párrafo de introducción en cada capítulo o apartado, explicando de qué vas a tratar en esa sección. Evita que aparezcan dos encabezados de nivel consecutivos sin ningún texto entre medias. [...] En esta titulacióon se cita de acuerdo con la normativa Apa."

**Errores identificados en este ejemplo:**
- `titulacióon` en lugar de `titulación` (carácter duplicado)
- `Apa` en lugar de `APA` (capitalización)

### Justificación de la Selección de PaddleOCR

#### Criterios de Selección

La selección de PaddleOCR para la fase de optimización se basó en los siguientes criterios:

**Tabla 24.** *Evaluación de criterios de selección (cualitativa).*

| Criterio | EasyOCR | PaddleOCR | DocTR |
|----------|---------|-----------|-------|
| CER benchmark | Medio | **Mejor** | Medio |
| Configurabilidad | Baja | **Alta** | Media |
| Soporte español | Sí | **Sí (dedicado)** | Limitado |
| Documentación | Media | **Alta** | Alta |
| Mantenimiento | Medio | **Alto** | Medio |

**Fuente:** Elaboración propia a partir del benchmark y la documentación de cada herramienta.

#### Hiperparámetros Disponibles en PaddleOCR

PaddleOCR expone múltiples hiperparámetros ajustables, clasificados por etapa del pipeline:

**Detección:**
- `text_det_thresh`: Umbral de probabilidad para píxeles de texto
- `text_det_box_thresh`: Umbral de confianza para cajas detectadas
- `text_det_unclip_ratio`: Factor de expansión de cajas

**Reconocimiento:**
- `text_rec_score_thresh`: Umbral de confianza para resultados

**Preprocesamiento:**
- `use_textline_orientation`: Clasificación de orientación de línea
- `use_doc_orientation_classify`: Clasificación de orientación de documento
- `use_doc_unwarping`: Corrección de deformación

Esta riqueza de configuración permite explorar sistemáticamente el espacio de hiperparámetros mediante técnicas de optimización automática.

#### Decisión Final

**Se selecciona PaddleOCR (PP-OCRv5)** para la fase de optimización debido a:

1. **Resultados iniciales prometedores**: Rendimiento base competitivo con margen de mejora
2. **Alta configurabilidad**: Múltiples hiperparámetros ajustables en tiempo de inferencia
3. **Pipeline modular**: Permite aislar el impacto de cada componente
4. **Soporte activo para español**: Modelos específicos y actualizaciones frecuentes
5. **Documentación técnica**: Descripción detallada de cada parámetro

### Limitaciones del Benchmark

1. **Tamaño reducido**: Solo 5 páginas evaluadas en el benchmark comparativo inicial. Esto limita la generalización de las conclusiones.

2. **Único tipo de documento**: Documentos académicos de UNIR únicamente. Otros tipos de documentos (facturas, formularios, contratos) podrían presentar resultados diferentes.

3. **Referencia CPU separada**: Los tiempos en CPU se midieron en un experimento independiente y solo se usan como comparación de rendimiento frente a GPU.

### Síntesis del Benchmark

El benchmark comparativo ha permitido identificar PaddleOCR como la solución más prometedora para la fase de optimización, gracias a su combinación de rendimiento base competitivo, alta configurabilidad del pipeline y documentación técnica completa. Estas limitaciones se tendrán en cuenta al interpretar los resultados de la fase de optimización.

**Fuente:** [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md), [`src/results/*.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/*.csv), documentación oficial de PaddleOCR.

## Desarrollo de la comparativa: Optimización de hiperparámetros

Una vez seleccionado PaddleOCR como motor base, el siguiente paso fue explorar sistemáticamente su espacio de configuración para identificar los hiperparámetros que maximizan el rendimiento en documentos académicos en español. Para ello se empleó Ray Tune con el algoritmo de búsqueda Optuna, una combinación que permite explorar eficientemente espacios de búsqueda mixtos (parámetros continuos y categóricos). Los experimentos se implementaron en [`src/run_tuning.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/run_tuning.py) con apoyo de la librería [`src/raytune_ocr.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_ocr.py), almacenándose los resultados en [`src/results`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results). Esta aproximación ofrece ventajas significativas frente al fine-tuning tradicional: no requiere datasets de entrenamiento etiquetados, no modifica los pesos del modelo preentrenado, y puede ejecutarse con hardware de consumo cuando se dispone de aceleración GPU.

### Configuración del Experimento

#### Entorno de Ejecución

El experimento se ejecutó en el siguiente entorno:

**Tabla 25.** *Entorno de ejecución del experimento.*

| Componente | Versión/Especificación |
|------------|------------------------|
| Sistema operativo | Ubuntu 24.04.3 LTS |
| Python | 3.12.3 |
| PaddlePaddle | 3.2.2 |
| PaddleOCR | 3.3.2 |
| Ray | 2.52.1 |
| Optuna | 4.7.0 |
| CPU | AMD Ryzen 7 5800H |
| RAM | 16 GB DDR4 |
| GPU | NVIDIA RTX 3060 Laptop (5.66 GB VRAM) |

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

#### Arquitectura de Ejecución

La arquitectura basada en contenedores Docker es fundamental para este proyecto debido a los conflictos de dependencias inherentes entre los diferentes componentes:

- **Conflictos entre motores OCR**: PaddleOCR, DocTR y EasyOCR tienen dependencias mutuamente incompatibles (diferentes versiones de PyTorch/PaddlePaddle, OpenCV, etc.)
- **Incompatibilidades CUDA/cuDNN**: Cada motor OCR requiere versiones específicas de CUDA y cuDNN que no pueden coexistir en un mismo entorno virtual
- **Aislamiento de Ray Tune**: Ray Tune tiene sus propias dependencias que pueden entrar en conflicto con las librerías de inferencia OCR

Esta arquitectura containerizada permite ejecutar cada componente en su entorno aislado óptimo, comunicándose vía API REST:

```mermaid
---
title: "Arquitectura de ejecución con Docker Compose"
config:
  theme: base
  themeVariables:
    primaryColor: "#E6F4F9"
    primaryTextColor: "#404040"
    primaryBorderColor: "#0098CD"
    lineColor: "#0098CD"
---
flowchart LR
    subgraph Docker["Docker Compose"]
        A["RayTune Container"]
        B["OCR Service Container"]
    end

    A -->|"HTTP POST /evaluate"| B
    B -->|"JSON {CER, WER, TIME}"| A
    A -.->|"Health check /health"| B
```

La arquitectura containerizada [`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) ofrece:
1. Aislamiento de dependencias entre Ray Tune y los motores OCR
2. Health checks automáticos para asegurar disponibilidad del servicio
3. Comunicación vía API REST (endpoints `/health` y `/evaluate`)
4. Soporte para GPU mediante nvidia-docker

```bash
# Iniciar servicio OCR con GPU
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
```

Respuesta del servicio OCR:
```json
{
    "CER": 0.0149,
    "WER": 0.0762,
    "TIME": 15.8,
    "PAGES": 5,
    "TIME_PER_PAGE": 3.16
}
```

#### Infraestructura Docker

La infraestructura del proyecto se basa en contenedores Docker para garantizar reproducibilidad y aislamiento de dependencias. Se generaron seis imágenes Docker, cada una optimizada para su propósito específico.

**Tabla 26.** *Imágenes Docker generadas para el proyecto.*

| Imagen | Propósito | Base | Puerto |
|--------|-----------|------|--------|
| [`seryus.ddns.net/unir/paddle-ocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/paddle-ocr-gpu/latest) | PaddleOCR con aceleración GPU | `nvidia/cuda:12.4.1-cudnn-runtime` | 8002 |
| [`seryus.ddns.net/unir/paddle-ocr-cpu`](https://seryus.ddns.net/unir/-/packages/container/paddle-ocr-cpu/latest) | PaddleOCR para entornos sin GPU | `python:3.11-slim` | 8002 |
| [`seryus.ddns.net/unir/easyocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/easyocr-gpu/latest) | EasyOCR con aceleración GPU | `nvidia/cuda:13.0.2-cudnn-runtime` | 8002* |
| [`seryus.ddns.net/unir/doctr-gpu`](https://seryus.ddns.net/unir/-/packages/container/doctr-gpu/latest) | DocTR con aceleración GPU | `nvidia/cuda:13.0.2-cudnn-runtime` | 8003 |
| [`seryus.ddns.net/unir/raytune`](https://seryus.ddns.net/unir/-/packages/container/raytune/latest) | Orquestador Ray Tune | `python:3.12-slim` | - |

**Fuente:** Elaboración propia. Dockerfiles disponibles en [`src/paddle_ocr`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr), [`src/easyocr_service`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service), [`src/doctr_service`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service), [`src/raytune`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune).

##### Arquitectura de Microservicios

```mermaid
---
title: "Arquitectura de microservicios para optimización OCR"
config:
  theme: base
  themeVariables:
    primaryColor: "#E6F4F9"
    primaryTextColor: "#404040"
    primaryBorderColor: "#0098CD"
    lineColor: "#0098CD"
---
flowchart TB
    subgraph Host["Host (Ubuntu 24.04)"]
        subgraph Docker["Docker Compose"]
            RT["RayTune\n(Orquestador)"]
            subgraph OCR["Servicios OCR (GPU)"]
                P["PaddleOCR\n:8002"]
                E["EasyOCR\n:8001"]
                D["DocTR\n:8003"]
            end
        end
        GPU["NVIDIA RTX 3060\n(5.66 GB VRAM)"]
        DS[("Dataset\n/app/dataset")]
        RES[("Resultados\n/app/results")]
    end

    RT -->|"POST /evaluate"| P
    RT -->|"POST /evaluate"| E
    RT -->|"POST /evaluate"| D
    P & E & D --> GPU
    P & E & D --> DS
    RT --> RES
```

##### Estrategia de Build Multi-Stage

Los Dockerfiles utilizan una estrategia de build multi-stage para optimizar tiempos de construcción y tamaño de imágenes:

```mermaid
---
title: "Estrategia de build multi-stage"
config:
  theme: base
  themeVariables:
    primaryColor: "#E6F4F9"
    primaryTextColor: "#404040"
    primaryBorderColor: "#0098CD"
    lineColor: "#0098CD"
---
flowchart LR
    subgraph Stage1["Stage 1: Base"]
        B1["CUDA Runtime"]
        B2["Python + pip"]
        B3["Dependencias OCR"]
    end

    subgraph Stage2["Stage 2: Deploy"]
        D1["Código aplicación"]
        D2["FastAPI REST"]
    end

    Stage1 --> Stage2

    B1 --> B2 --> B3
    D1 --> D2
```

**Ventajas de esta estrategia:**
1. **Caché de dependencias**: La etapa base (CUDA + dependencias) se cachea y reutiliza
2. **Builds rápidos**: Los cambios de código solo reconstruyen la etapa de deploy
3. **Imágenes optimizadas**: Solo se incluyen los archivos necesarios para ejecución

##### Docker Compose Files

El proyecto incluye múltiples archivos Docker Compose para diferentes escenarios de uso:

**Tabla 27.** *Archivos Docker Compose del proyecto.*

| Archivo | Propósito | Servicios |
|---------|-----------|-----------|
| [`src/docker-compose.tuning.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.yml)| Optimización principal | RayTune + PaddleOCR + DocTR |
| [`src/docker-compose.tuning.easyocr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.easyocr.yml)| Optimización EasyOCR | RayTune + EasyOCR |
| [`src/docker-compose.tuning.paddle.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.paddle.yml)| Optimización PaddleOCR | RayTune + PaddleOCR |
| [`src/docker-compose.tuning.doctr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.doctr.yml)| Optimización DocTR | RayTune + DocTR |

**Fuente:** [`src/docker-compose.tuning.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.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.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).

> **Nota:** EasyOCR y PaddleOCR utilizan el mismo puerto (8002). Debido a limitaciones de recursos GPU (VRAM insuficiente para ejecutar múltiples modelos OCR simultáneamente), solo se ejecuta un servicio a la vez durante los experimentos. Por esta razón, EasyOCR tiene su propio archivo Docker Compose separado.

##### Gestión de Volúmenes

Se utilizan volúmenes Docker nombrados para persistir los modelos descargados entre ejecuciones:

**Tabla 28.** *Volúmenes Docker para caché de modelos.*

| Volumen | Servicio | Contenido |
|---------|----------|-----------|
| `paddlex-model-cache` | PaddleOCR | Modelos PP-OCRv5 |
| `easyocr-model-cache` | EasyOCR | Modelos CRAFT + CRNN |
| `doctr-model-cache` | DocTR | Modelos db_resnet50 + crnn_vgg16_bn |

**Fuente:** [`src/docker-compose.tuning.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.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.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).

##### Health Checks y Monitorización

Todos los servicios implementan health checks para garantizar disponibilidad antes de iniciar la optimización:

```yaml
healthcheck:
  test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"]
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 60s  # PaddleOCR: 60s, EasyOCR: 120s, DocTR: 180s
```

Los tiempos de `start_period` varían según el servicio debido al tiempo de carga de modelos:
- **PaddleOCR**: 60 segundos (modelos más ligeros)
- **EasyOCR**: 120 segundos (carga de modelos CRAFT)
- **DocTR**: 180 segundos (modelos ResNet más pesados)

**Fuente:** [`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.easyocr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.easyocr.yml), [`src/docker-compose.tuning.doctr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.doctr.yml).

##### Flujo de Ejecución Completo

```mermaid
---
title: "Flujo de ejecución de optimización con Ray Tune"
config:
  theme: base
  themeVariables:
    primaryColor: "#E6F4F9"
    primaryTextColor: "#404040"
    primaryBorderColor: "#0098CD"
    lineColor: "#0098CD"
---
sequenceDiagram
    participant U as Usuario
    participant DC as Docker Compose
    participant RT as RayTune
    participant OCR as Servicio OCR
    participant GPU as GPU

    U->>DC: docker compose up -d
    DC->>OCR: Iniciar contenedor
    OCR->>GPU: Cargar modelos CUDA
    OCR-->>DC: Health check OK

    U->>DC: docker compose run raytune
    DC->>RT: Iniciar optimización

    loop 64 trials
        RT->>RT: Optuna sugiere config
        RT->>OCR: POST /evaluate {config}
        OCR->>GPU: Inferencia OCR
        OCR-->>RT: {CER, WER, TIME}
        RT->>RT: Registrar métricas
    end

    RT-->>U: Mejor configuración encontrada
    U->>DC: docker compose down
```

##### Reproducibilidad

Para reproducir los experimentos:

```bash
# 1. Clonar repositorio
git clone https://seryus.ddns.net/unir/MastersThesis.git
cd MastersThesis/src

# 2. Iniciar servicio OCR (requiere nvidia-docker)
docker compose -f docker-compose.tuning.paddle.yml up -d paddle-ocr-gpu

# 3. Verificar health check
curl http://localhost:8002/health

# 4. Ejecutar optimización (64 trials)
docker compose -f docker-compose.tuning.paddle.yml run raytune \
    --service paddle --samples 64

# 5. Resultados en src/results/
ls -la results/raytune_paddle_results_*.csv

# 6. Limpiar
docker compose -f docker-compose.tuning.paddle.yml down
```

Los resultados de los experimentos están disponibles en:
- [`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)
- [`src/results/raytune_easyocr_results_20260119_120204.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_easyocr_results_20260119_120204.csv)
- [`src/results/raytune_doctr_results_20260119_121445.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_doctr_results_20260119_121445.csv)
- [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_paddle_subproc_results_20251207_192320.csv)

#### Dataset Extendido

Para la fase de optimización se extendió el dataset:

**Tabla 29.** *Características del dataset de optimización.*

| Característica | Valor |
|----------------|-------|
| Páginas del dataset completo | 45 |
| Páginas por trial | 5 (páginas 5-10) |
| Estructura | Carpetas `img/` y `txt/` pareadas |
| Resolución | 300 DPI |
| Formato imagen | PNG |

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

La clase `ImageTextDataset` gestiona la carga de pares imagen-texto desde la estructura de carpetas pareadas. La implementación está disponible en [`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) y [`src/doctr_service/dataset_manager.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/dataset_manager.py).

#### Espacio de Búsqueda

El espacio de búsqueda se definió considerando los hiperparámetros más relevantes identificados en la documentación de PaddleOCR, utilizando `tune.choice()` para parámetros booleanos y `tune.uniform()` para umbrales continuos. La implementación 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).

**Tabla 30.** *Espacio de búsqueda: parámetros.*

| Parámetro | Tipo | Rango | Descripción |
|-----------|------|-------|-------------|
| `use_doc_orientation_classify` | Booleano | {True, False} | Clasificación de orientación del documento completo |
| `use_doc_unwarping` | Booleano | {True, False} | Corrección de deformación/curvatura |
| `textline_orientation` | Booleano | {True, False} | Clasificación de orientación por línea de texto |
| `text_det_thresh` | Continuo | [0.0, 0.7] | Umbral de probabilidad para píxeles de texto |
| `text_det_box_thresh` | Continuo | [0.0, 0.7] | Umbral de confianza para cajas detectadas |
| `text_det_unclip_ratio` | Fijo | 0.0 | Coeficiente de expansión (no explorado) |
| `text_rec_score_thresh` | Continuo | [0.0, 0.7] | Umbral de confianza de reconocimiento |

**Fuente:** Documentación de PaddleOCR.

**Justificación del espacio:**

1. **Rango [0.0, 0.7] para umbrales**: Se evitan valores extremos (>0.7) que podrían filtrar demasiado texto válido, y se incluye 0.0 para evaluar el impacto de desactivar el filtrado.

2. **`text_det_unclip_ratio` fijo**: Por decisión de diseño inicial, este parámetro se mantuvo constante para reducir la dimensionalidad del espacio de búsqueda.

3. **Parámetros booleanos completos**: Los tres parámetros de preprocesamiento se exploran completamente para identificar cuáles son necesarios para documentos digitales.

#### Configuración de Ray Tune

Se configuró Ray Tune con OptunaSearch como algoritmo de búsqueda, optimizando CER en 64 trials con 2 ejecuciones concurrentes. La implementación 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).

**Tabla 31.** *Parámetros de configuración de Ray Tune.*

| Parámetro | Valor | Justificación |
|-----------|-------|---------------|
| Métrica objetivo | CER | Métrica estándar para OCR |
| Modo | min | Minimizar tasa de error |
| Algoritmo | OptunaSearch (TPE) | Eficiente para espacios mixtos |
| Número de trials | 64 | Balance entre exploración y tiempo |
| Trials concurrentes | 2 | Limitado por memoria disponible |

**Fuente:** [`src/raytune/raytune_ocr.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune/raytune_ocr.py).

Elección de 64 trials:

El número de trials se eligió buscando un equilibrio entre exploración del espacio de búsqueda y tiempo total de ejecución.

### Resultados de la Optimización

#### Ejecución del Experimento

El experimento se ejecutó exitosamente con los siguientes resultados globales:

**Tabla 32.** *Resumen de la ejecución del experimento (referencia CPU).*

| Métrica | Valor |
|---------|-------|
| Trials completados | 64/64 |
| Trials fallidos | 0 |
| Tiempo total (CPU) | 6.2 horas |
| Tiempo medio por trial (CPU) | 347.6 segundos |
| Páginas procesadas | 320 (64 trials x 5 páginas) |

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

#### Estadísticas Descriptivas

Del archivo CSV de resultados [`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):

**Tabla 33.** *Estadísticas descriptivas de los 64 trials.*

| Estadística | CER | WER | Tiempo/Página (s) |
|-------------|-----|-----|-------------------|
| **count** | 64 | 64 | 64 |
| **mean** | 2.30% | 9.25% | 0.84 |
| **std** | 2.20% | 1.78% | 0.53 |
| **min** | 0.79% | 6.80% | 0.56 |
| **50%** (mediana) | 0.87% | 8.39% | 0.59 |
| **max** | 7.30% | 13.20% | 2.22 |

**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).

Observaciones:

1. **Baja varianza en CER**: La desviación estándar (2.20%) es similar a la media (2.30%), indicando una distribución relativamente consistente sin valores extremos catastróficos.

2. **Mediana vs Media**: La mediana del CER (0.87%) es menor que la media (2.30%), confirmando una distribución ligeramente sesgada hacia valores bajos.

3. **Velocidad GPU**: El tiempo de ejecución promedio es de 0.84 s/página, lo que representa una aceleración significativa respecto a la ejecución en CPU (~69 s/página, 82x más rápido).

#### Distribución de Resultados

**Tabla 34.** *Distribución de trials por rango de CER.*

| Rango CER | Número de trials | Porcentaje |
|-----------|------------------|------------|
| < 2% | 43 | 67.2% |
| 2% - 5% | 10 | 15.6% |
| 5% - 10% | 11 | 17.2% |
| > 10% | 0 | 0.0% |

**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).

**Figura 15.** *Distribución de trials por rango de CER.*

```mermaid
---
title: "Distribución de trials por rango de CER"
config:
  theme: base
  themeVariables:
    primaryColor: "#E6F4F9"
    primaryTextColor: "#404040"
    primaryBorderColor: "#0098CD"
    lineColor: "#0098CD"
---
pie showData
    title Distribución de 64 trials
    "CER < 2%" : 43
    "CER 2-5%" : 10
    "CER 5-10%" : 11
```

**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).

La mayoría de trials (67.2%) alcanzaron CER < 2%, cumpliendo el objetivo establecido. Ningún trial presentó fallos catastróficos (CER > 10%), demostrando la estabilidad de la optimización con GPU.

#### Mejor Configuración Encontrada

La configuración que minimizó el CER fue:

```
Best CER: 0.007884 (0.79%)
Best WER: 0.077848 (7.78%)

Configuración óptima:
  textline_orientation: True
  use_doc_orientation_classify: True
  use_doc_unwarping: False
  text_det_thresh: 0.0462
  text_det_box_thresh: 0.4862
  text_det_unclip_ratio: 0.0
  text_rec_score_thresh: 0.5658
```

**Tabla 35.** *Configuración óptima identificada.*

| Parámetro | Valor óptimo | Valor por defecto | Cambio |
|-----------|--------------|-------------------|--------|
| textline_orientation | **True** | False | Activado |
| use_doc_orientation_classify | **True** | False | Activado |
| use_doc_unwarping | False | False | Sin cambio |
| text_det_thresh | **0.0462** | 0.3 | -0.254 |
| text_det_box_thresh | **0.4862** | 0.6 | -0.114 |
| text_det_unclip_ratio | 0.0 | 1.5 | -1.5 (fijado) |
| text_rec_score_thresh | **0.5658** | 0.5 | +0.066 |

**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).

#### Análisis de Correlación

Se calculó la correlación de Pearson entre los parámetros de configuración (codificados como 0/1 en el caso de booleanos) y las métricas de error. Para interpretar la magnitud de las correlaciones se siguieron criterios habituales en investigación cuantitativa:

**Tabla 36.** *Correlación de parámetros con CER.*

| Parámetro | Correlación con CER | Interpretación |
|-----------|---------------------|----------------|
| `use_doc_unwarping` | **+0.879** | Correlación alta positiva |
| `use_doc_orientation_classify` | -0.712 | Correlación alta negativa |
| `textline_orientation` | -0.535 | Correlación moderada negativa |
| `text_det_thresh` | +0.428 | Correlación moderada positiva |
| `text_det_box_thresh` | +0.311 | Correlación moderada positiva |
| `text_rec_score_thresh` | -0.268 | Correlación moderada negativa |
| `text_det_unclip_ratio` | NaN | Varianza cero (valor fijo) |

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

**Tabla 37.** *Correlación de parámetros con WER.*

| Parámetro | Correlación con WER | Interpretación |
|-----------|---------------------|----------------|
| `use_doc_unwarping` | **+0.744** | Correlación alta positiva |
| `use_doc_orientation_classify` | -0.602 | Correlación alta negativa |
| `textline_orientation` | -0.591 | Correlación moderada negativa |
| `text_det_thresh` | +0.399 | Correlación moderada positiva |
| `text_det_box_thresh` | +0.256 | Correlación moderada positiva |
| `text_rec_score_thresh` | -0.080 | Correlación débil negativa |
| `text_det_unclip_ratio` | NaN | Varianza cero (valor fijo) |

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

**Figura 16.** *Correlación de hiperparámetros con CER.*

```mermaid
---
title: "Correlación de hiperparámetros con CER"
config:
  theme: base
  themeVariables:
    primaryColor: "#E6F4F9"
    primaryTextColor: "#404040"
    primaryBorderColor: "#0098CD"
    lineColor: "#0098CD"
  xyChart:
    plotColorPalette: "#0098CD"
---
xychart-beta horizontal
    y-axis "Correlación con CER" -0.8 --> 0.9
    x-axis ["unwarp", "orient_doc", "orient_line", "det_thresh", "box_thresh", "rec_score"]
    bar [0.879, -0.712, -0.535, 0.428, 0.311, -0.268]
```

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

Leyenda: Valores positivos indican que aumentar el parámetro incrementa el CER. Los parámetros booleanos se codifican como 0/1 para el cálculo de la correlación. Abreviaturas: unwarp = `use_doc_unwarping`, orient_doc = `use_doc_orientation_classify`, orient_line = `textline_orientation`, det_thresh = `text_det_thresh`, box_thresh = `text_det_box_thresh`, rec_score = `text_rec_score_thresh`.

**Hallazgo clave**: `use_doc_unwarping` presenta la correlación positiva más alta con CER (0.879), lo que indica que activar este módulo incrementa el error en este dataset. En cambio, `use_doc_orientation_classify` y `textline_orientation` tienen correlación negativa, asociada a mejoras cuando están activados.

#### Impacto del Parámetro textline_orientation

El parámetro booleano `textline_orientation` demostró tener el mayor impacto en el rendimiento:

**Tabla 38.** *Impacto del parámetro textline_orientation.*

| textline_orientation | CER Medio | CER Std | WER Medio | N trials |
|---------------------|-----------|---------|-----------|----------|
| True | 1.74% | 1.94% | 8.75% | 52 |
| False | 4.73% | 1.37% | 11.42% | 12 |

**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).

Interpretación:

1. **Reducción del CER**: Con `textline_orientation=True`, el CER medio es 2.7 veces menor (1.74% vs 4.73%).

2. **Varianza**: La desviación estándar es mayor cuando `textline_orientation=True` (1.94% vs 1.37%), aunque los valores medios siguen siendo mejores.

3. **Reducción del CER**: 63.2% cuando se habilita la clasificación de orientación de línea.

**Figura 17.** *Impacto de textline_orientation en CER.*

```mermaid
---
title: "Impacto de textline_orientation en CER"
config:
  theme: base
  themeVariables:
    primaryColor: "#E6F4F9"
    primaryTextColor: "#404040"
    primaryBorderColor: "#0098CD"
    lineColor: "#0098CD"
  xyChart:
    plotColorPalette: "#0098CD"
---
xychart-beta
    x-axis ["textline_orientation=False", "textline_orientation=True"]
    y-axis "CER (%)" 0 --> 15
    bar [4.73, 1.74]
```

**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).

Explicación técnica:

El parámetro `textline_orientation` activa un clasificador que determina la orientación de cada línea de texto detectada. Para documentos con índice, encabezados y listas, este clasificador asegura que el texto se lea en el orden correcto, evitando la mezcla de líneas de diferentes secciones.

#### Análisis de Trials con Mayor CER

No se observaron fallos catastróficos (CER > 10%). El CER máximo fue 7.30%, por lo que el análisis se centra en los trials con peor desempeño relativo:

**Tabla 39.** *Trials con mayor CER.*

| Trial ID | CER | text_det_thresh | textline_orientation |
|----------|-----|-----------------|---------------------|
| f699b826 | 7.30% | 0.285 | False |
| 34bfaecf | 7.29% | 0.030 | True |
| 8c1998de | 6.44% | 0.369 | True |
| 8b33e2a2 | 6.41% | 0.664 | False |

**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).

Observación: Los peores resultados muestran variabilidad tanto en `text_det_thresh` como en `textline_orientation`, sin un patrón único dominante en este subconjunto de trials.

### Comparación Baseline vs Optimizado

#### Evaluación sobre Dataset Completo

La configuración óptima identificada se evaluó sobre el dataset completo de 45 páginas, comparando con la configuración baseline (valores por defecto de PaddleOCR). Los parámetros optimizados más relevantes fueron: `textline_orientation=True`, `use_doc_orientation_classify=True`, `text_det_thresh=0.0462`, `text_det_box_thresh=0.4862`, y `text_rec_score_thresh=0.5658`.

**Tabla 40.** *Comparación baseline vs optimizado (45 páginas).*

| Modelo | CER | Precisión Caracteres | WER | Precisión Palabras |
|--------|-----|---------------------|-----|-------------------|
| PaddleOCR (Baseline) | 8.85% | 91.15% | 13.05% | 86.95% |
| PaddleOCR-HyperAdjust | **7.72%** | **92.28%** | **11.40%** | **88.60%** |

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

> **Nota sobre generalización:** El contraste entre el mejor trial y la validación en el dataset completo evidencia sobreajuste al subconjunto de entrenamiento. Esta diferencia se analiza en la sección de resultados consolidados.

#### Métricas de Mejora

**Tabla 41.** *Análisis cuantitativo de la mejora.*

| Forma de Medición | CER | WER |
|-------------------|-----|-----|
| Valor baseline | 8.85% | 13.05% |
| Valor optimizado | 7.72% | 11.40% |
| Mejora absoluta | -1.13 pp | -1.65 pp |
| Reducción relativa del error | **12.8%** | **12.6%** |
| Factor de mejora | 1.15x | 1.14x |
| **Mejor trial (5 páginas)** | **0.79%** | **7.78%** |

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

**Figura 18.** *Reducción de errores (baseline vs optimizado).*

```mermaid
---
title: "Reducción de errores (baseline vs optimizado)"
config:
  theme: base
  themeVariables:
    primaryColor: "#E6F4F9"
    primaryTextColor: "#404040"
    primaryBorderColor: "#0098CD"
    lineColor: "#0098CD"
  xyChart:
    plotColorPalette: "#0098CD"
---
xychart-beta
    x-axis ["CER Baseline", "CER Optimizado", "WER Baseline", "WER Optimizado"]
    y-axis "Tasa de error (%)" 0 --> 16
    bar [8.85, 7.72, 13.05, 11.40]
```

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

Leyenda: CER = Character Error Rate, WER = Word Error Rate. Baseline = configuración por defecto de PaddleOCR. Optimizado = configuración encontrada por Ray Tune. Los valores corresponden al dataset completo de 45 páginas.

#### Impacto Práctico

La reducción de CER y WER implica menos correcciones manuales en el texto reconocido. En conjunto, los resultados muestran una mejora medible en precisión, aunque la generalización depende del tamaño y representatividad del subconjunto de optimización.

### Tiempo de Ejecución

**Tabla 42.** *Métricas de tiempo del experimento (GPU).*

| Métrica | Valor |
|---------|-------|
| Tiempo total del experimento | ~5.0 minutos |
| Tiempo medio por trial | 4.64 segundos |
| Tiempo medio por página | 0.84 segundos |
| Variabilidad (std) | 0.53 segundos/página |
| Páginas procesadas totales | 320 |

**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).

Observaciones:

1. El tiempo por página (~0.84 segundos) corresponde a ejecución con GPU (RTX 3060).
2. La variabilidad del tiempo es moderada (std = 0.53 s/página), con algunos trials más lentos debido a configuraciones con módulos de preprocesamiento activos.
3. En comparación, la ejecución en CPU requiere ~69 segundos/página (82x más lento), lo que justifica el uso de GPU para optimización y producción.

### Síntesis de la Optimización

Los 64 trials ejecutados con Ray Tune y aceleración GPU revelaron patrones claros en el comportamiento de PaddleOCR. El hallazgo más significativo es que los parámetros estructurales, `textline_orientation` y `use_doc_orientation_classify`, tienen mayor impacto que los umbrales numéricos. Al activarlos se reduce el CER medio de 4.73% a 1.74%. En cuanto a umbrales, valores bajos de `text_det_thresh` (aprox. 0.05) benefician el rendimiento, mientras que `use_doc_unwarping` resulta innecesario para PDFs digitales.

La optimización logró mejoras claras frente al baseline en el dataset completo, aunque la generalización quedó limitada por el tamaño del subconjunto de ajuste.

**Fuente:** [`src/run_tuning.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/run_tuning.py), [`src/raytune_ocr.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_ocr.py), [`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).

## Discusión y análisis de resultados

Los resultados obtenidos en las secciones anteriores requieren un análisis que trascienda los números individuales para comprender su significado práctico. En esta sección se consolidan los hallazgos del benchmark comparativo y la optimización de hiperparámetros, evaluando hasta qué punto se han cumplido los objetivos planteados y qué limitaciones condicionan la generalización de las conclusiones.

### Resumen Consolidado de Resultados

#### Progresión del Rendimiento

**Tabla 43.** *Evolución del rendimiento a través del estudio.*

| Fase | Configuración | CER | Mejora vs baseline |
|------|--------------|-----|-------------------|
| Benchmark inicial | Baseline (5 páginas) | 7.76% | - |
| Optimización (mejor trial) | Optimizada (5 páginas) | **0.79%** | 89.8% |
| Validación final | Optimizada (45 páginas) | 7.72% | 12.8% |

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

**Figura 19.** *Evolución del CER a través del estudio.*

```mermaid
---
title: "Evolución del CER a través del estudio"
config:
  theme: base
  themeVariables:
    primaryColor: "#E6F4F9"
    primaryTextColor: "#404040"
    primaryBorderColor: "#0098CD"
    lineColor: "#0098CD"
  xyChart:
    plotColorPalette: "#0098CD"
---
xychart-beta
    x-axis ["Baseline", "Mejor trial (5 pág)", "Validación (45 pág)"]
    y-axis "CER (%)" 0 --> 10
    bar [7.76, 0.79, 7.72]
```

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

Leyenda: El mejor trial alcanza CER 0.79% (objetivo cumplido). La validación sobre dataset completo muestra CER 7.72%, evidenciando sobreajuste al subconjunto de optimización.

El incremento del CER de 0.79% (5 páginas) a 7.72% (45 páginas) evidencia sobreajuste al subconjunto de optimización. Este fenómeno es esperado cuando se optimiza sobre un subconjunto pequeño y se valida sobre el dataset completo con mayor diversidad de secciones y estilos.

#### Comparación con Objetivo

**Tabla 44.** *Verificación del objetivo general.*

| Aspecto | Objetivo | Resultado (trial) | Resultado (full) | Cumplimiento |
|---------|----------|-------------------|------------------|--------------|
| Métrica | CER | CER | CER | ✓ |
| Umbral | < 2% | **0.79%** | 7.72% | Parcial |
| Método | Sin fine-tuning | Solo hiperparámetros | Solo hiperparámetros | ✓ |
| Hardware | GPU | RTX 3060 | RTX 3060 | ✓ |

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

> **Análisis del cumplimiento:** El objetivo de CER < 2% se cumple en el mejor trial individual (0.79%), demostrando que la optimización de hiperparámetros puede alcanzar la precisión objetivo. Sin embargo, la validación sobre el dataset completo (7.72%) muestra que la generalización requiere trabajo adicional, como un subconjunto de optimización más representativo o técnicas de regularización.

### Análisis Detallado de Hiperparámetros

#### Jerarquía de Importancia

Basándose en el análisis de los resultados de optimización:

**Tabla 45.** *Ranking de importancia de hiperparámetros.*

| Rank | Parámetro | Pearson (CER) | Signo | Evidencia |
|------|-----------|---------------|-------|-----------|
| 1 | `use_doc_unwarping` | 0.879 | Positivo | Correlación más alta con CER |
| 2 | `use_doc_orientation_classify` | -0.712 | Negativo | Correlación alta con CER |
| 3 | `textline_orientation` | -0.535 | Negativo | Correlación alta con CER |
| 4 | `text_det_thresh` | 0.428 | Positivo | Correlación moderada con CER |
| 5 | `text_det_box_thresh` | 0.311 | Positivo | Correlación moderada con CER |
| 6 | `text_rec_score_thresh` | -0.268 | Negativo | Correlación moderada con CER |

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

**Figura 21.** *Ranking de importancia de hiperparámetros.*

```mermaid
---
title: "Ranking de importancia de hiperparámetros"
config:
  theme: base
  themeVariables:
    primaryColor: "#E6F4F9"
    primaryTextColor: "#404040"
    primaryBorderColor: "#0098CD"
    lineColor: "#0098CD"
  xyChart:
    plotColorPalette: "#0098CD"
---
xychart-beta horizontal
    x-axis ["use_doc_unwarping", "use_doc_orientation_classify", "textline_orientation", "text_det_thresh", "text_det_box_thresh", "text_rec_score_thresh"]
    y-axis "Impacto relativo" 0 --> 100
    bar [100.0, 81.0, 60.8, 48.7, 35.4, 30.5]
```

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

Leyenda: Impacto relativo basado en |Pearson| (CER), normalizado respecto al valor máximo.

En términos de correlación lineal, `use_doc_unwarping` es el parámetro con mayor relación absoluta con el CER y su signo positivo indica que activarlo incrementa el error en este dataset. En cambio, `use_doc_orientation_classify` y `textline_orientation` presentan correlación negativa, lo que sugiere mejoras cuando están activados.

#### Análisis del Parámetro textline_orientation

**Por qué es tan importante:**

El clasificador de orientación de línea resuelve un problema fundamental en documentos con secciones y cambios de formato: determinar el orden correcto de lectura. Sin este clasificador:

1. Las líneas del índice pueden mezclarse con el cuerpo del texto
2. Los encabezados pueden insertarse en posiciones incorrectas
3. Las listas numeradas pueden leerse en orden incorrecto

Para documentos académicos que típicamente incluyen índice, listas y encabezados multinivel, este clasificador es esencial.

**Recomendación**: Siempre activar `textline_orientation=True` para documentos estructurados.

#### Análisis del Parámetro text_det_thresh

**Comportamiento observado:**

El análisis de correlación muestra que valores más bajos de `text_det_thresh` favorecen el rendimiento en este dataset. El valor óptimo encontrado en los trials fue 0.0462, lo que sugiere que una detección más sensible beneficia el resultado.

#### Análisis de Parámetros de Preprocesamiento

**`use_doc_orientation_classify`:**

En la configuración óptima GPU, este parámetro está **activado** (True), a diferencia de lo observado en experimentos anteriores. Esto sugiere que la clasificación de orientación del documento puede beneficiar incluso documentos digitales cuando se combina con `textline_orientation=True`.

**`use_doc_unwarping`:**

Este módulo permanece desactivado en la configuración óptima. Está diseñado para:
- Documentos escaneados con rotación
- Fotografías de documentos con perspectiva
- Documentos curvados o deformados

Para documentos PDF digitales como los evaluados, este módulo es innecesario y puede introducir artefactos.

### Análisis de Casos de Fallo

#### Clasificación de Errores

**Tabla 46.** *Tipología de errores observados.*

| Tipo de error | Frecuencia | Ejemplo | Causa probable |
|---------------|------------|---------|----------------|
| Pérdida de acentos | Alta | más → mas | Modelo de reconocimiento |
| Duplicación de caracteres | Media | titulación → titulacióon | Solapamiento de detecciones |
| Confusión de puntuación | Media | ¿ → ? | Caracteres similares |
| Pérdida de eñe | Baja | año → ano | Modelo de reconocimiento |
| Texto desordenado | Variable | Mezcla de líneas | Fallo de orientación |

**Fuente:** Análisis cualitativo.

#### Patrones de Fallo por Tipo de Contenido

**Tabla 47.** *Tasa de error por tipo de contenido (cualitativa).*

| Tipo de contenido | Nivel de error | Factor de riesgo |
|-------------------|----------------|------------------|
| Párrafos de texto | Bajo | Bajo |
| Listas numeradas | Medio | Medio |
| Índice y encabezados | Medio | Medio |
| Encabezados + pie de página | Medio | Medio |
| Texto con cambios tipográficos | Medio | Medio |
| Listas con numeración densa | Alto | Alto |

**Fuente:** Estimación cualitativa.

### Comparación con Objetivos Específicos

**Tabla 48.** *Cumplimiento de objetivos específicos.*

| Objetivo | Descripción | Resultado | Estado |
|----------|-------------|-----------|--------|
| OE1 | Comparar soluciones OCR | EasyOCR, PaddleOCR, DocTR evaluados; PaddleOCR seleccionado | ✓ Cumplido |
| OE2 | Preparar dataset de evaluación | 45 páginas con ground truth | ✓ Cumplido |
| OE3 | Identificar hiperparámetros críticos | `textline_orientation`, `use_doc_orientation_classify`, `text_det_thresh` identificados | ✓ Cumplido |
| OE4 | Optimizar con Ray Tune (≥50 trials) | 64 trials ejecutados con GPU | ✓ Cumplido |
| OE5 | Validar configuración optimizada | CER: 8.85% → 7.72% (dataset), 0.79% (mejor trial) | ✓ Parcial |

**Fuente:** [`docs/metrics/metrics_paddle.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_paddle.md), [`src/results/correlations/paddle_correlations.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/correlations/paddle_correlations.csv), [`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).

> **Nota sobre OE5:** El objetivo de CER < 2% se cumple en el mejor trial individual (0.79%). La validación sobre el dataset completo (7.72%) muestra que la generalización requiere mayor trabajo, identificándose como línea de trabajo futuro.

### Limitaciones del Estudio

#### Limitaciones de Generalización

1. **Tipo de documento único**: Solo se evaluaron documentos académicos de UNIR. La configuración óptima puede no ser transferible a otros tipos de documentos (facturas, formularios, contratos).

2. **Idioma único**: El estudio se centró en español. Otros idiomas con diferentes características ortográficas podrían requerir configuraciones diferentes.

3. **Formato único**: Solo se evaluaron PDFs digitales. Documentos escaneados o fotografías de documentos podrían beneficiarse de diferentes configuraciones.

#### Limitaciones Metodológicas

1. **Ground truth automático**: El texto de referencia se extrajo programáticamente del PDF, lo cual puede introducir errores en el orden de lectura cuando hay secciones con encabezados y saltos de línea.

2. **Tamaño del dataset**: 45 páginas es un dataset limitado. Un dataset más amplio proporcionaría estimaciones más robustas.

3. **Parámetro fijo**: `text_det_unclip_ratio` se mantuvo en 0.0 durante todo el experimento. Explorar este parámetro podría revelar mejoras adicionales.

4. **Subconjunto de ajuste limitado**: 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.

#### Limitaciones de Validación

1. **Sin validación cruzada**: No se realizó validación cruzada sobre diferentes subconjuntos del dataset.

2. **Sin test set independiente**: El dataset de validación final se solapaba parcialmente con el de optimización.

### Implicaciones Prácticas

#### Guía de Configuración Recomendada

Para documentos académicos en español similares a los evaluados:

**Tabla 49.** *Configuración recomendada para PaddleOCR con GPU.*

| Parámetro | Valor | Prioridad | Justificación |
|-----------|-------|-----------|---------------|
| `textline_orientation` | True | Obligatorio | Crítico para documentos con secciones |
| `use_doc_orientation_classify` | True | Recomendado | Mejora orientación de documento |
| `text_det_thresh` | 0.05 (rango: 0.04-0.10) | Recomendado | Detección sensible beneficia resultados |
| `text_det_box_thresh` | 0.49 (rango: 0.4-0.6) | Recomendado | Balance de confianza |
| `text_rec_score_thresh` | 0.57 (rango: 0.5-0.7) | Opcional | Filtra reconocimientos poco confiables |
| `use_doc_unwarping` | False | No recomendado | Innecesario para PDFs digitales |

**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).

#### ¿Cuándo aplicar esta metodología?

La optimización de hiperparámetros es recomendable cuando:

1. **GPU disponible**: Acelera significativamente la exploración del espacio de hiperparámetros (82x más rápido que CPU).

2. **Modelo preentrenado adecuado**: El modelo ya soporta el idioma objetivo (como PaddleOCR para español).

3. **Dominio específico**: Se busca optimizar para un tipo de documento particular.

4. **Mejora incremental**: El rendimiento baseline es aceptable pero mejorable.

5. **Sin datos de entrenamiento**: No se dispone de datasets etiquetados para fine-tuning.

#### ¿Cuándo no aplicar esta metodología?

La optimización de hiperparámetros puede ser insuficiente cuando:

1. **Idioma no soportado**: El modelo no incluye el idioma en su vocabulario.

2. **Escritura manuscrita**: Requiere fine-tuning o modelos especializados.

3. **Documentos muy degradados**: Escaneos de baja calidad o documentos históricos.

4. **Requisitos de CER muy bajo**: Puede requerir fine-tuning para alcanzar precisiones muy altas.

### Síntesis del Capítulo

A lo largo de este capítulo se ha desarrollado el proceso completo de evaluación y optimización de sistemas OCR para documentos académicos en español. El benchmark comparativo inicial permitió seleccionar PaddleOCR como motor base gracias a su combinación de rendimiento y configurabilidad. La posterior optimización con Ray Tune y Optuna, ejecutada sobre 64 trials con aceleración GPU, identificó los parámetros críticos para maximizar el rendimiento: `textline_orientation`, `use_doc_orientation_classify` y `text_det_thresh`.

Los resultados cuantifican tanto los logros como las limitaciones del enfoque. El mejor trial individual alcanzó un CER de 0.79%, cumpliendo holgadamente el objetivo de CER < 2%. Sin embargo, la validación sobre el dataset completo de 45 páginas reveló un CER de 7.72%, lo que representa una mejora del 12.8% respecto al baseline (8.85%) pero evidencia sobreajuste al subconjunto de optimización. Esta observación es valiosa: indica que futuros trabajos deberían emplear subconjuntos de optimización más representativos o aplicar técnicas de regularización.

Desde el punto de vista práctico, la infraestructura dockerizada desarrollada y la aceleración GPU (82x más rápida que CPU) demuestran la viabilidad de esta metodología tanto para experimentación como para despliegue en producción.

**Fuente:**
- [`src/run_tuning.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/run_tuning.py) - Script principal de optimización
- [`src/raytune/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune/requirements.txt) - Dependencias del orquestador Ray Tune
- [`src/paddle_ocr/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/requirements.txt) - Dependencias del servicio PaddleOCR
- [`src/easyocr_service/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service/requirements.txt) - Dependencias del servicio EasyOCR
- [`src/doctr_service/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/requirements.txt) - Dependencias del servicio DocTR
- [`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) - Resultados CSV de PaddleOCR
- [`src/results/correlations/paddle_correlations.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/correlations/paddle_correlations.csv) - Correlaciones de hiperparámetros (PaddleOCR)
- [`src/results/raytune_easyocr_results_20260119_120204.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_easyocr_results_20260119_120204.csv) - Resultados CSV de EasyOCR
- [`src/results/raytune_doctr_results_20260119_121445.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_doctr_results_20260119_121445.csv) - Resultados CSV de DocTR
- [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_paddle_subproc_results_20251207_192320.csv) - Referencia de tiempos en CPU para PaddleOCR

Imágenes Docker:
- [`seryus.ddns.net/unir/paddle-ocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/paddle-ocr-gpu/latest) - PaddleOCR con soporte GPU
- [`seryus.ddns.net/unir/easyocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/easyocr-gpu/latest) - EasyOCR con soporte GPU
- [`seryus.ddns.net/unir/doctr-gpu`](https://seryus.ddns.net/unir/-/packages/container/doctr-gpu/latest) - DocTR con soporte GPU

### Comparativa de Rendimiento CPU vs GPU

Esta sección presenta la comparación de rendimiento entre ejecución en CPU y GPU, justificando la elección de GPU para el experimento principal y demostrando el impacto práctico de la aceleración por hardware.

#### Configuración del Entorno GPU

**Tabla 50.** *Especificaciones del entorno GPU utilizado.*

| Componente | Especificación |
|------------|----------------|
| GPU | NVIDIA GeForce RTX 3060 Laptop |
| VRAM | 5.66 GB |
| CUDA | 12.4 |
| Sistema Operativo | Ubuntu 24.04.3 LTS |
| Kernel | 6.14.0-37-generic |

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

Nota: Los requisitos de entorno documentados por dependencias se detallan en [`docs/07_anexo_a.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/07_anexo_a.md), sección A.9.

Este hardware representa configuración típica de desarrollo, permitiendo evaluar el rendimiento en condiciones realistas de despliegue.

#### Comparación CPU vs GPU

Se comparó el tiempo de procesamiento entre CPU y GPU utilizando los datos de [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_paddle_subproc_results_20251207_192320.csv)(CPU) y [`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)(GPU).

**Tabla 51.** *Rendimiento comparativo CPU vs GPU.*

| Métrica | CPU | GPU (RTX 3060) | Factor de Aceleración |
|---------|-----|----------------|----------------------|
| Tiempo/Página (promedio) | 69.4s | 0.84s | **82x** |
| Dataset completo (45 páginas) | ~52 min | ~38 seg | **82x** |
| 64 trials x 5 páginas | 6.2 horas | ~5.0 min | **75x** |

**Fuente:** [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_paddle_subproc_results_20251207_192320.csv), [`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).

**Figura 20.** *Tiempo de procesamiento: CPU vs GPU (segundos/página).*

```mermaid
---
title: "Tiempo de procesamiento: CPU vs GPU (segundos/página)"
config:
  theme: base
  themeVariables:
    primaryColor: "#E6F4F9"
    primaryTextColor: "#404040"
    primaryBorderColor: "#0098CD"
    lineColor: "#0098CD"
  xyChart:
    plotColorPalette: "#0098CD"
---
xychart-beta
    x-axis ["CPU", "GPU (RTX 3060)"]
    y-axis "Segundos por página" 0 --> 75
    bar [69.4, 0.84]
```

**Fuente:** [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_paddle_subproc_results_20251207_192320.csv), [`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).

Leyenda: Aceleración de **82x** con GPU. El procesamiento de una página pasa de 69.4s (CPU) a 0.84s (GPU).

La aceleración de 82x obtenida con GPU transforma la viabilidad del enfoque:
- **Optimización en CPU (6.2 horas)**: Viable pero lento para iteraciones rápidas
- **Optimización en GPU (~5.0 minutos)**: Permite explorar más configuraciones y realizar múltiples experimentos
- **Producción con GPU (0.84s/página)**: Habilita procesamiento en tiempo real

#### Comparación de Modelos PaddleOCR

PaddleOCR ofrece dos variantes de modelos: Mobile (optimizados para dispositivos con recursos limitados) y Server (mayor precisión a costa de mayor consumo de memoria). Se evaluó la viabilidad de ambas variantes en el hardware disponible.

**Tabla 52.** *Comparación de modelos Mobile vs Server en RTX 3060.*

| Modelo | VRAM Requerida | Resultado | Recomendación |
|--------|----------------|-----------|---------------|
| PP-OCRv5 Mobile | 0.06 GB | Funciona correctamente | ✓ Recomendado |
| PP-OCRv5 Server | 5.3 GB | OOM en página 2 | ✗ Requiere >8 GB VRAM |

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

Los modelos Server, a pesar de ofrecer potencialmente mayor precisión, resultan inviables en hardware con VRAM limitada (≤6 GB) debido a errores de memoria (Out of Memory). Los modelos Mobile, con un consumo de memoria 88 veces menor, funcionan de manera estable y ofrecen rendimiento suficiente para el caso de uso evaluado.

La validación con aceleración GPU demuestra que la configuración optimizada mediante Ray Tune mejora la precisión (CER: 8.85% → 7.72% en dataset completo, 0.79% en mejor trial individual) y, combinada con la aceleración de 82x proporcionada por GPU, resulta prácticamente aplicable en escenarios de producción real. Las conclusiones derivadas de esta validación se presentan en el [Capítulo 5](#capitulo-5).
