assit commands for claude
All checks were successful
build_docker / essential (pull_request) Successful in 1s
build_docker / build_cpu (pull_request) Successful in 5m0s
build_docker / build_gpu (pull_request) Successful in 22m37s
build_docker / build_easyocr (pull_request) Successful in 18m5s
build_docker / build_easyocr_gpu (pull_request) Successful in 15m43s
build_docker / build_doctr (pull_request) Successful in 17m17s
build_docker / build_raytune (pull_request) Successful in 3m24s
build_docker / build_doctr_gpu (pull_request) Successful in 16m54s

This commit is contained in:
2026-01-20 11:35:56 +01:00
parent c7ed7b2b9c
commit 6b98aeacac
26 changed files with 1135 additions and 609 deletions

View File

@@ -24,7 +24,7 @@ El reconocimiento óptico de caracteres (OCR) en documentos académicos en espa
Se seleccionaron tres soluciones OCR de código abierto representativas del estado del arte:
**Tabla 10.** *Soluciones OCR evaluadas en el benchmark comparativo.*
**Tabla 11.** *Soluciones OCR evaluadas en el benchmark comparativo.*
| Solución | Desarrollador | Versión | Justificación de selección |
|----------|---------------|---------|----------------------------|
@@ -55,7 +55,7 @@ Los criterios establecidos para evaluar las soluciones fueron:
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/`.
**Tabla 11.** *Características del dataset de evaluación inicial.*
**Tabla 12.** *Características del dataset de evaluación inicial.*
| Característica | Valor |
|----------------|-------|
@@ -96,7 +96,7 @@ Se utilizó la biblioteca `jiwer` para calcular CER y WER de manera estandarizad
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, con CER entre 1.54% y 6.40% dependiendo de la complejidad del layout.
**Tabla 12.** *Variabilidad del CER por tipo de contenido.*
**Tabla 13.** *Variabilidad del CER por tipo de contenido.*
| Tipo de contenido | CER aproximado | Observaciones |
|-------------------|----------------|---------------|
@@ -121,7 +121,7 @@ Durante el benchmark inicial se evaluó PaddleOCR con configuración por defecto
Los tres modelos evaluados representan diferentes paradigmas de OCR:
**Tabla 13.** *Comparativa de arquitecturas OCR evaluadas.*
**Tabla 14.** *Comparativa de arquitecturas OCR evaluadas.*
| Modelo | Tipo | Componentes | Fortalezas Clave |
|--------|------|-------------|------------------|
@@ -162,7 +162,7 @@ Un análisis cualitativo de los errores producidos reveló patrones específicos
La selección de PaddleOCR para la fase de optimización se basó en los siguientes criterios:
**Tabla 14.** *Evaluación de criterios de selección.*
**Tabla 15.** *Evaluación de criterios de selección.*
| Criterio | EasyOCR | PaddleOCR | DocTR |
|----------|---------|-----------|-------|
@@ -244,7 +244,7 @@ La optimización de hiperparámetros representa una alternativa al fine-tuning t
El experimento se ejecutó en el siguiente entorno:
**Tabla 15.** *Entorno de ejecución del experimento.*
**Tabla 16.** *Entorno de ejecución del experimento.*
| Componente | Versión/Especificación |
|------------|------------------------|
@@ -272,7 +272,14 @@ Esta arquitectura containerizada permite ejecutar cada componente en su entorno
```mermaid
---
title: "Arquitectura de ejecución con Docker Compose"
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"]
@@ -313,11 +320,221 @@ Respuesta del servicio OCR:
}
```
#### 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 17.** *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://github.com/seryus/MastersThesis/tree/main/src/paddle_ocr), [`src/easyocr_service/`](https://github.com/seryus/MastersThesis/tree/main/src/easyocr_service), [`src/doctr_service/`](https://github.com/seryus/MastersThesis/tree/main/src/doctr_service), [`src/raytune/`](https://github.com/seryus/MastersThesis/tree/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 (~10 segundos)
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 18.** *Archivos Docker Compose del proyecto.*
| Archivo | Propósito | Servicios |
|---------|-----------|-----------|
| [`docker-compose.tuning.yml`](https://github.com/seryus/MastersThesis/blob/main/src/docker-compose.tuning.yml) | Optimización principal | RayTune + PaddleOCR + DocTR |
| [`docker-compose.tuning.easyocr.yml`](https://github.com/seryus/MastersThesis/blob/main/src/docker-compose.tuning.easyocr.yml) | Optimización EasyOCR | RayTune + EasyOCR |
| [`docker-compose.tuning.paddle.yml`](https://github.com/seryus/MastersThesis/blob/main/src/docker-compose.tuning.paddle.yml) | Optimización PaddleOCR | RayTune + PaddleOCR |
| [`docker-compose.tuning.doctr.yml`](https://github.com/seryus/MastersThesis/blob/main/src/docker-compose.tuning.doctr.yml) | Optimización DocTR | RayTune + DocTR |
*Fuente: Elaboración propia.*
> **\* 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 19.** *Volúmenes Docker para caché de modelos.*
| Volumen | Servicio | Contenido |
|---------|----------|-----------|
| `paddlex-model-cache` | PaddleOCR | Modelos PP-OCRv5 (~500 MB) |
| `easyocr-model-cache` | EasyOCR | Modelos CRAFT + CRNN (~400 MB) |
| `doctr-model-cache` | DocTR | Modelos db_resnet50 + crnn_vgg16_bn (~300 MB) |
*Fuente: Elaboración propia.*
##### 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)
##### 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://github.com/seryus/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://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv)
- [`src/results/raytune_easyocr_results_20260119_120204.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_easyocr_results_20260119_120204.csv)
- [`src/results/raytune_doctr_results_20260119_121445.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_doctr_results_20260119_121445.csv)
#### Dataset Extendido
Para la fase de optimización se extendió el dataset:
**Tabla 16.** *Características del dataset de optimización.*
**Tabla 20.** *Características del dataset de optimización.*
| Característica | Valor |
|----------------|-------|
@@ -335,7 +552,7 @@ La clase `ImageTextDataset` gestiona la carga de pares imagen-texto desde la est
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` (ver Anexo A).
**Tabla 17.** *Descripción detallada del espacio de búsqueda.*
**Tabla 21.** *Descripción detallada del espacio de búsqueda.*
| Parámetro | Tipo | Rango | Descripción |
|-----------|------|-------|-------------|
@@ -361,7 +578,7 @@ El espacio de búsqueda se definió considerando los hiperparámetros más relev
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` (ver Anexo A).
**Tabla 18.** *Parámetros de configuración de Ray Tune.*
**Tabla 22.** *Parámetros de configuración de Ray Tune.*
| Parámetro | Valor | Justificación |
|-----------|-------|---------------|
@@ -387,7 +604,7 @@ El número de trials se eligió considerando:
El experimento se ejecutó exitosamente con los siguientes resultados globales:
**Tabla 19.** *Resumen de la ejecución del experimento.*
**Tabla 23.** *Resumen de la ejecución del experimento.*
| Métrica | Valor |
|---------|-------|
@@ -401,76 +618,73 @@ El experimento se ejecutó exitosamente con los siguientes resultados globales:
#### Estadísticas Descriptivas
Del archivo CSV de resultados (`raytune_paddle_subproc_results_20251207_192320.csv`):
Del archivo CSV de resultados (`src/results/raytune_paddle_results_20260119_122609.csv`):
**Tabla 20.** *Estadísticas descriptivas de los 64 trials.*
**Tabla 24.** *Estadísticas descriptivas de los 64 trials.*
| Estadística | CER | WER | Tiempo (s) | Tiempo/Página (s) |
|-------------|-----|-----|------------|-------------------|
| **count** | 64 | 64 | 64 | 64 |
| **mean** | 5.25% | 14.28% | 347.61 | 69.42 |
| **std** | 11.03% | 10.75% | 7.88 | 1.57 |
| **min** | 1.15% | 9.89% | 320.97 | 64.10 |
| **25%** | 1.20% | 10.04% | 344.24 | 68.76 |
| **50%** (mediana) | 1.23% | 10.20% | 346.42 | 69.19 |
| **75%** | 4.03% | 13.20% | 350.14 | 69.93 |
| **max** | 51.61% | 59.45% | 368.57 | 73.63 |
| 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/raytune_paddle_subproc_results_20251207_192320.csv`.*
*Fuente: `src/results/raytune_paddle_results_20260119_122609.csv`.*
**Observaciones:**
1. **Alta varianza en CER**: La desviación estándar (11.03%) es mayor que la media (5.25%), indicando una distribución muy dispersa con algunos valores extremos.
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 (1.23%) es mucho menor que la media (5.25%), confirmando una distribución sesgada hacia valores bajos con outliers altos.
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. **Tiempo consistente**: El tiempo de ejecución es muy estable (std = 1.57 s/página), indicando que las configuraciones de hiperparámetros no afectan significativamente el tiempo de inferencia.
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 21.** *Distribución de trials por rango de CER.*
**Tabla 25.** *Distribución de trials por rango de CER.*
| Rango CER | Número de trials | Porcentaje |
|-----------|------------------|------------|
| < 2% | 43 | 67.2% |
| 2% - 5% | 7 | 10.9% |
| 5% - 10% | 2 | 3.1% |
| 10% - 20% | 5 | 7.8% |
| > 20% | 7 | 10.9% |
| 2% - 5% | 10 | 15.6% |
| 5% - 10% | 11 | 17.2% |
| > 10% | 0 | 0.0% |
*Fuente: Elaboración propia a partir del CSV de resultados.*
*Fuente: Elaboración propia a partir de `src/results/raytune_paddle_results_20260119_122609.csv`.*
La mayoría de trials (67.2%) alcanzaron CER < 2%, cumpliendo el objetivo establecido. Sin embargo, un 10.9% de trials presentaron fallos catastróficos (CER > 20%).
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.011535 (1.15%)
Best WER: 0.098902 (9.89%)
Best CER: 0.007884 (0.79%)
Best WER: 0.077848 (7.78%)
Configuración óptima:
textline_orientation: True
use_doc_orientation_classify: False
use_doc_orientation_classify: True
use_doc_unwarping: False
text_det_thresh: 0.4690
text_det_box_thresh: 0.5412
text_det_thresh: 0.0462
text_det_box_thresh: 0.4862
text_det_unclip_ratio: 0.0
text_rec_score_thresh: 0.6350
text_rec_score_thresh: 0.5658
```
**Tabla 22.** *Configuración óptima identificada.*
**Tabla 26.** *Configuración óptima identificada.*
| Parámetro | Valor óptimo | Valor por defecto | Cambio |
|-----------|--------------|-------------------|--------|
| textline_orientation | **True** | False | Activado |
| use_doc_orientation_classify | False | False | Sin cambio |
| use_doc_orientation_classify | **True** | False | Activado |
| use_doc_unwarping | False | False | Sin cambio |
| text_det_thresh | **0.4690** | 0.3 | +0.169 |
| text_det_box_thresh | **0.5412** | 0.6 | -0.059 |
| 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.6350** | 0.5 | +0.135 |
| text_rec_score_thresh | **0.5658** | 0.5 | +0.066 |
*Fuente: Análisis de [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results) generados por [`src/run_tuning.py`](https://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py).*
@@ -478,7 +692,7 @@ Configuración óptima:
Se calculó la correlación de Pearson entre los parámetros continuos y las métricas de error:
**Tabla 23.** *Correlación de parámetros con CER.*
**Tabla 27.** *Correlación de parámetros con CER.*
| Parámetro | Correlación con CER | Interpretación |
|-----------|---------------------|----------------|
@@ -489,7 +703,7 @@ Se calculó la correlación de Pearson entre los parámetros continuos y las mé
*Fuente: Análisis de [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results) generados por [`src/run_tuning.py`](https://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py).*
**Tabla 24.** *Correlación de parámetros con WER.*
**Tabla 28.** *Correlación de parámetros con WER.*
| Parámetro | Correlación con WER | Interpretación |
|-----------|---------------------|----------------|
@@ -505,7 +719,7 @@ Se calculó la correlación de Pearson entre los parámetros continuos y las mé
El parámetro booleano `textline_orientation` demostró tener el mayor impacto en el rendimiento:
**Tabla 25.** *Impacto del parámetro textline_orientation.*
**Tabla 29.** *Impacto del parámetro textline_orientation.*
| textline_orientation | CER Medio | CER Std | WER Medio | N trials |
|---------------------|-----------|---------|-----------|----------|
@@ -525,6 +739,13 @@ El parámetro booleano `textline_orientation` demostró tener el mayor impacto e
```mermaid
---
title: "Impacto de textline_orientation en CER"
config:
theme: base
themeVariables:
primaryColor: "#E6F4F9"
primaryTextColor: "#404040"
primaryBorderColor: "#0098CD"
lineColor: "#0098CD"
---
xychart-beta
x-axis ["textline_orientation=False", "textline_orientation=True"]
@@ -540,7 +761,7 @@ El parámetro `textline_orientation` activa un clasificador que determina la ori
Los trials con CER muy alto (>20%) presentaron patrones específicos:
**Tabla 26.** *Características de trials con fallos catastróficos.*
**Tabla 30.** *Características de trials con fallos catastróficos.*
| Trial | CER | text_det_thresh | textline_orientation | Diagnóstico |
|-------|-----|-----------------|---------------------|-------------|
@@ -565,42 +786,52 @@ Los trials con CER muy alto (>20%) presentaron patrones específicos:
#### Evaluación sobre Dataset Completo
La configuración óptima identificada se evaluó sobre el dataset completo de 24 páginas, comparando con la configuración baseline (valores por defecto de PaddleOCR). Los parámetros optimizados más relevantes fueron: `textline_orientation=True`, `text_det_thresh=0.4690`, `text_det_box_thresh=0.5412`, y `text_rec_score_thresh=0.6350`.
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 27.** *Comparación baseline vs optimizado (24 páginas).*
**Tabla 31.** *Comparación baseline vs optimizado (45 páginas).*
| Modelo | CER | Precisión Caracteres | WER | Precisión Palabras |
|--------|-----|---------------------|-----|-------------------|
| PaddleOCR (Baseline) | 7.78% | 92.22% | 14.94% | 85.06% |
| PaddleOCR-HyperAdjust | **1.49%** | **98.51%** | **7.62%** | **92.38%** |
| PaddleOCR (Baseline) | 8.85% | 91.15% | 13.05% | 86.95% |
| PaddleOCR-HyperAdjust | **7.72%** | **92.28%** | **11.40%** | **88.60%** |
*Fuente: Validación final. Código en [`src/run_tuning.py`](https://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py), resultados en [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results).*
> **Nota sobre generalización:** El mejor trial individual (5 páginas) alcanzó un CER de 0.79%, cumpliendo el objetivo de CER < 2%. Sin embargo, al aplicar la configuración al dataset completo de 45 páginas, el CER aumentó a 7.72%, evidenciando sobreajuste al subconjunto de entrenamiento. Esta diferencia es un hallazgo importante que se discute en la sección de análisis.
#### Métricas de Mejora
**Tabla 28.** *Análisis cuantitativo de la mejora.*
**Tabla 32.** *Análisis cuantitativo de la mejora.*
| Forma de Medición | CER | WER |
|-------------------|-----|-----|
| Valor baseline | 7.78% | 14.94% |
| Valor optimizado | 1.49% | 7.62% |
| Mejora absoluta | -6.29 pp | -7.32 pp |
| Reducción relativa del error | **80.9%** | **49.0%** |
| Factor de mejora | 5.2× | 2.0× |
| 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.15× | 1.14× |
| **Mejor trial (5 páginas)** | **0.79%** | **7.78%** |
*Fuente: Elaboración propia.*
```mermaid
---
title: "Reducción de errores: Baseline vs Optimizado"
title: "Reducción de errores: Baseline vs Optimizado (45 páginas)"
config:
theme: base
themeVariables:
primaryColor: "#E6F4F9"
primaryTextColor: "#404040"
primaryBorderColor: "#0098CD"
lineColor: "#0098CD"
---
xychart-beta
x-axis ["CER Baseline", "CER Optimizado", "WER Baseline", "WER Optimizado"]
y-axis "Tasa de error (%)" 0 --> 16
bar [7.78, 1.49, 14.94, 7.62]
bar [8.85, 7.72, 13.05, 11.40]
```
*Leyenda: CER = Character Error Rate, WER = Word Error Rate. Baseline = configuración por defecto de PaddleOCR. Optimizado = configuración encontrada por Ray Tune.*
*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
@@ -608,58 +839,61 @@ xychart-beta
| Configuración | Caracteres con error | Palabras con error* |
|---------------|---------------------|---------------------|
| Baseline | ~778 | ~225 |
| Optimizada | ~149 | ~115 |
| **Reducción** | **629 menos** | **110 menos** |
| Baseline | ~885 | ~196 |
| Optimizada (full dataset) | ~772 | ~171 |
| Optimizada (mejor trial) | ~79 | ~117 |
| **Reducción (full dataset)** | **113 menos** | **25 menos** |
*Asumiendo longitud media de palabra = 6.6 caracteres en español.
**Interpretación del notebook:**
**Interpretación:**
> "La optimización de hiperparámetros mejoró la precisión de caracteres de 92.2% a 98.5%, una ganancia de 6.3 puntos porcentuales. Aunque el baseline ya ofrecía resultados aceptables, la configuración optimizada reduce los errores residuales en un 80.9%."
> "La optimización de hiperparámetros logró una mejora del 12.8% en el CER sobre el dataset completo de 45 páginas. Aunque esta mejora es más modesta que la observada en los trials individuales (donde se alcanzó 0.79% CER), demuestra el valor de la optimización sistemática. La diferencia entre el mejor trial (0.79%) y el resultado en dataset completo (7.72%) revela un fenómeno de sobreajuste al subconjunto de 5 páginas usado para evaluación."
### Tiempo de Ejecución
**Tabla 29.** *Métricas de tiempo del experimento.*
**Tabla 33.** *Métricas de tiempo del experimento (GPU).*
| Métrica | Valor |
|---------|-------|
| Tiempo total del experimento | ~6.4 horas |
| Tiempo medio por trial | 347.61 segundos (~5.8 min) |
| Tiempo medio por página | 69.42 segundos |
| Variabilidad (std) | 1.57 segundos/página |
| Tiempo total del experimento | ~1.5 horas |
| Tiempo medio por trial | ~4.2 segundos |
| Tiempo medio por página | 0.84 segundos |
| Variabilidad (std) | 0.53 segundos/página |
| Páginas procesadas totales | 320 |
*Fuente: CSV de resultados.*
*Fuente: [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv).*
**Observaciones:**
1. El tiempo por página (~70 segundos) corresponde a ejecución en CPU sin aceleración.
2. La variabilidad del tiempo es muy baja, indicando que los hiperparámetros no afectan significativamente la velocidad.
3. Con GPU, los tiempos serían 10-50× menores según benchmarks de PaddleOCR.
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 (82× más lento), lo que justifica el uso de GPU para optimización y producción.
### Resumen de la Sección
Esta sección ha presentado:
1. **Configuración del experimento**: Arquitectura Docker Compose, dataset extendido, espacio de búsqueda de 7 dimensiones
1. **Configuración del experimento**: Arquitectura Docker Compose, dataset de 45 páginas, espacio de búsqueda de 7 dimensiones, ejecución con GPU RTX 3060
2. **Resultados estadísticos**:
- CER medio: 5.25% (std: 11.03%)
- CER mínimo: 1.15%
- CER medio: 2.30% (std: 2.20%)
- CER mínimo (mejor trial): **0.79%**
- 67.2% de trials con CER < 2%
3. **Hallazgos clave**:
- `textline_orientation=True` reduce CER en 69.7%
- `text_det_thresh` tiene correlación -0.52 con CER
- Valores de `text_det_thresh` < 0.1 causan fallos catastróficos
- `textline_orientation=True` y `use_doc_orientation_classify=True` son críticos
- `text_det_thresh` bajo (0.0462) optimiza la detección de texto
- Ningún trial presentó fallos catastróficos (CER > 10%)
4. **Mejora final**: CER reducido de 7.78% a 1.49% (reducción del 80.9%)
4. **Mejora en dataset completo**: CER reducido de 8.85% a 7.72% (reducción del 12.8%)
5. **Observación sobre generalización**: El mejor trial (0.79%) no generalizó completamente al dataset completo (7.72%), evidenciando sobreajuste al subconjunto de 5 páginas
**Fuentes de datos:**
- [`src/run_tuning.py`](https://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py): Script principal de optimización
- [`src/raytune_ocr.py`](https://github.com/seryus/MastersThesis/blob/main/src/raytune_ocr.py): Librería de utilidades Ray Tune
- [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results): Resultados CSV de los trials
- [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv): Resultados CSV de los 64 trials
## Discusión y análisis de resultados
@@ -671,49 +905,51 @@ Esta sección presenta un análisis consolidado de los resultados obtenidos en l
#### Progresión del Rendimiento
**Tabla 30.** *Evolución del rendimiento a través del estudio.*
**Tabla 34.** *Evolución del rendimiento a través del estudio.*
| Fase | Configuración | CER | Mejora vs anterior |
|------|--------------|-----|-------------------|
| Benchmark inicial | Baseline (5 páginas) | ~5-6% | - |
| Optimización (mejor trial) | Optimizada (5 páginas) | 1.15% | ~80% |
| Validación final | Optimizada (24 páginas) | 1.49% | - |
| Benchmark inicial | Baseline (5 páginas) | ~7-8% | - |
| Optimización (mejor trial) | Optimizada (5 páginas) | **0.79%** | ~90% vs baseline |
| Validación final | Optimizada (45 páginas) | 7.72% | 12.8% vs baseline |
*Fuente: Elaboración propia.*
El incremento del CER de 1.15% (5 páginas) a 1.49% (24 páginas) es esperado debido a la mayor diversidad de layouts en el dataset completo.
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 layouts.
#### Comparación con Objetivo
**Tabla 31.** *Verificación del objetivo general.*
**Tabla 35.** *Verificación del objetivo general.*
| Aspecto | Objetivo | Resultado | Cumplimiento |
|---------|----------|-----------|--------------|
| Métrica | CER | CER | ✓ |
| Umbral | < 2% | 1.49% | ✓ |
| Método | Sin fine-tuning | Solo hiperparámetros | ✓ |
| Hardware | Sin GPU | CPU only | ✓ |
| 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: Elaboración propia.*
> **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 correlación y el impacto observado:
Basándose en el análisis de los resultados de optimización:
**Tabla 32.** *Ranking de importancia de hiperparámetros.*
**Tabla 36.** *Ranking de importancia de hiperparámetros.*
| Rank | Parámetro | Impacto | Evidencia |
|------|-----------|---------|-----------|
| 1 | `textline_orientation` | **Crítico** | Reduce CER 69.7% |
| 2 | `text_det_thresh` | **Alto** | Correlación -0.52 |
| 3 | `text_rec_score_thresh` | Medio | Correlación -0.16 |
| 4 | `text_det_box_thresh` | Bajo | Correlación +0.23 |
| 5 | `use_doc_orientation_classify` | Nulo | Sin mejora |
| 6 | `use_doc_unwarping` | Nulo | Sin mejora |
| 1 | `textline_orientation` | **Crítico** | Presente en todos los mejores trials |
| 2 | `use_doc_orientation_classify` | **Alto** | Activado en configuración óptima |
| 3 | `text_det_thresh` | **Alto** | Valor óptimo bajo (0.0462) |
| 4 | `text_det_box_thresh` | Medio | Moderado (0.4862) |
| 5 | `text_rec_score_thresh` | Medio | Moderado (0.5658) |
| 6 | `use_doc_unwarping` | Nulo | Desactivado en configuración óptima |
*Fuente: Elaboración propia.*
*Fuente: Elaboración propia basada en [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv).*
#### Análisis del Parámetro textline_orientation
@@ -735,35 +971,39 @@ Para documentos académicos que típicamente incluyen tablas, listas y encabezad
| Rango | CER típico | Comportamiento |
|-------|------------|----------------|
| 0.0 - 0.1 | >20% | Fallos catastróficos |
| 0.1 - 0.3 | 5-15% | Rendimiento pobre |
| 0.3 - 0.5 | 1-5% | Rendimiento óptimo |
| 0.5 - 0.7 | 2-8% | Rendimiento aceptable |
| 0.0 - 0.1 | 1-3% | Detecta más texto, incluyendo bordes |
| 0.1 - 0.3 | 2-5% | Rendimiento variable |
| 0.3 - 0.5 | 3-7% | Balance precisión/recall |
| 0.5 - 0.7 | 4-7% | Más conservador |
**Interpretación:**
- Valores muy bajos (< 0.1) incluyen ruido y artefactos como "texto"
- Valores muy altos (> 0.6) filtran texto legítimo de bajo contraste
- El rango óptimo (0.3-0.5) balancea precisión y recall de detección
- En ejecución GPU con modelos Mobile, valores bajos de `text_det_thresh` funcionan bien
- El valor óptimo (0.0462) indica que una detección más sensible beneficia el rendimiento
- A diferencia de CPU, no se observaron fallos catastróficos con valores bajos
**Valor óptimo encontrado**: 0.4690
**Valor óptimo encontrado**: 0.0462
#### Parámetros sin Impacto Significativo
#### Análisis de Parámetros de Preprocesamiento
**`use_doc_orientation_classify` y `use_doc_unwarping`:**
**`use_doc_orientation_classify`:**
Estos módulos están diseñados para:
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, estos módulos son innecesarios e incluso pueden introducir artefactos. Su desactivación reduce el tiempo de procesamiento sin pérdida de precisión.
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 33.** *Tipología de errores observados.*
**Tabla 37.** *Tipología de errores observados.*
| Tipo de error | Frecuencia | Ejemplo | Causa probable |
|---------------|------------|---------|----------------|
@@ -777,7 +1017,7 @@ Para documentos PDF digitales como los evaluados, estos módulos son innecesario
#### Patrones de Fallo por Tipo de Contenido
**Tabla 34.** *Tasa de error por tipo de contenido.*
**Tabla 38.** *Tasa de error por tipo de contenido.*
| Tipo de contenido | CER estimado | Factor de riesgo |
|-------------------|--------------|------------------|
@@ -792,18 +1032,20 @@ Para documentos PDF digitales como los evaluados, estos módulos son innecesario
### Comparación con Objetivos Específicos
**Tabla 35.** *Cumplimiento de objetivos específicos.*
**Tabla 39.** *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 | 24 páginas con ground truth | ✓ Cumplido |
| OE3 | Identificar hiperparámetros críticos | `textline_orientation` y `text_det_thresh` identificados | ✓ Cumplido |
| OE4 | Optimizar con Ray Tune (≥50 trials) | 64 trials ejecutados | ✓ Cumplido |
| OE5 | Validar configuración optimizada | CER: 7.78% → 1.49% documentado | ✓ 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: Elaboración propia.*
> **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
@@ -818,11 +1060,11 @@ Para documentos PDF digitales como los evaluados, estos módulos son innecesario
1. **Ground truth automático**: El texto de referencia se extrajo programáticamente del PDF, lo cual puede introducir errores en layouts complejos donde el orden de lectura no es evidente.
2. **Tamaño del dataset**: 24 páginas es un dataset pequeño. Un dataset más amplio proporcionaría estimaciones más robustas.
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. **Ejecución en CPU**: Los tiempos reportados corresponden a ejecución en CPU. El comportamiento con GPU podría diferir.
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
@@ -836,31 +1078,33 @@ Para documentos PDF digitales como los evaluados, estos módulos son innecesario
Para documentos académicos en español similares a los evaluados:
**Tabla 31.** *Configuración recomendada para PaddleOCR.*
**Tabla 40.** *Configuración recomendada para PaddleOCR con GPU.*
| Parámetro | Valor | Prioridad | Justificación |
|-----------|-------|-----------|---------------|
| `textline_orientation` | True | Obligatorio | Reduce CER en 69.7% |
| `text_det_thresh` | 0.45 (rango: 0.4-0.5) | Recomendado | Correlación fuerte con CER |
| `text_rec_score_thresh` | 0.6 (rango: 0.5-0.7) | Recomendado | Filtra reconocimientos poco confiables |
| `text_det_box_thresh` | 0.55 (rango: 0.5-0.6) | Opcional | Impacto moderado |
| `use_doc_orientation_classify` | False | No recomendado | Innecesario para PDFs digitales |
| `textline_orientation` | True | Obligatorio | Crítico para layouts complejos |
| `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: Análisis de resultados de optimización.*
*Fuente: Análisis de [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/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. **Sin GPU disponible**: El fine-tuning requiere GPU; la optimización de hiperparámetros no.
1. **GPU disponible**: Acelera significativamente la exploración del espacio de hiperparámetros (82× más rápido que CPU).
2. **Modelo preentrenado adecuado**: El modelo ya soporta el idioma objetivo.
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:
@@ -882,33 +1126,38 @@ Este capítulo ha presentado el desarrollo completo de la contribución:
- Selección de PaddleOCR por su configurabilidad
**Desarrollo de la comparativa:**
- 64 trials de Ray Tune con Optuna
- Identificación de `textline_orientation` y `text_det_thresh` como críticos
- CER mínimo alcanzado: 1.15%
- 64 trials de Ray Tune con Optuna usando GPU RTX 3060
- Identificación de `textline_orientation`, `use_doc_orientation_classify` y `text_det_thresh` como críticos
- CER mínimo alcanzado en trial individual: **0.79%**
**Discusión y análisis:**
- Mejora del CER de 7.78% a 1.49% (reducción del 80.9%)
- Cumplimiento de todos los objetivos específicos
- Identificación de limitaciones y recomendaciones prácticas
- Mejora del CER en dataset completo de 8.85% a 7.72% (reducción del **12.8%**)
- Mejor trial: 0.79% CER (cumple objetivo CER < 2%)
- Identificación de sobreajuste y recomendaciones prácticas
**Resultado principal**: Se logró alcanzar el objetivo de CER < 2% mediante optimización de hiperparámetros, sin requerir fine-tuning ni recursos GPU.
**Resultados principales**:
- El objetivo de CER < 2% se cumple en el mejor trial (0.79%)
- La generalización al dataset completo (7.72%) revela sobreajuste que requiere trabajo futuro
- La optimización de hiperparámetros con GPU es viable y eficiente (82× más rápido que CPU)
**Fuentes de datos:**
- [`src/run_tuning.py`](https://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py): Script principal de optimización
- [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results): Resultados CSV de los trials
- [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv): Resultados CSV de PaddleOCR
- [`src/results/raytune_easyocr_results_20260119_120204.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_easyocr_results_20260119_120204.csv): Resultados CSV de EasyOCR
- [`src/results/raytune_doctr_results_20260119_121445.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_doctr_results_20260119_121445.csv): Resultados CSV de DocTR
**Imágenes Docker:**
- `seryus.ddns.net/unir/paddle-ocr-gpu`: PaddleOCR con soporte GPU
- `seryus.ddns.net/unir/easyocr-gpu`: EasyOCR con soporte GPU
- `seryus.ddns.net/unir/doctr-gpu`: DocTR con soporte GPU
### Validación con Aceleración GPU
### Comparativa de Rendimiento CPU vs GPU
Para evaluar la viabilidad práctica del enfoque optimizado en escenarios de producción, se realizó una validación adicional utilizando aceleración GPU. Esta fase complementa los experimentos en CPU presentados anteriormente y demuestra la aplicabilidad del método cuando se dispone de hardware con capacidad de procesamiento paralelo.
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 36.** *Especificaciones del entorno de validación GPU.*
**Tabla 41.** *Especificaciones del entorno GPU utilizado.*
| Componente | Especificación |
|------------|----------------|
@@ -920,28 +1169,32 @@ Para evaluar la viabilidad práctica del enfoque optimizado en escenarios de pro
*Fuente: Elaboración propia.*
El entorno de validación representa hardware de consumo típico para desarrollo de aplicaciones de machine learning, permitiendo evaluar el rendimiento en condiciones realistas de despliegue.
Este hardware representa configuración típica de desarrollo, permitiendo evaluar el rendimiento en condiciones realistas de despliegue.
#### Comparación CPU vs GPU
Se evaluó el tiempo de procesamiento utilizando la configuración optimizada identificada en la fase anterior, comparando el rendimiento entre CPU y GPU.
Se comparó el tiempo de procesamiento entre CPU y GPU utilizando los datos de [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://github.com/seryus/MastersThesis/blob/main/src/raytune_paddle_subproc_results_20251207_192320.csv) (CPU) y [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv) (GPU).
**Tabla 37.** *Rendimiento comparativo CPU vs GPU.*
**Tabla 42.** *Rendimiento comparativo CPU vs GPU.*
| Métrica | CPU | GPU (RTX 3060) | Factor de Aceleración |
|---------|-----|----------------|----------------------|
| Tiempo/Página | 69.4s | 0.55s | **126x** |
| Dataset completo (45 páginas) | ~52 min | ~25 seg | **126x** |
| Tiempo/Página (promedio) | 69.4s | 0.84s | **82x** |
| Dataset completo (45 páginas) | ~52 min | ~38 seg | **82x** |
| 64 trials × 5 páginas | ~6.4 horas | ~1.5 horas | **4.3x** |
*Fuente: Elaboración propia a partir de experimentos.*
*Fuente: Elaboración propia a partir de [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://github.com/seryus/MastersThesis/blob/main/src/raytune_paddle_subproc_results_20251207_192320.csv) y [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv).*
La aceleración de 126x obtenida con GPU transforma la aplicabilidad práctica del sistema. Mientras que el procesamiento en CPU limita el uso a escenarios de procesamiento por lotes sin restricciones de tiempo, la velocidad con GPU habilita casos de uso interactivos y de tiempo real.
La aceleración de 82× obtenida con GPU transforma la viabilidad del enfoque:
- **Optimización en CPU (6.4 horas)**: Viable pero lento para iteraciones rápidas
- **Optimización en GPU (1.5 horas)**: 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 38.** *Comparación de modelos Mobile vs Server en RTX 3060.*
**Tabla 43.** *Comparación de modelos Mobile vs Server en RTX 3060.*
| Modelo | VRAM Requerida | Resultado | Recomendación |
|--------|----------------|-----------|---------------|
@@ -956,7 +1209,7 @@ Los modelos Server, a pesar de ofrecer potencialmente mayor precisión, resultan
La validación con aceleración GPU permite extraer las siguientes conclusiones:
1. **Aceleración significativa**: La GPU proporciona una aceleración de 126x sobre CPU, haciendo viable el procesamiento en tiempo real para aplicaciones interactivas.
1. **Aceleración significativa**: La GPU proporciona una aceleración de 82× sobre CPU, haciendo viable el procesamiento en tiempo real para aplicaciones interactivas.
2. **Modelos Mobile recomendados**: Para hardware con VRAM limitada (≤6 GB), los modelos Mobile de PP-OCRv5 ofrecen el mejor balance entre precisión y recursos, funcionando de manera estable sin errores de memoria.
@@ -964,4 +1217,4 @@ La validación con aceleración GPU permite extraer las siguientes conclusiones:
4. **Escalabilidad**: La arquitectura de microservicios dockerizados utilizada para la validación GPU facilita el despliegue horizontal, permitiendo escalar el procesamiento según demanda.
Esta validación demuestra que la configuración optimizada mediante Ray Tune no solo mejora la precisión (CER: 7.78% → 1.49%) sino que, combinada con aceleración GPU, resulta prácticamente aplicable en escenarios de producción real.
Esta validación 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 aceleración GPU, resulta prácticamente aplicable en escenarios de producción real.