diff --git a/apply_content.py b/apply_content.py index 205d828..f2b7ed3 100644 --- a/apply_content.py +++ b/apply_content.py @@ -299,8 +299,11 @@ def parse_md_to_html_blocks(md_content): table_html += '' html_blocks.append(table_html) - # Add source with proper template format - html_blocks.append(f'
Fuente: {table_source}.
') + # Add source with proper template format (convert markdown links to HTML) + source_html = md_to_html_para(table_source) + if not table_source.endswith('.'): + source_html += '.' + html_blocks.append(f'Fuente: {source_html}
') html_blocks.append('Tabla 1. Desafíos lingüísticos específicos del OCR en español.
Desafío | Descripción | Impacto en OCR |
Caracteres especiales | ñ, á, é, í, ó, ú, ü, ¿, ¡ | Confusión con caracteres similares (n/ñ, a/á) |
Palabras largas | Español permite compuestos largos | Mayor probabilidad de error por carácter |
Abreviaturas | Dr., Sra., Ud., etc. | Puntos internos confunden segmentación |
Nombres propios | Tildes en apellidos (García, Martínez) | Bases de datos sin soporte Unicode |
Fuente: Elaboración propia..
+Fuente: Elaboración propia.
Además de los aspectos lingüísticos, los documentos académicos y administrativos en español presentan características tipográficas que complican el reconocimiento: variaciones en fuentes entre encabezados, cuerpo y notas al pie; presencia de índices, listas numeradas y cambios frecuentes de estilo; y saltos de línea que rompen la continuidad del texto. Estos elementos generan ruido que puede propagarse en aplicaciones downstream como la extracción de entidades nombradas o el análisis semántico.
Tabla 2. Comparación de estrategias de mejora de modelos OCR.
Estrategia | Datos requeridos | Hardware | Tiempo | Expertise |
Fine-tuning completo | Miles de imágenes etiquetadas | GPU de alta memoria | Días o semanas | Alto |
Fine-tuning parcial | Cientos o miles de imágenes etiquetadas | GPU dedicada | Horas o días | Medio-Alto |
Transfer learning | Centenas de imágenes etiquetadas | GPU dedicada | Horas | Medio |
Optimización de hiperparámetros | Subconjunto de validación | CPU o GPU (CUDA 12.2+ en Docker DocTR) | Horas | Bajo-Medio |
Fuente: [`docs/07_anexo_a.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/07_anexo_a.md), sección A.9..
+Fuente: docs/07_anexo_a.md, sección A.9.
La presente investigación surge de una necesidad práctica: optimizar un sistema OCR para documentos académicos en español sin disponer de infraestructura de entrenamiento dedicada para fine-tuning. Esta restricción, lejos de ser una limitación excepcional, representa la realidad de muchos entornos académicos y empresariales donde el acceso a cómputo avanzado es limitado.
@@ -4586,7 +4586,7 @@ mso-bidi-font-family:"Calibri Light";mso-bidi-theme-font:major-latin'>Este trabajo se centra específicamente en:Tabla 3. Delimitación del alcance del trabajo.
Aspecto | Dentro del alcance | Fuera del alcance |
Tipo de documento | Documentos académicos digitales (PDF) | Documentos escaneados, manuscritos |
Idioma | Español | Otros idiomas |
Modelos | EasyOCR, PaddleOCR, DocTR | Soluciones comerciales (Google Cloud Vision, AWS Textract) |
Método de mejora | Optimización de hiperparámetros | Fine-tuning, aumento de datos |
Hardware | GPU de consumo y CPU para referencia de tiempos | Infraestructura multi-GPU |
Fuente: Elaboración propia..
+Fuente: Elaboración propia.
La relevancia de este problema radica en su aplicabilidad inmediata. Una metodología reproducible para optimizar OCR sin fine-tuning beneficiaría a múltiples grupos:
@@ -4660,7 +4660,7 @@ _Toc14106979">DB (Differentiable Binarization): Propuesto por Liao et al. (2020), DB introduce una operación de binarización diferenciable que permite entrenar end-to-end un detector de texto basado en segmentación. Esta arquitectura es la utilizada por PaddleOCR y destaca por su velocidad y precisión.Tabla 4. Comparativa de arquitecturas de detección de texto.
Arquitectura | Tipo | Salida | Fortalezas | Limitaciones |
EAST | Single-shot | Cuadriláteros rotados | Rápido, simple | Dificultad con texto curvo |
CRAFT | Bottom-up | Polígonos de palabra | Robusto a espaciado | Mayor coste computacional |
DB | Segmentación | Polígonos arbitrarios | Rápido, preciso | Sensible a parámetros |
Fuente: Elaboración propia a partir de Zhou et al. (2017), Baek et al. (2019), Liao et al. (2020)..
+Fuente: Elaboración propia a partir de Zhou et al. (2017), Baek et al. (2019), Liao et al. (2020).
Una vez detectadas las regiones de texto, la etapa de reconocimiento transcribe el contenido visual a texto digital. Las arquitecturas predominantes son:
@@ -4674,7 +4674,7 @@ _Toc14106979">TrOCR (Transformer-based OCR): Propuesto por Li et al. (2023), TrOCR utiliza un Vision Transformer (ViT) como encoder y un Transformer de lenguaje como decoder, logrando resultados estado del arte en múltiples benchmarks.Tabla 5. Comparativa de arquitecturas de reconocimiento de texto.
Arquitectura | Encoder | Decoder | Pérdida | Características |
CRNN | CNN | BiLSTM | CTC | Rápido, robusto |
SVTR | ViT | Linear | CTC | Sin recurrencia |
Attention-based | CNN | LSTM+Attn | Cross-entropy | Flexible longitud |
TrOCR | ViT | Transformer | Cross-entropy | Estado del arte |
Fuente: Elaboración propia a partir de Shi et al. (2016), Du et al. (2022), Li et al. (2023)..
+Fuente: Elaboración propia a partir de Shi et al. (2016), Du et al. (2022), Li et al. (2023).
La evaluación rigurosa de sistemas OCR requiere métricas estandarizadas que permitan comparaciones objetivas. Las métricas fundamentales se basan en la distancia de edición de Levenshtein.
@@ -4752,15 +4752,15 @@ _Toc14106979">PaddleOCR expone numerosos hiperparámetros que permiten ajustar el comportamiento del sistema. Los más relevantes para este trabajo son:Tabla 6. Hiperparámetros de detección de PaddleOCR.
Parámetro | Descripción | Rango | Defecto |
text_det_thresh | Umbral de probabilidad para píxeles de texto | [0.0, 1.0] | 0.3 |
text_det_box_thresh | Umbral de confianza para cajas detectadas | [0.0, 1.0] | 0.6 |
text_det_unclip_ratio | Factor de expansión de cajas detectadas | [0.0, 3.0] | 1.5 |
text_det_limit_side_len | Tamaño máximo del lado de imagen | [320, 2560] | 960 |
Fuente: Documentación oficial de PaddleOCR (PaddlePaddle, 2024)..
+Fuente: Documentación oficial de PaddleOCR (PaddlePaddle, 2024).
Tabla 7. Hiperparámetros de reconocimiento de PaddleOCR.
Parámetro | Descripción | Rango | Defecto |
text_rec_score_thresh | Umbral de confianza para resultados | [0.0, 1.0] | 0.5 |
use_textline_orientation | Activar clasificación de orientación de línea | {True, False} | False |
rec_batch_size | Tamaño de batch para reconocimiento | [1, 64] | 6 |
Fuente: Documentación oficial de PaddleOCR (PaddlePaddle, 2024)..
+Fuente: Documentación oficial de PaddleOCR (PaddlePaddle, 2024).
Tabla 8. Hiperparámetros de preprocesamiento de PaddleOCR.
Parámetro | Descripción | Impacto |
use_doc_orientation_classify | Clasificación de orientación del documento | Alto para documentos escaneados |
use_doc_unwarping | Corrección de deformación/curvatura | Alto para fotos de documentos |
use_angle_cls | Clasificador de ángulo 0°/180° | Medio para documentos rotados |
Fuente: Documentación oficial de PaddleOCR (PaddlePaddle, 2024)..
+Fuente: Documentación oficial de PaddleOCR (PaddlePaddle, 2024).
Fortalezas de PaddleOCR:
· Alta precisión en múltiples benchmarks
@@ -4791,11 +4791,11 @@ _Toc14106979">Comparativa Detallada de SolucionesTabla 9. Comparativa técnica de soluciones OCR de código abierto.
Aspecto | EasyOCR | PaddleOCR | DocTR |
Framework | PyTorch | PaddlePaddle | TF/PyTorch |
Detector | CRAFT | DB | DB/LinkNet |
Reconocedor | CRNN | SVTR/CRNN | CRNN/SAR/ViTSTR |
Idiomas | Multilingüe | Multilingüe | Limitado |
Configurabilidad | Baja | Alta | Media |
Documentación | Media | Alta (CN) | Alta (EN) |
Actividad | Media | Alta | Media |
Licencia | Apache 2.0 | Apache 2.0 | Apache 2.0 |
Fuente: Elaboración propia a partir de documentación oficial (2024)..
+Fuente: Elaboración propia a partir de documentación oficial (2024).
Tabla 10. Comparativa de facilidad de uso.
Aspecto | EasyOCR | PaddleOCR | DocTR |
Instalación | pip install | pip install | pip install |
Complejidad de uso | Baja | Media | Media |
GPU requerida | Opcional | Opcional | Opcional |
Requisitos de memoria | Bajos | Medios | Medios |
Fuente: Elaboración propia a partir de documentación oficial..
+Fuente: Elaboración propia a partir de documentación oficial.
Tabla 13. Justificación SMART del objetivo general.
Criterio | Cumplimiento |
Específico (S) | Se define claramente qué se quiere lograr: optimizar PaddleOCR mediante ajuste de hiperparámetros para documentos en español |
Medible (M) | Se establece una métrica cuantificable: CER < 2% |
Alcanzable (A) | Es viable dado que: (1) PaddleOCR permite configuración de hiperparámetros, (2) Ray Tune posibilita búsqueda automatizada, (3) Aceleración GPU disponible para experimentación eficiente |
Relevante (R) | El impacto es demostrable: mejora la extracción de texto en documentos académicos sin costes adicionales de infraestructura |
Temporal (T) | El plazo es un cuatrimestre, correspondiente al TFM |
Fuente: [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md)..
+Fuente: docs/metrics/metrics.md.
Tabla 14. Modelos OCR evaluados en el benchmark inicial.
Modelo | Versión | Configuración |
EasyOCR | - | Idiomas: ['es', 'en'] |
PaddleOCR | PP-OCRv5 | Modelos Mobile (limitación de VRAM) |
DocTR | - | db_resnet50 + sar_resnet31 |
Fuente: [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md)..
+Fuente: docs/metrics/metrics.md.
Se utilizó la biblioteca jiwer para calcular CER y WER comparando el texto de referencia con la predicción del modelo OCR. La implementación se encuentra en src/paddle_ocr/paddle_ocr_tuning_rest.py, src/easyocr_service/easyocr_tuning_rest.py y src/doctr_service/doctr_tuning_rest.py.)
@@ -4990,7 +4990,7 @@ concretos y metodología de trabajoHiperparámetros SeleccionadosTabla 15. Hiperparámetros seleccionados para optimización.
Parámetro | Tipo | Rango/Valores | Descripción |
use_doc_orientation_classify | Booleano | [True, False] | Clasificación de orientación del documento |
use_doc_unwarping | Booleano | [True, False] | Corrección de deformación del documento |
textline_orientation | Booleano | [True, False] | Clasificación de orientación de línea de texto |
text_det_thresh | Continuo | [0.0, 0.7] | Umbral de detección de píxeles de texto |
text_det_box_thresh | Continuo | [0.0, 0.7] | Umbral de caja de detección |
text_det_unclip_ratio | Fijo | 0.0 | Coeficiente de expansión (fijado) |
text_rec_score_thresh | Continuo | [0.0, 0.7] | Umbral de confianza de reconocimiento |
Fuente: Elaboración propia..
+Fuente: Elaboración propia.
El espacio de búsqueda se definió utilizando tune.choice() para parámetros booleanos y tune.uniform() para parámetros continuos, con OptunaSearch como algoritmo de optimización configurado para minimizar CER en 64 trials. La implementación completa está disponible en src/raytune/raytune_ocr.py (ver Anexo A).
@@ -5027,23 +5027,23 @@ docker compose -f docker-compose.tuning.doctr.yml downTabla 16. Especificaciones de hardware del entorno de desarrollo.
Componente | Especificación |
CPU | AMD Ryzen 7 5800H |
RAM | 16 GB DDR4 |
GPU | NVIDIA RTX 3060 Laptop (5.66 GB VRAM) |
Almacenamiento | SSD |
Fuente: [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md)..
+Fuente: docs/metrics/metrics.md.
Tabla 17. Software utilizado en el entorno de desarrollo.
Componente | Versión |
PaddlePaddle | 3.2.2 |
PaddleOCR | 3.3.2 |
Ray Tune | 2.52.1 |
Optuna | 4.7.0 |
DocTR (python-doctr) | >= 0.8.0 |
EasyOCR | >= 1.7.0 |
Fuente: [`src/paddle_ocr/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/requirements.txt), [`src/raytune/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune/requirements.txt), [`src/doctr_service/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/requirements.txt), [`src/easyocr_service/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service/requirements.txt)..
+Fuente: src/paddle_ocr/requirements.txt, src/raytune/requirements.txt, src/doctr_service/requirements.txt, src/easyocr_service/requirements.txt.
La decisión de ejecutar los experimentos en hardware local en lugar de utilizar servicios cloud se fundamenta en un análisis de costos y beneficios operativos.
Tabla 18. Costos de GPU en plataformas cloud.
Plataforma | GPU | Costo/Hora | Costo Mensual |
AWS EC2 g4dn.xlarge | NVIDIA T4 (16 GB) | $0.526 | ~$384 |
Google Colab Pro | T4/P100 | ~$1.30 | $10 + CU extras |
Google Colab Pro+ | T4/V100/A100 | ~$1.30 | $50 + CU extras |
Fuente: Precios públicos de AWS y Google Cloud. Ver Anexo A, sección de fuentes de precios cloud (enero 2026)..
+Fuente: Precios públicos de AWS y Google Cloud. Ver Anexo A, sección de fuentes de precios cloud (enero 2026).
Para las tareas específicas de este proyecto, los costos estimados en cloud serían:
Tabla 19. Análisis de costos del proyecto en plataformas cloud.
Tarea | Tiempo GPU | Costo AWS | Costo Colab Pro |
Ajuste hiperparámetros (64×3 trials) | ~3 horas | ~$1.58 | ~$3.90 |
Evaluación completa (45 páginas) | ~5 min | ~$0.04 | ~$0.11 |
Desarrollo y depuración (20 horas/mes) | 20 horas | ~$10.52 | ~$26.00 |
Fuente: Elaboración propia a partir de precios públicos. Ver Anexo A, sección de fuentes de precios cloud (enero 2026)..
+Fuente: Elaboración propia a partir de precios públicos. Ver Anexo A, sección de fuentes de precios cloud (enero 2026).
Las ventajas de la ejecución local incluyen:
1. Costo cero de GPU: La RTX 3060 ya está disponible en el equipo de desarrollo
@@ -5092,7 +5092,7 @@ color:#0098CD;mso-font-kerning:16.0pt;mso-bidi-font-weight:bold'>Tabla 20. Soluciones OCR evaluadas en el benchmark comparativo.
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)..
+Fuente: docs/metrics/metrics.md.
Imágenes Docker disponibles en el registro del proyecto:
· PaddleOCR: seryus.ddns.net/unir/paddle-ocr-gpu, seryus.ddns.net/unir/paddle-ocr-cpu
@@ -5110,7 +5110,7 @@ color:#0098CD;mso-font-kerning:16.0pt;mso-bidi-font-weight:bold'>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)..
+Fuente: docs/metrics/metrics.md.
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.
@@ -5128,7 +5128,7 @@ color:#0098CD;mso-font-kerning:16.0pt;mso-bidi-font-weight:bold'>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..
+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.
@@ -5139,7 +5139,7 @@ color:#0098CD;mso-font-kerning:16.0pt;mso-bidi-font-weight:bold'>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)..
+Fuente: Documentación oficial de cada herramienta (JaidedAI, 2020; PaddlePaddle, 2024; Mindee, 2021).
Un análisis cualitativo de los errores producidos reveló patrones específicos:
@@ -5163,7 +5163,7 @@ color:#0098CD;mso-font-kerning:16.0pt;mso-bidi-font-weight:bold'>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..
+Fuente: Elaboración propia a partir del benchmark y la documentación de cada herramienta.
PaddleOCR expone múltiples hiperparámetros ajustables, clasificados por etapa del pipeline:
@@ -5200,7 +5200,7 @@ color:#0098CD;mso-font-kerning:16.0pt;mso-bidi-font-weight:bold'>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)..
+Fuente: src/paddle_ocr/requirements.txt, src/raytune/requirements.txt, docs/metrics/metrics.md.
La arquitectura basada en contenedores Docker es fundamental para este proyecto debido a los conflictos de dependencias inherentes entre los diferentes componentes:
@@ -5241,7 +5241,7 @@ docker compose -f docker-compose.tuning.doctr.yml downLa 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 |
PaddleOCR con aceleración GPU | nvidia/cuda:12.4.1-cudnn-runtime | 8002 | |
PaddleOCR para entornos sin GPU | python:3.11-slim | 8002 | |
EasyOCR con aceleración GPU | nvidia/cuda:13.0.2-cudnn-runtime | 8002* | |
DocTR con aceleración GPU | nvidia/cuda:13.0.2-cudnn-runtime | 8003 | |
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)..
+Fuente: Elaboración propia. Dockerfiles disponibles en src/paddle_ocr, src/easyocr_service, src/doctr_service, src/raytune.
Figura 6. Arquitectura de microservicios para optimización OCR
@@ -5262,14 +5262,14 @@ docker compose -f docker-compose.tuning.doctr.yml downEl proyecto incluye múltiples archivos Docker Compose para diferentes escenarios de uso:
Tabla 27. Archivos Docker Compose del proyecto.
Archivo | Propósito | Servicios |
Optimización principal | RayTune + PaddleOCR + DocTR | |
Optimización EasyOCR | RayTune + EasyOCR | |
Optimización PaddleOCR | RayTune + PaddleOCR | |
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)..
+Fuente: src/docker-compose.tuning.yml, src/docker-compose.tuning.easyocr.yml, src/docker-compose.tuning.paddle.yml, 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.
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)..
+Fuente: src/docker-compose.tuning.yml, src/docker-compose.tuning.easyocr.yml, src/docker-compose.tuning.paddle.yml, src/docker-compose.tuning.doctr.yml.
Todos los servicios implementan health checks para garantizar disponibilidad antes de iniciar la optimización:
@@ -5322,14 +5322,14 @@ docker compose -f docker-compose.tuning.paddle.yml downPara 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)..
+Fuente: docs/metrics/metrics.md, 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, src/easyocr_service/dataset_manager.py y src/doctr_service/dataset_manager.py.
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 30. Descripción detallada del espacio de búsqueda.
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..
+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.
@@ -5339,7 +5339,7 @@ docker compose -f docker-compose.tuning.paddle.yml downSe 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 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)..
+Fuente: 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.
@@ -5348,13 +5348,13 @@ docker compose -f docker-compose.tuning.paddle.yml downEl 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 × 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)..
+Fuente: src/raytune_paddle_subproc_results_20251207_192320.csv.
Del archivo CSV de resultados 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)..
+Fuente: 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.
@@ -5363,7 +5363,7 @@ docker compose -f docker-compose.tuning.paddle.yml downTabla 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)..
+Fuente: src/results/raytune_paddle_results_20260119_122609.csv.
Figura 9. Distribución de trials por rango de CER

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)..
+Fuente: src/results/raytune_paddle_results_20260119_122609.csv.
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:
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)..
+Fuente: 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)..
+Fuente: src/results/correlations/paddle_correlations.csv.
Figura 10. Correlación de hiperparámetros con CER

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)..
+Fuente: 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%).
@@ -5425,7 +5425,7 @@ Configuración óptima: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)..
+Fuente: 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.
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)..
+Fuente: docs/metrics/metrics_paddle.md.
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.
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.15× | 1.14× |
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)..
+Fuente: docs/metrics/metrics_paddle.md.
Figura 12. Reducción de errores: Baseline vs Optimizado (45 páginas)

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)..
+Fuente: 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).
@@ -5467,7 +5467,7 @@ Configuración óptima: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)..
+Fuente: docs/metrics/metrics_paddle.md.
Figura 13. Evolución del CER a través del estudio

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)..
+Fuente: 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.
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)..
+Fuente: src/results/correlations/paddle_correlations.csv.
Figura 14. Ranking de importancia de hiperparámetros

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..
+Fuente: Análisis cualitativo.
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..
+Fuente: Estimación cualitativa.
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)..
+Fuente: docs/metrics/metrics_paddle.md, src/results/correlations/paddle_correlations.csv, 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.
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)..
+Fuente: src/results/raytune_paddle_results_20260119_122609.csv.
La optimización de hiperparámetros es recomendable cuando:
@@ -5587,7 +5587,7 @@ Configuración óptima: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)..
+Fuente: docs/metrics/metrics.md.
Nota: Los requisitos de entorno documentados por dependencias se detallan en 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.
@@ -5595,7 +5595,7 @@ Configuración óptima:Se comparó el tiempo de procesamiento entre CPU y GPU utilizando los datos de src/raytune_paddle_subproc_results_20251207_192320.csv(CPU) y 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 × 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)..
+Fuente: src/raytune_paddle_subproc_results_20251207_192320.csv, src/results/raytune_paddle_results_20260119_122609.csv.
Figura 15. Tiempo de procesamiento: CPU vs GPU (segundos/página)

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)..
+Fuente: 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.
A lo largo
El objetivo principal del trabajo era alcanzar un CER inferior al 2% en documentos académicos en español. Los resultados obtenidos se resumen a continuación: Tabla 53. Cumplimiento del objetivo de CER. Métrica Objetivo Mejor Trial Dataset Completo Cumplimiento CER < 2% 0.79% 7.72% ✓ Parcial Fuente: [`docs/metrics/metrics_paddle.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_paddle.md).. Fuente: docs/metrics/metrics_paddle.md. Nota: El objetivo de CER < 2% se cumple en el mejor trial individual (0.79%, 5 páginas). La validación sobre el conjunto de datos completo (45 páginas) muestra un CER de 7.72%, evidenciando sobreajuste al subconjunto de optimización. Esta diferencia se analiza en detalle en el Capítulo 4. Tabla 54. Descripción de directorios principales. Directorio Contenido Capítulos del TFM en Markdown (estructura UNIR) Métricas de rendimiento por servicio OCR Servicio PaddleOCR dockerizado Servicio DocTR dockerizado Servicio EasyOCR dockerizado Scripts de optimización Ray Tune CSVs con resultados de 64 trials por servicio Correlaciones de hiperparámetros por servicio Documento TFM generado + figuras PNG Plantilla e instrucciones UNIR oficiales Fuente: [Repositorio del proyecto](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/).. Fuente: Repositorio del proyecto. Tabla 55. Especificaciones del sistema de desarrollo. Componente Especificación Sistema Operativo Ubuntu 24.04.3 LTS CPU AMD Ryzen 7 5800H RAM 16 GB DDR4 GPU NVIDIA RTX 3060 Laptop (5.66 GB VRAM) CUDA 12.4 Fuente: [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md).. Fuente: docs/metrics/metrics.md. Tabla 56. Dependencias del proyecto. Componente Versión PaddlePaddle 3.2.2 PaddleOCR 3.3.2 Ray Tune 2.52.1 Optuna 4.7.0 DocTR (python-doctr) >= 0.8.0 EasyOCR >= 1.7.0 Docker Requerido para contenedores NVIDIA Container Toolkit Requerido para GPU Fuente: [`src/paddle_ocr/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/requirements.txt), [`src/raytune/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune/requirements.txt), [`src/doctr_service/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/requirements.txt), [`src/easyocr_service/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service/requirements.txt), [`src/README.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/README.md).. Fuente: src/paddle_ocr/requirements.txt, src/raytune/requirements.txt, src/doctr_service/requirements.txt, src/easyocr_service/requirements.txt, src/README.md. Tabla 57. Servicios Docker y puertos. Servicio Puerto Script de Ajuste Nota PaddleOCR 8002 paddle_ocr_payload - DocTR 8003 doctr_payload - EasyOCR 8002 easyocr_payload Conflicto con PaddleOCR Fuente: Elaboración propia.. Fuente: Elaboración propia. Nota: Debido a limitaciones de recursos GPU (VRAM insuficiente para ejecutar múltiples modelos OCR simultáneamente), solo se ejecuta un servicio a la vez. PaddleOCR y EasyOCR comparten el puerto 8002. Para cambiar de servicio, detener el actual con docker compose down. Tabla 58. Comparativa de servicios OCR en dataset de 45 páginas (GPU RTX 3060). Servicio CER WER Tiempo/Página Tiempo Total VRAM PaddleOCR (Mobile) 7.76% 11.62% 0.58s 32.0s 0.06 GB EasyOCR 11.23% 36.36% 1.88s 88.5s ~2 GB DocTR 12.06% 42.01% 0.50s 28.4s ~1 GB Fuente: [`docs/metrics/metrics_paddle.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_paddle.md), [`docs/metrics/metrics_easyocr.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_easyocr.md), [`docs/metrics/metrics_doctr.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_doctr.md).. Fuente: docs/metrics/metrics_paddle.md, docs/metrics/metrics_easyocr.md, docs/metrics/metrics_doctr.md. Ganador: PaddleOCR (Mobile) - Mejor precisión (7.76% CER) con velocidad competitiva y mínimo consumo de VRAM. Se ejecutaron 64 trials por servicio utilizando Ray Tune con Optuna sobre las páginas 5-10 del primer documento. Tabla 59. Resultados del ajuste de hiperparámetros por servicio. Servicio CER Base CER Ajustado Mejora Mejor Trial (5 páginas) PaddleOCR 8.85% 7.72% 12.8% 0.79% ✓ DocTR 12.06% 12.07% 0% 7.43% EasyOCR 11.23% 11.14% 0.8% 5.83% Fuente: [`docs/metrics/metrics_paddle.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_paddle.md), [`docs/metrics/metrics_easyocr.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_easyocr.md), [`docs/metrics/metrics_doctr.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_doctr.md).. Fuente: docs/metrics/metrics_paddle.md, docs/metrics/metrics_easyocr.md, docs/metrics/metrics_doctr.md. Nota sobre sobreajuste: La diferencia entre los resultados del mejor trial (subconjunto de 5 páginas) y el dataset completo (45 páginas) indica sobreajuste parcial a las páginas de ajuste. Un subconjunto más amplio mejoraría la generalización. Tabla 60. 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).. Fuente: src/results/raytune_paddle_results_20260119_122609.csv. Figura 17. Distribución de trials por rango de CER (PaddleOCR) Tabla 61. Comparación de rendimiento CPU vs GPU (PaddleOCR). Métrica CPU GPU (RTX 3060) Aceleración Tiempo/Página 69.4s 0.84s 82x más rápido 45 páginas ~52 min ~38 seg 82x más rápido Fuente: Datos de tiempo CPU 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) y tiempos de GPU en trials de ajuste. Elaboración propia.. Fuente: Datos de tiempo CPU de src/raytune_paddle_subproc_results_20251207_192320.csv y tiempos de GPU en trials de ajuste. Elaboración propia. Figura 18. Tiempo de procesamiento: CPU vs GPU (segundos/página) Tabla 62. Tipos de errores identificados por servicio OCR. Servicio Fortalezas Debilidades ¿Fine-tuning recomendado? PaddleOCR Preserva estructura, buen manejo de español Errores menores de acentos No (ya excelente) DocTR Más rápido Pierde estructura, omite TODOS los diacríticos Sí (para diacríticos) EasyOCR Modelo correcto para español Caracteres espurios, confunde o/0 Sí (problemas del detector) Fuente: Análisis manual del debugset. Elaboración propia.. Fuente: Análisis manual del debugset. Elaboración propia. Los resultados crudos de los 64 trials por servicio están disponibles en el repositorio: Tabla 63. Ubicación de archivos de resultados. Servicio Archivo CSV PaddleOCR DocTR EasyOCR Fuente: Elaboración propia.. Fuente: Elaboración propia. Las tablas de costos cloud se basan en las páginas oficiales de precios. Se consultaron en enero de 2026.Cumplimiento de los Objetivos Específicos
@@ -5714,19 +5714,19 @@ major-latin;mso-bidi-font-family:"Calibri Light";mso-bidi-theme-font:major-latin
A.3 Requisitos de Software
Sistema de Desarrollo
Dependencias
Dependencias
A.4 Instrucciones de Ejecución de Servicios OCR
A.4 Instrucciones de Ejecución de Servicios OCR
@@ -5818,7 +5818,7 @@ analyze_results(results, prefix='raytune_paddle', config_keys=PADDLE_OCR_CONFIG_
Servicios y Puertos
A.7 Métricas de Rendimiento
@@ -5826,20 +5826,20 @@ analyze_results(results, prefix='raytune_paddle', config_keys=PADDLE_OCR_CONFIG_
Comparativa General de Servicios
Resultados de Ajuste de Hiperparámetros
Distribución de trials por rango de CER (PaddleOCR)

Rendimiento CPU vs GPU

Análisis de Errores por Servicio
Archivos de Resultados
A.8 Fuentes de precios cloud