From f5d1032e41b873034a86920e35e4d175e7af7923 Mon Sep 17 00:00:00 2001
From: sergio [Insertar diagrama Mermaid aquí] Tabla {table_counter}. {clean_title} {md_to_html_para(cell)}'
+ # Wrap in centered div for Word compatibility
+ table_html = '
'
html_blocks.append(table_html)
# Add source with proper template format
diff --git a/generate_mermaid_figures.py b/generate_mermaid_figures.py
index 315c437..c76bf23 100644
--- a/generate_mermaid_figures.py
+++ b/generate_mermaid_figures.py
@@ -35,10 +35,12 @@ def extract_mermaid_diagrams():
matches = re.findall(pattern, content, re.DOTALL)
for i, mermaid_code in enumerate(matches):
- # Try to extract title from YAML front matter or inline title
+ # Try to extract title from YAML front matter
+ # Match title with quotes: title: "Something" or title: 'Something'
title_match = re.search(r'title:\s*["\']([^"\']+)["\']', mermaid_code)
if not title_match:
- title_match = re.search(r'title\s+["\']?([^"\'"\n]+)["\']?', mermaid_code)
+ # Match title without quotes: title: Something
+ title_match = re.search(r'title:\s*([^"\'\n]+)', mermaid_code)
title = title_match.group(1).strip() if title_match else f"Diagrama {len(diagrams) + 1}"
diagrams.append({
diff --git a/thesis_output/figures/figures_manifest.json b/thesis_output/figures/figures_manifest.json
index bdab0cc..104d806 100644
--- a/thesis_output/figures/figures_manifest.json
+++ b/thesis_output/figures/figures_manifest.json
@@ -1,32 +1,32 @@
[
{
"file": "figura_1.png",
- "title": "Diagrama 1",
+ "title": "Pipeline de un sistema OCR moderno",
"index": 1
},
{
"file": "figura_2.png",
- "title": "Diagrama 2",
+ "title": "Ciclo de optimización con Ray Tune y Optuna",
"index": 2
},
{
"file": "figura_3.png",
- "title": "Diagrama 3",
+ "title": "Fases de la metodología experimental",
"index": 3
},
{
"file": "figura_4.png",
- "title": "Diagrama 4",
+ "title": "Estructura del dataset de evaluación",
"index": 4
},
{
"file": "figura_5.png",
- "title": "Diagrama 5",
+ "title": "Arquitectura de ejecución con Docker Compose",
"index": 5
},
{
"file": "figura_6.png",
- "title": "Diagrama 6",
+ "title": "Arquitectura de microservicios para optimización OCR",
"index": 6
},
{
diff --git a/thesis_output/plantilla_individual.htm b/thesis_output/plantilla_individual.htm
index 924d86c..1355429 100644
--- a/thesis_output/plantilla_individual.htm
+++ b/thesis_output/plantilla_individual.htm
@@ -4547,7 +4547,7 @@ mso-bidi-font-family:"Calibri Light";mso-bidi-theme-font:major-latin'>El procesamiento de documentos en español presenta particularidades que complican el reconocimiento automático de texto. Los caracteres especiales propios del idioma (la letra ñ, las vocales acentuadas á, é, í, ó, ú, la diéresis ü, y los signos de puntuación invertidos ¿ y ¡) no están presentes en muchos conjuntos de entrenamiento internacionales, lo que puede degradar el rendimiento de modelos preentrenados predominantemente en inglés.'
for j, tline in enumerate(table_lines):
cells = [c.strip() for c in tline.split('|')[1:-1]]
table_html += '
'
+ table_html += ''
@@ -255,7 +256,7 @@ def parse_md_to_html_blocks(md_content):
# Middle rows: no borders
table_html += f' '
- table_html += ' '
table_html += '
La Tabla 1 resume los principales desafíos lingüísticos del OCR en español:
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 |
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.
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 tablas con bordes y celdas; logotipos institucionales; marcas de agua; y elementos gráficos como firmas o sellos. Estos elementos generan ruido que puede propagarse en aplicaciones downstream como la extracción de entidades nombradas o el análisis semántico.
@@ -4556,7 +4556,7 @@ mso-bidi-font-family:"Calibri Light";mso-bidi-theme-font:major-latin'>La adaptación de modelos preentrenados a dominios específicos típicamente requiere fine-tuning con datos etiquetados del dominio objetivo y recursos computacionales significativos. El fine-tuning de un modelo de reconocimiento de texto puede requerir decenas de miles de imágenes etiquetadas y días de entrenamiento en GPUs de alta capacidad. Esta barrera técnica y económica excluye a muchos investigadores y organizaciones de beneficiarse plenamente de estas tecnologías.La Tabla 2 ilustra los requisitos típicos para diferentes estrategias de mejora de OCR:
Tabla 2. Comparación de estrategias de mejora de modelos OCR.
-Estrategia | Datos requeridos | Hardware | Tiempo | Expertise |
Fine-tuning completo | >10,000 imágenes etiquetadas | GPU (≥16GB VRAM) | Días-Semanas | Alto |
Fine-tuning parcial | >1,000 imágenes etiquetadas | GPU (≥8GB VRAM) | Horas-Días | Medio-Alto |
Transfer learning | >500 imágenes etiquetadas | GPU (≥8GB VRAM) | Horas | Medio |
Optimización de hiperparámetros | <100 imágenes de validación | CPU suficiente | Horas | Bajo-Medio |
Estrategia | Datos requeridos | Hardware | Tiempo | Expertise |
Fine-tuning completo | >10,000 imágenes etiquetadas | GPU (≥16GB VRAM) | Días-Semanas | Alto |
Fine-tuning parcial | >1,000 imágenes etiquetadas | GPU (≥8GB VRAM) | Horas-Días | Medio-Alto |
Transfer learning | >500 imágenes etiquetadas | GPU (≥8GB VRAM) | Horas | Medio |
Optimización de hiperparámetros | <100 imágenes de validación | CPU suficiente | Horas | Bajo-Medio |
Fuente: Elaboración propia.
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 | Ejecución en CPU | Aceleración GPU |
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 | Ejecución en CPU | Aceleración GPU |
Fuente: Elaboración propia.
Los sistemas OCR modernos siguen típicamente un pipeline de dos etapas principales, precedidas opcionalmente por una fase de preprocesamiento:
Figura 1. Diagrama 1
-

Fuente: Elaboración propia.
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 |
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.
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 |
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.
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 |
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: Elaboración propia.
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 |
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: Elaboración propia.
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 |
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: Elaboración propia.
Fortalezas de PaddleOCR:
@@ -4792,11 +4792,11 @@ _Toc14106979">· Menos opciones de modelos preentrenados para idiomas no inglesesTabla 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 | 80+ | 80+ | 9 |
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 |
Aspecto | EasyOCR | PaddleOCR | DocTR |
Framework | PyTorch | PaddlePaddle | TF/PyTorch |
Detector | CRAFT | DB | DB/LinkNet |
Reconocedor | CRNN | SVTR/CRNN | CRNN/SAR/ViTSTR |
Idiomas | 80+ | 80+ | 9 |
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.
Tabla 10. Comparativa de facilidad de uso.
-Aspecto | EasyOCR | PaddleOCR | DocTR |
Instalación | pip install | pip install | pip install |
Líneas para OCR básico | 3 | 5 | 6 |
GPU requerida | Opcional | Opcional | Opcional |
Memoria mínima | 2 GB | 4 GB | 4 GB |
Aspecto | EasyOCR | PaddleOCR | DocTR |
Instalación | pip install | pip install | pip install |
Líneas para OCR básico | 3 | 5 | 6 |
GPU requerida | Opcional | Opcional | Opcional |
Memoria mínima | 2 GB | 4 GB | 4 GB |
Fuente: Elaboración propia.
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 |
Criterio | Cumplimiento |
Específico (S) | Se define claramente qué se quiere lograr: optimizar PaddleOCR mediante ajuste de hiperparámetros para documentos en español |
Medible (M) | Se establece una métrica cuantificable: CER < 2% |
Alcanzable (A) | Es viable dado que: (1) PaddleOCR permite configuración de hiperparámetros, (2) Ray Tune posibilita búsqueda automatizada, (3) Aceleración GPU disponible para experimentación eficiente |
Relevante (R) | El impacto es demostrable: mejora la extracción de texto en documentos académicos sin costes adicionales de infraestructura |
Temporal (T) | El plazo es un cuatrimestre, correspondiente al TFM |
Fuente: Elaboración propia.
Figura 3. Diagrama 3
-

Fuente: Elaboración propia.
Descripción de las fases:
@@ -4978,7 +4978,7 @@ concretos y metodología de trabajo - Método: page.get_text("dict") de PyMuPDF - Preservación de estructura de líneas - Tratamiento de texto vertical/marginal - Normalización de espacios y saltos de líneaFigura 4. Diagrama 4
-

Fuente: Elaboración propia.
Tabla 14. Modelos OCR evaluados en el benchmark inicial.
-Modelo | Versión | Configuración |
EasyOCR | - | Idiomas: ['es', 'en'] |
PaddleOCR | PP-OCRv5 | Modelos server_det + server_rec |
DocTR | - | db_resnet50 + sar_resnet31 |
Modelo | Versión | Configuración |
EasyOCR | - | Idiomas: ['es', 'en'] |
PaddleOCR | PP-OCRv5 | Modelos server_det + server_rec |
DocTR | - | db_resnet50 + sar_resnet31 |
Fuente: Elaboración propia.
Tabla 15. Hiperparámetros seleccionados para optimización.
-Parámetro | Tipo | Rango/Valores | Descripción |
use_doc_orientation_classify | Booleano | [True, False] | Clasificación de orientación del documento |
use_doc_unwarping | Booleano | [True, False] | Corrección de deformación del documento |
textline_orientation | Booleano | [True, False] | Clasificación de orientación de línea de texto |
text_det_thresh | Continuo | [0.0, 0.7] | Umbral de detección de píxeles de texto |
text_det_box_thresh | Continuo | [0.0, 0.7] | Umbral de caja de detección |
text_det_unclip_ratio | Fijo | 0.0 | Coeficiente de expansión (fijado) |
text_rec_score_thresh | Continuo | [0.0, 0.7] | Umbral de confianza de reconocimiento |
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.
Tabla 16. Especificaciones de hardware del entorno de desarrollo.
-Componente | Especificación |
CPU | AMD Ryzen 7 5800H |
RAM | 16 GB DDR4 |
GPU | NVIDIA RTX 3060 Laptop (5.66 GB VRAM) |
Almacenamiento | SSD |
Componente | Especificación |
CPU | AMD Ryzen 7 5800H |
RAM | 16 GB DDR4 |
GPU | NVIDIA RTX 3060 Laptop (5.66 GB VRAM) |
Almacenamiento | SSD |
Fuente: Elaboración propia.
Tabla 17. Versiones de software utilizadas.
-Componente | Versión |
Sistema Operativo | Ubuntu 24.04.3 LTS |
Python | 3.12.3 |
PaddleOCR | 3.3.2 |
PaddlePaddle | 3.2.2 |
Ray | 2.52.1 |
Optuna | 4.7.0 |
Componente | Versión |
Sistema Operativo | Ubuntu 24.04.3 LTS |
Python | 3.12.3 |
PaddleOCR | 3.3.2 |
PaddlePaddle | 3.2.2 |
Ray | 2.52.1 |
Optuna | 4.7.0 |
Fuente: Elaboración propia.
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 |
Plataforma | GPU | Costo/Hora | Costo Mensual |
AWS EC2 g4dn.xlarge | NVIDIA T4 (16 GB) | $0.526 | ~$384 |
Google Colab Pro | T4/P100 | ~$1.30 | $10 + CU extras |
Google Colab Pro+ | T4/V100/A100 | ~$1.30 | $50 + CU extras |
Fuente: Elaboración propia.
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 |
Tarea | Tiempo GPU | Costo AWS | Costo Colab Pro |
Ajuste hiperparámetros (64×3 trials) | ~3 horas | ~$1.58 | ~$3.90 |
Evaluación completa (45 páginas) | ~5 min | ~$0.04 | ~$0.11 |
Desarrollo y depuración (20 horas/mes) | 20 horas | ~$10.52 | ~$26.00 |
Fuente: Elaboración propia.
Las ventajas de la ejecución local incluyen:
@@ -5101,7 +5101,7 @@ color:#0098CD;mso-font-kerning:16.0pt;mso-bidi-font-weight:bold'>Se seleccionaron tres soluciones OCR de código abierto representativas del estado del arte:
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 |
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: Elaboración propia.
Imágenes Docker disponibles en el registro del proyecto:
@@ -5119,7 +5119,7 @@ color:#0098CD;mso-font-kerning:16.0pt;mso-bidi-font-weight:bold'>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 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 |
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: Elaboración propia.
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 22. Variabilidad del CER por tipo de contenido.
-Tipo de contenido | CER aproximado | Observaciones |
Texto corrido | ~1.5-2% | Mejor rendimiento |
Texto con listas | ~3-4% | Rendimiento medio |
Tablas | ~5-6% | Mayor dificultad |
Encabezados + notas | ~4-5% | Layouts mixtos |
Tipo de contenido | CER aproximado | Observaciones |
Texto corrido | ~1.5-2% | Mejor rendimiento |
Texto con listas | ~3-4% | Rendimiento medio |
Tablas | ~5-6% | Mayor dificultad |
Encabezados + notas | ~4-5% | Layouts mixtos |
Fuente: Elaboración propia.
Observaciones del benchmark inicial:
@@ -5148,7 +5148,7 @@ color:#0098CD;mso-font-kerning:16.0pt;mso-bidi-font-weight:bold'>Los tres modelos evaluados representan diferentes paradigmas de OCR:
Tabla 23. Comparativa de arquitecturas OCR evaluadas.
-Modelo | Tipo | Componentes | Fortalezas Clave |
EasyOCR | End-to-end (det + rec) | CRAFT + CRNN/Transformer | Ligero, fácil de usar, multilingüe |
PaddleOCR | End-to-end (det + rec + cls) | DB + SVTR/CRNN | Soporte multilingüe robusto, pipeline configurable |
DocTR | End-to-end (det + rec) | DB/LinkNet + CRNN/SAR/ViTSTR | Orientado a investigación, API limpia |
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: Elaboración propia.
La selección de PaddleOCR para la fase de optimización se basó en los siguientes criterios:
Tabla 24. Evaluación de criterios de selección.
-Criterio | EasyOCR | PaddleOCR | DocTR |
CER benchmark | ~6-8% | ~5-6% | ~7-9% |
Configurabilidad | Baja (3 params) | Alta (>10 params) | Media (5 params) |
Soporte español | Sí | Sí (dedicado) | Limitado |
Documentación | Media | Alta | Alta |
Mantenimiento | Medio | Alto | Medio |
Criterio | EasyOCR | PaddleOCR | DocTR |
CER benchmark | ~6-8% | ~5-6% | ~7-9% |
Configurabilidad | Baja (3 params) | Alta (>10 params) | Media (5 params) |
Soporte español | Sí | Sí (dedicado) | Limitado |
Documentación | Media | Alta | Alta |
Mantenimiento | Medio | Alto | Medio |
Fuente: Elaboración propia.
El experimento se ejecutó en el siguiente entorno:
Tabla 25. Entorno de ejecución del experimento.
-Componente | Versión/Especificación |
Sistema operativo | Ubuntu 24.04.3 LTS |
Python | 3.12.3 |
PaddlePaddle | 3.2.2 |
PaddleOCR | 3.3.2 |
Ray | 2.52.1 |
Optuna | 4.7.0 |
CPU | AMD Ryzen 7 5800H |
RAM | 16 GB DDR4 |
GPU | NVIDIA RTX 3060 Laptop (5.66 GB VRAM) |
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: Elaboración propia.
Esta arquitectura containerizada permite ejecutar cada componente en su entorno aislado óptimo, comunicándose via API REST:
Figura 5. Diagrama 5
-

Fuente: Elaboración propia.
La arquitectura containerizada (src/docker-compose.tuning.*.yml) ofrece:
@@ -5258,18 +5258,18 @@ 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 | - |
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.
Figura 6. Diagrama 6
-

Fuente: Elaboración propia.
Los Dockerfiles utilizan una estrategia de build multi-stage para optimizar tiempos de construcción y tamaño de imágenes:
Figura 7. Estrategia de build multi-stage
-

Fuente: Elaboración propia.
Ventajas de esta estrategia:
@@ -5279,14 +5279,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 |
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: 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.
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 (~500 MB) |
easyocr-model-cache | EasyOCR | Modelos CRAFT + CRNN (~400 MB) |
doctr-model-cache | DocTR | Modelos db_resnet50 + crnn_vgg16_bn (~300 MB) |
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.
· DocTR: 180 segundos (modelos ResNet más pesados)
Figura 8. Flujo de ejecución de optimización con Ray Tune
-

Fuente: Elaboración propia.
Para la fase de optimización se extendió el dataset:
Tabla 29. Características del dataset de optimización.
-Característica | Valor |
Páginas totales | 24 |
Páginas por trial | 5 (páginas 5-10) |
Estructura | Carpetas img/ y txt/ pareadas |
Resolución | 300 DPI |
Formato imagen | PNG |
Característica | Valor |
Páginas totales | 24 |
Páginas por trial | 5 (páginas 5-10) |
Estructura | Carpetas img/ y txt/ pareadas |
Resolución | 300 DPI |
Formato imagen | PNG |
Fuente: Elaboración propia.
La clase ImageTextDataset gestiona la carga de pares imagen-texto desde la estructura de carpetas pareadas. La implementación está disponible en el repositorio (ver Anexo A).
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 |
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: Elaboración propia.
Justificación del espacio:
@@ -5351,7 +5351,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 |
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: Elaboración propia.
Elección de 64 trials:
@@ -5364,13 +5364,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.
-Métrica | Valor |
Trials completados | 64/64 |
Trials fallidos | 0 |
Tiempo total | ~6.4 horas |
Tiempo medio por trial | 367.72 segundos |
Páginas procesadas | 320 (64 trials × 5 páginas) |
Métrica | Valor |
Trials completados | 64/64 |
Trials fallidos | 0 |
Tiempo total | ~6.4 horas |
Tiempo medio por trial | 367.72 segundos |
Páginas procesadas | 320 (64 trials × 5 páginas) |
Fuente: Elaboración propia.
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 |
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: Elaboración propia.
Observaciones:
@@ -5379,7 +5379,7 @@ docker compose -f docker-compose.tuning.paddle.yml down1. 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).
Tabla 34. Distribución de trials por rango de CER.
-Rango CER | Número de trials | Porcentaje |
< 2% | 43 | 67.2% |
2% - 5% | 10 | 15.6% |
5% - 10% | 11 | 17.2% |
> 10% | 0 | 0.0% |
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: Elaboración propia.
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.
@@ -5397,24 +5397,24 @@ Configuración óptima: text_det_unclip_ratio: 0.0 text_rec_score_thresh: 0.5658Tabla 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 |
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: Elaboración propia.
Se calculó la correlación de Pearson entre los parámetros continuos y las métricas de error:
Tabla 36. Correlación de parámetros con CER.
-Parámetro | Correlación con CER | Interpretación |
text_det_thresh | -0.523 | Correlación moderada negativa |
text_det_box_thresh | +0.226 | Correlación débil positiva |
text_rec_score_thresh | -0.161 | Correlación débil negativa |
text_det_unclip_ratio | NaN | Varianza cero (valor fijo) |
Parámetro | Correlación con CER | Interpretación |
text_det_thresh | -0.523 | Correlación moderada negativa |
text_det_box_thresh | +0.226 | Correlación débil positiva |
text_rec_score_thresh | -0.161 | Correlación débil negativa |
text_det_unclip_ratio | NaN | Varianza cero (valor fijo) |
Fuente: Elaboración propia.
Tabla 37. Correlación de parámetros con WER.
-Parámetro | Correlación con WER | Interpretación |
text_det_thresh | -0.521 | Correlación moderada negativa |
text_det_box_thresh | +0.227 | Correlación débil positiva |
text_rec_score_thresh | -0.173 | Correlación débil negativa |
Parámetro | Correlación con WER | Interpretación |
text_det_thresh | -0.521 | Correlación moderada negativa |
text_det_box_thresh | +0.227 | Correlación débil positiva |
text_rec_score_thresh | -0.173 | Correlación débil negativa |
Fuente: Elaboración propia.
Hallazgo clave: El parámetro text_det_thresh muestra la correlación más fuerte (-0.52 con ambas métricas), indicando que valores más altos de este umbral tienden a reducir el error. Este umbral controla qué píxeles se consideran "texto" en el mapa de probabilidad del detector.
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 | 3.76% | 7.12% | 12.73% | 32 |
False | 12.40% | 14.93% | 21.71% | 32 |
textline_orientation | CER Medio | CER Std | WER Medio | N trials |
True | 3.76% | 7.12% | 12.73% | 32 |
False | 12.40% | 14.93% | 21.71% | 32 |
Fuente: Elaboración propia.
Interpretación:
@@ -5422,7 +5422,7 @@ Configuración óptima:1. Menor varianza: La desviación estándar también se reduce significativamente (7.12% vs 14.93%), indicando resultados más consistentes.
1. Reducción del CER: 69.7% cuando se habilita la clasificación de orientación de línea.
Figura 9. Impacto de textline_orientation en CER
-

Fuente: Elaboración propia.
Explicación técnica:
@@ -5430,7 +5430,7 @@ Configuración óptima:Los trials con CER muy alto (>20%) presentaron patrones específicos:
Tabla 39. Características de trials con fallos catastróficos.
-Trial | CER | text_det_thresh | textline_orientation | Diagnóstico |
#47 | 51.61% | 0.017 | True | Umbral muy bajo |
#23 | 43.29% | 0.042 | False | Umbral bajo + sin orientación |
#12 | 38.76% | 0.089 | False | Umbral bajo + sin orientación |
#56 | 35.12% | 0.023 | False | Umbral muy bajo + sin orientación |
Trial | CER | text_det_thresh | textline_orientation | Diagnóstico |
#47 | 51.61% | 0.017 | True | Umbral muy bajo |
#23 | 43.29% | 0.042 | False | Umbral bajo + sin orientación |
#12 | 38.76% | 0.089 | False | Umbral bajo + sin orientación |
#56 | 35.12% | 0.023 | False | Umbral muy bajo + sin orientación |
Fuente: Elaboración propia.
Diagnóstico:
@@ -5442,24 +5442,24 @@ Configuración óptima: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% |
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: Elaboración propia.
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% |
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: Elaboración propia.
Figura 10. Reducción de errores: Baseline vs Optimizado (45 páginas)
-

Fuente: Elaboración propia.
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.
En un documento típico de 10,000 caracteres:
Tabla 42. En un documento típico de 10,000 caracteres
-Configuración | Caracteres con error | Palabras con error* |
Baseline | ~885 | ~196 |
Optimizada (full dataset) | ~772 | ~171 |
Optimizada (mejor trial) | ~79 | ~117 |
Reducción (full dataset) | 113 menos | 25 menos |
Configuración | Caracteres con error | Palabras con error* |
Baseline | ~885 | ~196 |
Optimizada (full dataset) | ~772 | ~171 |
Optimizada (mejor trial) | ~79 | ~117 |
Reducción (full dataset) | 113 menos | 25 menos |
Fuente: Elaboración propia.
*Asumiendo longitud media de palabra = 6.6 caracteres en español.
@@ -5467,7 +5467,7 @@ Configuración óptima:"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."
Tabla 43. Métricas de tiempo del experimento (GPU).
-Métrica | Valor |
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 |
Métrica | Valor |
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: Elaboración propia.
Observaciones:
@@ -5493,13 +5493,13 @@ Configuración óptima:Tabla 44. Evolución del rendimiento a través del estudio.
-Fase | Configuración | CER | Mejora vs anterior |
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 |
Fase | Configuración | CER | Mejora vs anterior |
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 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.
Tabla 45. 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 | ✓ |
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.
@@ -5507,7 +5507,7 @@ Configuración óptima:Basándose en el análisis de los resultados de optimización:
Tabla 46. Ranking de importancia de hiperparámetros.
-Rank | Parámetro | Impacto | Evidencia |
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 |
Rank | Parámetro | Impacto | Evidencia |
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.
Comportamiento observado:
Tabla 47. Comportamiento observado
-Rango | CER típico | Comportamiento |
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 |
Rango | CER típico | Comportamiento |
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 |
Fuente: Elaboración propia.
Interpretación:
@@ -5541,17 +5541,17 @@ Configuración óptima:Tabla 48. 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 |
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: Elaboración propia.
Tabla 49. Tasa de error por tipo de contenido.
-Tipo de contenido | CER estimado | Factor de riesgo |
Párrafos de texto | ~1% | Bajo |
Listas numeradas | ~2% | Medio |
Tablas simples | ~3% | Medio |
Encabezados + pie de página | ~2% | Medio |
Tablas complejas | ~5% | Alto |
Texto en columnas | ~4% | Alto |
Tipo de contenido | CER estimado | Factor de riesgo |
Párrafos de texto | ~1% | Bajo |
Listas numeradas | ~2% | Medio |
Tablas simples | ~3% | Medio |
Encabezados + pie de página | ~2% | Medio |
Tablas complejas | ~5% | Alto |
Texto en columnas | ~4% | Alto |
Fuente: Elaboración propia.
Tabla 50. 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 |
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: 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.
@@ -5572,7 +5572,7 @@ Configuración óptima:Para documentos académicos en español similares a los evaluados:
Tabla 51. Configuración recomendada para PaddleOCR con GPU.
-Parámetro | Valor | Prioridad | Justificación |
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 |
Parámetro | Valor | Prioridad | Justificación |
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: Elaboración propia.
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.
Tabla 52. 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 |
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: Elaboración propia.
Este hardware representa configuración típica de desarrollo, permitiendo evaluar el rendimiento en condiciones realistas de despliegue.
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 53. 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.4 horas | ~1.5 horas | 4.3x |
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.4 horas | ~1.5 horas | 4.3x |
Fuente: Elaboración propia.
La aceleración de 82× obtenida con GPU transforma la viabilidad del enfoque:
@@ -5635,7 +5635,7 @@ Configuración óptima: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 54. 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 |
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: Elaboración propia.
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.
@@ -5654,7 +5654,7 @@ y trabajo futuroEste capít
Este Trabajo Fin de Máster ha demostrado que es posible mejorar significativamente el rendimiento de sistemas OCR preentrenados mediante optimización sistemática de hiperparámetros, utilizando una infraestructura dockerizada con aceleración GPU para facilitar la experimentación. 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 55. Cumplimiento del objetivo de CER. Métrica Objetivo Mejor Trial Dataset Completo Cumplimiento CER < 2% 0.79% 7.72% ✓ Parcial Métrica Objetivo Mejor Trial Dataset Completo Cumplimiento CER < 2% 0.79% 7.72% ✓ Parcial Fuente: Elaboración propia. 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. · Resultados: Archivos CSV con los resultados de los 64 trials por servicio Figura 11. Estructura del repositorio MastersThesis Fuente: Elaboración propia. Tabla 56. Descripción de directorios principales. Directorio Contenido docs/ Capítulos del TFM en Markdown (estructura UNIR) docs/metrics/ Métricas de rendimiento por servicio OCR src/paddle_ocr/ Servicio PaddleOCR dockerizado src/doctr_service/ Servicio DocTR dockerizado src/easyocr_service/ Servicio EasyOCR dockerizado src/raytune/ Scripts de optimización Ray Tune src/results/ CSVs con resultados de 64 trials por servicio thesis_output/ Documento TFM generado + figuras PNG instructions/ Plantilla e instrucciones UNIR oficiales Directorio Contenido docs/ Capítulos del TFM en Markdown (estructura UNIR) docs/metrics/ Métricas de rendimiento por servicio OCR src/paddle_ocr/ Servicio PaddleOCR dockerizado src/doctr_service/ Servicio DocTR dockerizado src/easyocr_service/ Servicio EasyOCR dockerizado src/raytune/ Scripts de optimización Ray Tune src/results/ CSVs con resultados de 64 trials por servicio thesis_output/ Documento TFM generado + figuras PNG instructions/ Plantilla e instrucciones UNIR oficiales Fuente: Elaboración propia. Tabla 57. 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 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: Elaboración propia. Tabla 58. Dependencias del proyecto. Componente Versión Python 3.12.3 Docker 29.1.5 NVIDIA Container Toolkit Requerido para GPU Ray 2.52.1 Optuna 4.7.0 Componente Versión Python 3.12.3 Docker 29.1.5 NVIDIA Container Toolkit Requerido para GPU Ray 2.52.1 Optuna 4.7.0 Fuente: Elaboración propia.
+A.2 Estructura del Repositorio


+A.3 Requisitos de Software
Sistema de Desarrollo
+Dependencias
+A.4 Instrucciones de Ejecución de Servicios OCR
@@ -5847,7 +5847,7 @@ analyze_results(results, prefix='raytune_paddle', config_keys=PADDLE_OCR_CONFIG_
"
Tabla 59. 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 |
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.
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.
@@ -5859,7 +5859,7 @@ analyze_results(results, prefix='raytune_paddle', config_keys=PADDLE_OCR_CONFIG_· EasyOCR - Balance intermedio
Tabla 60. Resumen de resultados del benchmark por servicio.
-Servicio | CER Base | CER Ajustado | Mejora |
PaddleOCR | 8.85% | 7.72% | 12.8% |
DocTR | 12.06% | 12.07% | 0% |
EasyOCR | 11.23% | 11.14% | 0.8% |
Servicio | CER Base | CER Ajustado | Mejora |
PaddleOCR | 8.85% | 7.72% | 12.8% |
DocTR | 12.06% | 12.07% | 0% |
EasyOCR | 11.23% | 11.14% | 0.8% |
Fuente: Elaboración propia.