diff --git a/.claude/commands/documentation-review.md b/.claude/commands/documentation-review.md index 9561b27..0a3910a 100644 --- a/.claude/commands/documentation-review.md +++ b/.claude/commands/documentation-review.md @@ -74,6 +74,12 @@ Review and validate the documentation for this Master's Thesis project. - Titles should describe the diagram content, not generic "Diagrama N" - Verify theme is applied to all diagrams in `docs/*.md` +**Note on Bar Charts (`xychart-beta`):** +- Bar chart colors are **automatically converted to light blue** (`#0098CD`) during figure generation +- The `xyChart.plotColorPalette` config in YAML frontmatter does NOT work reliably with mmdc +- Instead, `generate_mermaid_figures.py` post-processes SVG to replace default colors (`#ECECFF`, `#FFF4DD`) +- No manual color configuration needed in xychart-beta blocks - they will be styled automatically + ### Files to Review - `docs/00_resumen.md` - Resumen/Abstract - `docs/03_objetivos_metodologia.md` - Objectives diff --git a/.claude/commands/word-generation.md b/.claude/commands/word-generation.md index b528fd0..d913ef4 100644 --- a/.claude/commands/word-generation.md +++ b/.claude/commands/word-generation.md @@ -21,6 +21,11 @@ source .venv/bin/activate && python3 generate_mermaid_figures.py **Input:** Mermaid code blocks from `docs/*.md` **Output:** `thesis_output/figures/figura_*.png` and `figures_manifest.json` +**Notes:** +- Bar charts (`xychart-beta`) are automatically post-processed to use light blue (`#0098CD`) bars +- The script generates SVG first, replaces default colors, then converts to PNG via `cairosvg` +- Other diagram types (flowchart, sequence, pie) use direct PNG generation via `mmdc` + ### Step 2: Apply Content to UNIR Template Run the content application script using the virtual environment: @@ -53,12 +58,18 @@ After successful execution, provide: If scripts fail, check that dependencies are installed: ```bash # Python dependencies (in .venv) -source .venv/bin/activate && pip install beautifulsoup4 +source .venv/bin/activate && pip install beautifulsoup4 cairosvg # Mermaid CLI for figure generation npm install @mermaid-js/mermaid-cli ``` +### Notes + +- **Bar chart colors**: The `generate_mermaid_figures.py` script automatically converts xychart-beta bar colors to UNIR light blue (`#0098CD`). This is done via SVG post-processing since Mermaid's xychart theming doesn't work reliably via config files. +- **Color replacement**: Both `fill` and `stroke` attributes are replaced for colors `#ECECFF` and `#FFF4DD` (default Mermaid bar colors). +- **Config file**: `mermaid.config.json` in root directory sets the base theme for all diagrams. + ### Error Handling - If `generate_mermaid_figures.py` fails: Check mmdc (mermaid-cli) is installed diff --git a/docs/02_contexto_estado_arte.md b/docs/02_contexto_estado_arte.md index f0aa95f..bda02ce 100644 --- a/docs/02_contexto_estado_arte.md +++ b/docs/02_contexto_estado_arte.md @@ -121,7 +121,7 @@ Las arquitecturas más utilizadas para detección de texto incluyen: **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 1.** *Comparativa de arquitecturas de detección de texto.* +**Tabla 4.** *Comparativa de arquitecturas de detección de texto.* | Arquitectura | Tipo | Salida | Fortalezas | Limitaciones | |--------------|------|--------|------------|--------------| @@ -148,7 +148,7 @@ La arquitectura CRNN consta de tres componentes: **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 2.** *Comparativa de arquitecturas de reconocimiento de texto.* +**Tabla 5.** *Comparativa de arquitecturas de reconocimiento de texto.* | Arquitectura | Encoder | Decoder | Pérdida | Características | |--------------|---------|---------|---------|-----------------| @@ -293,7 +293,7 @@ El pipeline de PaddleOCR consta de tres módulos principales: PaddleOCR expone numerosos hiperparámetros que permiten ajustar el comportamiento del sistema. Los más relevantes para este trabajo son: -**Tabla 3.** *Hiperparámetros de detección de PaddleOCR.* +**Tabla 6.** *Hiperparámetros de detección de PaddleOCR.* | Parámetro | Descripción | Rango | Defecto | |-----------|-------------|-------|---------| @@ -304,7 +304,7 @@ PaddleOCR expone numerosos hiperparámetros que permiten ajustar el comportamien *Fuente: Documentación oficial de PaddleOCR (PaddlePaddle, 2024).* -**Tabla 4.** *Hiperparámetros de reconocimiento de PaddleOCR.* +**Tabla 7.** *Hiperparámetros de reconocimiento de PaddleOCR.* | Parámetro | Descripción | Rango | Defecto | |-----------|-------------|-------|---------| @@ -314,7 +314,7 @@ PaddleOCR expone numerosos hiperparámetros que permiten ajustar el comportamien *Fuente: Documentación oficial de PaddleOCR (PaddlePaddle, 2024).* -**Tabla 5.** *Hiperparámetros de preprocesamiento de PaddleOCR.* +**Tabla 8.** *Hiperparámetros de preprocesamiento de PaddleOCR.* | Parámetro | Descripción | Impacto | |-----------|-------------|---------| @@ -359,7 +359,7 @@ DocTR (Document Text Recognition) es una biblioteca desarrollada por Mindee (202 #### Comparativa Detallada de Soluciones -**Tabla 6.** *Comparativa técnica de soluciones OCR de código abierto.* +**Tabla 9.** *Comparativa técnica de soluciones OCR de código abierto.* | Aspecto | EasyOCR | PaddleOCR | DocTR | |---------|---------|-----------|-------| @@ -374,7 +374,7 @@ DocTR (Document Text Recognition) es una biblioteca desarrollada por Mindee (202 *Fuente: Elaboración propia a partir de documentación oficial (2024).* -**Tabla 7.** *Comparativa de facilidad de uso.* +**Tabla 10.** *Comparativa de facilidad de uso.* | Aspecto | EasyOCR | PaddleOCR | DocTR | |---------|---------|-----------|-------| @@ -399,7 +399,7 @@ A diferencia de los parámetros del modelo (como los pesos de una red neuronal), El problema de HPO puede formalizarse como: -$$\lambda^* = \arg\min_{\lambda \in \Lambda} \mathcal{L}(M_\lambda, D_{val})$$ +$$\lambda^* = \operatorname{argmin}_{\lambda \in \Lambda} \mathcal{L}(M_\lambda, D_{val})$$ Donde: - $\lambda$ es un vector de hiperparámetros @@ -548,7 +548,7 @@ Los principales recursos para evaluación de OCR en español incluyen: **XFUND**: Dataset de comprensión de formularios en múltiples idiomas, incluyendo español, con anotaciones de entidades y relaciones. -**Tabla 8.** *Datasets públicos con contenido en español.* +**Tabla 11.** *Datasets públicos con contenido en español.* | Dataset | Tipo | Idiomas | Tamaño | Uso principal | |---------|------|---------|--------|---------------| @@ -578,7 +578,7 @@ Los trabajos previos en OCR para español se han centrado principalmente en: **Reconocimiento de texto en escenas**: Participaciones en competiciones ICDAR para detección y reconocimiento de texto en español en imágenes naturales. -**Tabla 9.** *Trabajos previos relevantes en OCR para español.* +**Tabla 12.** *Trabajos previos relevantes en OCR para español.* | Trabajo | Enfoque | Contribución | |---------|---------|--------------| diff --git a/docs/03_objetivos_metodologia.md b/docs/03_objetivos_metodologia.md index e240ac5..bc680fd 100644 --- a/docs/03_objetivos_metodologia.md +++ b/docs/03_objetivos_metodologia.md @@ -8,7 +8,7 @@ La motivación presentada en el capítulo anterior se traduce ahora en objetivos ### Justificación SMART del Objetivo General -**Tabla 4.** *Justificación SMART del objetivo general.* +**Tabla 13.** *Justificación SMART del objetivo general.* | Criterio | Cumplimiento | |----------|--------------| @@ -124,7 +124,7 @@ Se implementó una clase Python para cargar pares imagen-texto que retorna tupla #### Modelos Evaluados -**Tabla 5.** *Modelos OCR evaluados en el benchmark inicial.* +**Tabla 14.** *Modelos OCR evaluados en el benchmark inicial.* | Modelo | Versión | Configuración | |--------|---------|---------------| @@ -142,7 +142,7 @@ Se utilizó la biblioteca `jiwer` para calcular CER y WER comparando el texto de #### Hiperparámetros Seleccionados -**Tabla 6.** *Hiperparámetros seleccionados para optimización.* +**Tabla 15.** *Hiperparámetros seleccionados para optimización.* | Parámetro | Tipo | Rango/Valores | Descripción | |-----------|------|---------------|-------------| @@ -206,7 +206,7 @@ El servicio OCR expone una API REST que retorna métricas en formato JSON: #### Hardware -**Tabla 7.** *Especificaciones de hardware del entorno de desarrollo.* +**Tabla 16.** *Especificaciones de hardware del entorno de desarrollo.* | Componente | Especificación | |------------|----------------| @@ -219,7 +219,7 @@ El servicio OCR expone una API REST que retorna métricas en formato JSON: #### Software -**Tabla 8.** *Versiones de software utilizadas.* +**Tabla 17.** *Versiones de software utilizadas.* | Componente | Versión | |------------|---------| @@ -236,7 +236,7 @@ El servicio OCR expone una API REST que retorna métricas en formato JSON: 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 9.** *Costos de GPU en plataformas cloud.* +**Tabla 18.** *Costos de GPU en plataformas cloud.* | Plataforma | GPU | Costo/Hora | Costo Mensual | |------------|-----|------------|---------------| @@ -248,7 +248,7 @@ La decisión de ejecutar los experimentos en hardware local en lugar de utilizar Para las tareas específicas de este proyecto, los costos estimados en cloud serían: -**Tabla 10.** *Análisis de costos del proyecto en plataformas cloud.* +**Tabla 19.** *Análisis de costos del proyecto en plataformas cloud.* | Tarea | Tiempo GPU | Costo AWS | Costo Colab Pro | |-------|------------|-----------|-----------------| diff --git a/docs/04_desarrollo_especifico.md b/docs/04_desarrollo_especifico.md index db5697a..20e3a04 100644 --- a/docs/04_desarrollo_especifico.md +++ b/docs/04_desarrollo_especifico.md @@ -18,7 +18,7 @@ Los documentos académicos típicos incluyen texto corrido entremezclado con tab Se seleccionaron tres soluciones OCR de código abierto representativas del estado del arte: -**Tabla 11.** *Soluciones OCR evaluadas en el benchmark comparativo.* +**Tabla 20.** *Soluciones OCR evaluadas en el benchmark comparativo.* | Solución | Desarrollador | Versión | Justificación de selección | |----------|---------------|---------|----------------------------| @@ -49,7 +49,7 @@ Los criterios establecidos para evaluar las soluciones fueron: Se utilizó el documento "Instrucciones para la redacción y elaboración del TFE" del Máster Universitario en Inteligencia Artificial de UNIR, ubicado en la carpeta `instructions/`. -**Tabla 12.** *Características del dataset de evaluación inicial.* +**Tabla 21.** *Características del dataset de evaluación inicial.* | Característica | Valor | |----------------|-------| @@ -90,7 +90,7 @@ Se utilizó la biblioteca `jiwer` para calcular CER y WER de manera estandarizad Durante el benchmark inicial se evaluó PaddleOCR con configuración por defecto en un subconjunto del dataset. Los resultados preliminares mostraron variabilidad significativa entre páginas, con CER entre 1.54% y 6.40% dependiendo de la complejidad del layout. -**Tabla 13.** *Variabilidad del CER por tipo de contenido.* +**Tabla 22.** *Variabilidad del CER por tipo de contenido.* | Tipo de contenido | CER aproximado | Observaciones | |-------------------|----------------|---------------| @@ -115,7 +115,7 @@ Durante el benchmark inicial se evaluó PaddleOCR con configuración por defecto Los tres modelos evaluados representan diferentes paradigmas de OCR: -**Tabla 14.** *Comparativa de arquitecturas OCR evaluadas.* +**Tabla 23.** *Comparativa de arquitecturas OCR evaluadas.* | Modelo | Tipo | Componentes | Fortalezas Clave | |--------|------|-------------|------------------| @@ -156,7 +156,7 @@ Un análisis cualitativo de los errores producidos reveló patrones específicos La selección de PaddleOCR para la fase de optimización se basó en los siguientes criterios: -**Tabla 15.** *Evaluación de criterios de selección.* +**Tabla 24.** *Evaluación de criterios de selección.* | Criterio | EasyOCR | PaddleOCR | DocTR | |----------|---------|-----------|-------| @@ -227,7 +227,7 @@ Esta aproximación ofrece ventajas significativas frente al fine-tuning tradicio El experimento se ejecutó en el siguiente entorno: -**Tabla 16.** *Entorno de ejecución del experimento.* +**Tabla 25.** *Entorno de ejecución del experimento.* | Componente | Versión/Especificación | |------------|------------------------| @@ -307,7 +307,7 @@ Respuesta del servicio OCR: La infraestructura del proyecto se basa en contenedores Docker para garantizar reproducibilidad y aislamiento de dependencias. Se generaron seis imágenes Docker, cada una optimizada para su propósito específico. -**Tabla 17.** *Imágenes Docker generadas para el proyecto.* +**Tabla 26.** *Imágenes Docker generadas para el proyecto.* | Imagen | Propósito | Base | Puerto | |--------|-----------|------|--------| @@ -397,7 +397,7 @@ flowchart LR El proyecto incluye múltiples archivos Docker Compose para diferentes escenarios de uso: -**Tabla 18.** *Archivos Docker Compose del proyecto.* +**Tabla 27.** *Archivos Docker Compose del proyecto.* | Archivo | Propósito | Servicios | |---------|-----------|-----------| @@ -414,7 +414,7 @@ El proyecto incluye múltiples archivos Docker Compose para diferentes escenario Se utilizan volúmenes Docker nombrados para persistir los modelos descargados entre ejecuciones: -**Tabla 19.** *Volúmenes Docker para caché de modelos.* +**Tabla 28.** *Volúmenes Docker para caché de modelos.* | Volumen | Servicio | Contenido | |---------|----------|-----------| @@ -517,7 +517,7 @@ Los resultados de los experimentos están disponibles en: Para la fase de optimización se extendió el dataset: -**Tabla 20.** *Características del dataset de optimización.* +**Tabla 29.** *Características del dataset de optimización.* | Característica | Valor | |----------------|-------| @@ -535,7 +535,7 @@ La clase `ImageTextDataset` gestiona la carga de pares imagen-texto desde la est El espacio de búsqueda se definió considerando los hiperparámetros más relevantes identificados en la documentación de PaddleOCR, utilizando `tune.choice()` para parámetros booleanos y `tune.uniform()` para umbrales continuos. La implementación está disponible en `src/raytune/raytune_ocr.py` (ver Anexo A). -**Tabla 21.** *Descripción detallada del espacio de búsqueda.* +**Tabla 30.** *Descripción detallada del espacio de búsqueda.* | Parámetro | Tipo | Rango | Descripción | |-----------|------|-------|-------------| @@ -561,7 +561,7 @@ El espacio de búsqueda se definió considerando los hiperparámetros más relev Se configuró Ray Tune con OptunaSearch como algoritmo de búsqueda, optimizando CER en 64 trials con 2 ejecuciones concurrentes. La implementación está disponible en `src/raytune/raytune_ocr.py` (ver Anexo A). -**Tabla 22.** *Parámetros de configuración de Ray Tune.* +**Tabla 31.** *Parámetros de configuración de Ray Tune.* | Parámetro | Valor | Justificación | |-----------|-------|---------------| @@ -587,7 +587,7 @@ El número de trials se eligió considerando: El experimento se ejecutó exitosamente con los siguientes resultados globales: -**Tabla 23.** *Resumen de la ejecución del experimento.* +**Tabla 32.** *Resumen de la ejecución del experimento.* | Métrica | Valor | |---------|-------| @@ -603,7 +603,7 @@ El experimento se ejecutó exitosamente con los siguientes resultados globales: Del archivo CSV de resultados (`src/results/raytune_paddle_results_20260119_122609.csv`): -**Tabla 24.** *Estadísticas descriptivas de los 64 trials.* +**Tabla 33.** *Estadísticas descriptivas de los 64 trials.* | Estadística | CER | WER | Tiempo/Página (s) | |-------------|-----|-----|-------------------| @@ -626,7 +626,7 @@ Del archivo CSV de resultados (`src/results/raytune_paddle_results_20260119_1226 #### Distribución de Resultados -**Tabla 25.** *Distribución de trials por rango de CER.* +**Tabla 34.** *Distribución de trials por rango de CER.* | Rango CER | Número de trials | Porcentaje | |-----------|------------------|------------| @@ -637,6 +637,24 @@ Del archivo CSV de resultados (`src/results/raytune_paddle_results_20260119_1226 *Fuente: Elaboración propia a partir de `src/results/raytune_paddle_results_20260119_122609.csv`.* +```mermaid +--- +title: "Distribución de trials por rango de CER" +config: + theme: base + themeVariables: + primaryColor: "#E6F4F9" + primaryTextColor: "#404040" + primaryBorderColor: "#0098CD" + lineColor: "#0098CD" +--- +pie showData + title Distribución de 64 trials + "CER < 2%" : 43 + "CER 2-5%" : 10 + "CER 5-10%" : 11 +``` + La mayoría de trials (67.2%) alcanzaron CER < 2%, cumpliendo el objetivo establecido. Ningún trial presentó fallos catastróficos (CER > 10%), demostrando la estabilidad de la optimización con GPU. #### Mejor Configuración Encontrada @@ -657,7 +675,7 @@ Configuración óptima: text_rec_score_thresh: 0.5658 ``` -**Tabla 26.** *Configuración óptima identificada.* +**Tabla 35.** *Configuración óptima identificada.* | Parámetro | Valor óptimo | Valor por defecto | Cambio | |-----------|--------------|-------------------|--------| @@ -675,7 +693,7 @@ Configuración óptima: Se calculó la correlación de Pearson entre los parámetros continuos y las métricas de error: -**Tabla 27.** *Correlación de parámetros con CER.* +**Tabla 36.** *Correlación de parámetros con CER.* | Parámetro | Correlación con CER | Interpretación | |-----------|---------------------|----------------| @@ -686,7 +704,7 @@ Se calculó la correlación de Pearson entre los parámetros continuos y las mé *Fuente: Análisis de [`src/results/`](https://seryus.ddns.net/unir/MastersThesis/-/tree/main/src/results) generados por [`src/run_tuning.py`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/run_tuning.py).* -**Tabla 28.** *Correlación de parámetros con WER.* +**Tabla 37.** *Correlación de parámetros con WER.* | Parámetro | Correlación con WER | Interpretación | |-----------|---------------------|----------------| @@ -696,13 +714,34 @@ Se calculó la correlación de Pearson entre los parámetros continuos y las mé *Fuente: Análisis de [`src/results/`](https://seryus.ddns.net/unir/MastersThesis/-/tree/main/src/results) generados por [`src/run_tuning.py`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/run_tuning.py).* +```mermaid +--- +title: "Correlación de hiperparámetros con CER" +config: + theme: base + themeVariables: + primaryColor: "#E6F4F9" + primaryTextColor: "#404040" + primaryBorderColor: "#0098CD" + lineColor: "#0098CD" + xyChart: + plotColorPalette: "#0098CD" +--- +xychart-beta + x-axis ["text_det_thresh", "text_det_box_thresh", "text_rec_score_thresh"] + y-axis "Correlación con CER" -0.6 --> 0.3 + bar [-0.523, 0.226, -0.161] +``` + +*Leyenda: Valores negativos indican que aumentar el parámetro reduce el CER. El parámetro `text_det_thresh` tiene la correlación más fuerte (-0.52).* + **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. #### Impacto del Parámetro textline_orientation El parámetro booleano `textline_orientation` demostró tener el mayor impacto en el rendimiento: -**Tabla 29.** *Impacto del parámetro textline_orientation.* +**Tabla 38.** *Impacto del parámetro textline_orientation.* | textline_orientation | CER Medio | CER Std | WER Medio | N trials | |---------------------|-----------|---------|-----------|----------| @@ -729,6 +768,8 @@ config: primaryTextColor: "#404040" primaryBorderColor: "#0098CD" lineColor: "#0098CD" + xyChart: + plotColorPalette: "#0098CD" --- xychart-beta x-axis ["textline_orientation=False", "textline_orientation=True"] @@ -744,7 +785,7 @@ El parámetro `textline_orientation` activa un clasificador que determina la ori Los trials con CER muy alto (>20%) presentaron patrones específicos: -**Tabla 30.** *Características de trials con fallos catastróficos.* +**Tabla 39.** *Características de trials con fallos catastróficos.* | Trial | CER | text_det_thresh | textline_orientation | Diagnóstico | |-------|-----|-----------------|---------------------|-------------| @@ -771,7 +812,7 @@ Los trials con CER muy alto (>20%) presentaron patrones específicos: 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 31.** *Comparación baseline vs optimizado (45 páginas).* +**Tabla 40.** *Comparación baseline vs optimizado (45 páginas).* | Modelo | CER | Precisión Caracteres | WER | Precisión Palabras | |--------|-----|---------------------|-----|-------------------| @@ -784,7 +825,7 @@ La configuración óptima identificada se evaluó sobre el dataset completo de 4 #### Métricas de Mejora -**Tabla 32.** *Análisis cuantitativo de la mejora.* +**Tabla 41.** *Análisis cuantitativo de la mejora.* | Forma de Medición | CER | WER | |-------------------|-----|-----| @@ -807,6 +848,8 @@ config: primaryTextColor: "#404040" primaryBorderColor: "#0098CD" lineColor: "#0098CD" + xyChart: + plotColorPalette: "#0098CD" --- xychart-beta x-axis ["CER Baseline", "CER Optimizado", "WER Baseline", "WER Optimizado"] @@ -835,7 +878,7 @@ xychart-beta ### Tiempo de Ejecución -**Tabla 33.** *Métricas de tiempo del experimento (GPU).* +**Tabla 42.** *Métricas de tiempo del experimento (GPU).* | Métrica | Valor | |---------|-------| @@ -871,7 +914,7 @@ Los resultados obtenidos en las secciones anteriores requieren un análisis que #### Progresión del Rendimiento -**Tabla 34.** *Evolución del rendimiento a través del estudio.* +**Tabla 43.** *Evolución del rendimiento a través del estudio.* | Fase | Configuración | CER | Mejora vs anterior | |------|--------------|-----|-------------------| @@ -881,11 +924,32 @@ Los resultados obtenidos en las secciones anteriores requieren un análisis que *Fuente: Elaboración propia.* +```mermaid +--- +title: "Evolución del CER a través del estudio" +config: + theme: base + themeVariables: + primaryColor: "#E6F4F9" + primaryTextColor: "#404040" + primaryBorderColor: "#0098CD" + lineColor: "#0098CD" + xyChart: + plotColorPalette: "#0098CD" +--- +xychart-beta + x-axis ["Baseline", "Mejor trial (5 pág)", "Validación (45 pág)"] + y-axis "CER (%)" 0 --> 10 + bar [8.85, 0.79, 7.72] +``` + +*Leyenda: El mejor trial alcanza CER 0.79% (objetivo cumplido). La validación sobre dataset completo muestra CER 7.72%, evidenciando sobreajuste al subconjunto de optimización.* + El incremento del CER de 0.79% (5 páginas) a 7.72% (45 páginas) evidencia sobreajuste al subconjunto de optimización. Este fenómeno es esperado cuando se optimiza sobre un subconjunto pequeño y se valida sobre el dataset completo con mayor diversidad de layouts. #### Comparación con Objetivo -**Tabla 35.** *Verificación del objetivo general.* +**Tabla 44.** *Verificación del objetivo general.* | Aspecto | Objetivo | Resultado (trial) | Resultado (full) | Cumplimiento | |---------|----------|-------------------|------------------|--------------| @@ -904,7 +968,7 @@ El incremento del CER de 0.79% (5 páginas) a 7.72% (45 páginas) evidencia sobr Basándose en el análisis de los resultados de optimización: -**Tabla 36.** *Ranking de importancia de hiperparámetros.* +**Tabla 45.** *Ranking de importancia de hiperparámetros.* | Rank | Parámetro | Impacto | Evidencia | |------|-----------|---------|-----------| @@ -917,6 +981,27 @@ Basándose en el análisis de los resultados de optimización: *Fuente: Elaboración propia basada en [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/results/raytune_paddle_results_20260119_122609.csv).* +```mermaid +--- +title: "Ranking de importancia de hiperparámetros" +config: + theme: base + themeVariables: + primaryColor: "#E6F4F9" + primaryTextColor: "#404040" + primaryBorderColor: "#0098CD" + lineColor: "#0098CD" + xyChart: + plotColorPalette: "#0098CD" +--- +xychart-beta horizontal + x-axis ["use_doc_unwarping", "text_rec_score_thresh", "text_det_box_thresh", "text_det_thresh", "use_doc_orientation", "textline_orientation"] + y-axis "Impacto relativo" 0 --> 100 + bar [0, 30, 40, 70, 80, 100] +``` + +*Leyenda: Impacto relativo estimado basado en análisis de correlación y presencia en configuraciones óptimas. `textline_orientation` es el parámetro más crítico.* + #### Análisis del Parámetro textline_orientation **Por qué es tan importante:** @@ -969,7 +1054,7 @@ Para documentos PDF digitales como los evaluados, este módulo es innecesario y #### Clasificación de Errores -**Tabla 37.** *Tipología de errores observados.* +**Tabla 46.** *Tipología de errores observados.* | Tipo de error | Frecuencia | Ejemplo | Causa probable | |---------------|------------|---------|----------------| @@ -983,7 +1068,7 @@ Para documentos PDF digitales como los evaluados, este módulo es innecesario y #### Patrones de Fallo por Tipo de Contenido -**Tabla 38.** *Tasa de error por tipo de contenido.* +**Tabla 47.** *Tasa de error por tipo de contenido.* | Tipo de contenido | CER estimado | Factor de riesgo | |-------------------|--------------|------------------| @@ -998,7 +1083,7 @@ Para documentos PDF digitales como los evaluados, este módulo es innecesario y ### Comparación con Objetivos Específicos -**Tabla 39.** *Cumplimiento de objetivos específicos.* +**Tabla 48.** *Cumplimiento de objetivos específicos.* | Objetivo | Descripción | Resultado | Estado | |----------|-------------|-----------|--------| @@ -1044,7 +1129,7 @@ Para documentos PDF digitales como los evaluados, este módulo es innecesario y Para documentos académicos en español similares a los evaluados: -**Tabla 40.** *Configuración recomendada para PaddleOCR con GPU.* +**Tabla 49.** *Configuración recomendada para PaddleOCR con GPU.* | Parámetro | Valor | Prioridad | Justificación | |-----------|-------|-----------|---------------| @@ -1108,7 +1193,7 @@ Esta sección presenta la comparación de rendimiento entre ejecución en CPU y #### Configuración del Entorno GPU -**Tabla 41.** *Especificaciones del entorno GPU utilizado.* +**Tabla 50.** *Especificaciones del entorno GPU utilizado.* | Componente | Especificación | |------------|----------------| @@ -1126,7 +1211,7 @@ Este hardware representa configuración típica de desarrollo, permitiendo evalu Se comparó el tiempo de procesamiento entre CPU y GPU utilizando los datos de [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/raytune_paddle_subproc_results_20251207_192320.csv) (CPU) y [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/results/raytune_paddle_results_20260119_122609.csv) (GPU). -**Tabla 42.** *Rendimiento comparativo CPU vs GPU.* +**Tabla 51.** *Rendimiento comparativo CPU vs GPU.* | Métrica | CPU | GPU (RTX 3060) | Factor de Aceleración | |---------|-----|----------------|----------------------| @@ -1136,6 +1221,27 @@ Se comparó el tiempo de procesamiento entre CPU y GPU utilizando los datos de [ *Fuente: Elaboración propia a partir de [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/raytune_paddle_subproc_results_20251207_192320.csv) y [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/results/raytune_paddle_results_20260119_122609.csv).* +```mermaid +--- +title: "Tiempo de procesamiento: CPU vs GPU (segundos/página)" +config: + theme: base + themeVariables: + primaryColor: "#E6F4F9" + primaryTextColor: "#404040" + primaryBorderColor: "#0098CD" + lineColor: "#0098CD" + xyChart: + plotColorPalette: "#0098CD" +--- +xychart-beta + x-axis ["CPU", "GPU (RTX 3060)"] + y-axis "Segundos por página" 0 --> 75 + bar [69.4, 0.84] +``` + +*Leyenda: Aceleración de **82×** con GPU. El procesamiento de una página pasa de 69.4s (CPU) a 0.84s (GPU).* + La aceleración de 82× obtenida con GPU transforma la viabilidad del enfoque: - **Optimización en CPU (6.4 horas)**: Viable pero lento para iteraciones rápidas - **Optimización en GPU (1.5 horas)**: Permite explorar más configuraciones y realizar múltiples experimentos @@ -1145,7 +1251,7 @@ La aceleración de 82× obtenida con GPU transforma la viabilidad del enfoque: 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 43.** *Comparación de modelos Mobile vs Server en RTX 3060.* +**Tabla 52.** *Comparación de modelos Mobile vs Server en RTX 3060.* | Modelo | VRAM Requerida | Resultado | Recomendación | |--------|----------------|-----------|---------------| diff --git a/docs/05_conclusiones_trabajo_futuro.md b/docs/05_conclusiones_trabajo_futuro.md index 1661976..f9fd544 100644 --- a/docs/05_conclusiones_trabajo_futuro.md +++ b/docs/05_conclusiones_trabajo_futuro.md @@ -10,7 +10,7 @@ Los resultados obtenidos confirman que la optimización sistemática de hiperpar 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 44.** *Cumplimiento del objetivo de CER.* +**Tabla 53.** *Cumplimiento del objetivo de CER.* | Métrica | Objetivo | Mejor Trial | Dataset Completo | Cumplimiento | |---------|----------|-------------|------------------|--------------| @@ -50,7 +50,7 @@ En segundo lugar, el análisis sistemático de los hiperparámetros de PaddleOCR Como resultado práctico, se aporta una configuración validada específicamente para documentos académicos en español. Aunque la generalización a otros tipos de documentos requiere validación adicional, esta configuración representa un punto de partida sólido para aplicaciones en el ámbito hispanohablante. -Por último, todo el código fuente, las imágenes Docker y los datos experimentales están disponibles públicamente en el repositorio GitHub del proyecto, facilitando así la reproducción, verificación y extensión de este trabajo por parte de otros investigadores. +Por último, todo el código fuente, las imágenes Docker y los datos experimentales están disponibles públicamente en el repositorio del proyecto, facilitando así la reproducción, verificación y extensión de este trabajo por parte de otros investigadores. ### Limitaciones del Trabajo diff --git a/docs/07_anexo_a.md b/docs/07_anexo_a.md index 75e0525..41003d3 100644 --- a/docs/07_anexo_a.md +++ b/docs/07_anexo_a.md @@ -76,7 +76,7 @@ flowchart TB end ``` -**Tabla A5.** *Descripción de directorios principales.* +**Tabla A1.** *Descripción de directorios principales.* | Directorio | Contenido | |------------|-----------| @@ -96,7 +96,7 @@ flowchart TB ### Sistema de Desarrollo -**Tabla A1.** *Especificaciones del sistema de desarrollo.* +**Tabla A2.** *Especificaciones del sistema de desarrollo.* | Componente | Especificación | |------------|----------------| @@ -110,7 +110,7 @@ flowchart TB ### Dependencias -**Tabla A2.** *Dependencias del proyecto.* +**Tabla A3.** *Dependencias del proyecto.* | Componente | Versión | |------------|---------| @@ -231,7 +231,7 @@ analyze_results(results, prefix='raytune_paddle', config_keys=PADDLE_OCR_CONFIG_ ### Servicios y Puertos -**Tabla A3.** *Servicios Docker y puertos.* +**Tabla A4.** *Servicios Docker y puertos.* | Servicio | Puerto | Script de Ajuste | Nota | |----------|--------|------------------|------| @@ -245,22 +245,95 @@ analyze_results(results, prefix='raytune_paddle', config_keys=PADDLE_OCR_CONFIG_ ## A.7 Métricas de Rendimiento -Los resultados detallados de las evaluaciones y ajustes de hiperparámetros se encuentran en: +Esta sección presenta los resultados completos de las evaluaciones comparativas y del ajuste de hiperparámetros realizado con Ray Tune sobre los tres servicios OCR evaluados. -- [Métricas Generales](metrics/metrics.md) - Comparativa de los tres servicios -- [PaddleOCR](metrics/metrics_paddle.md) - Mejor precisión (8.85% CER baseline, **7.72% optimizado**, **0.79% mejor trial**) -- [DocTR](metrics/metrics_doctr.md) - Más rápido (0.50s/página) -- [EasyOCR](metrics/metrics_easyocr.md) - Balance intermedio +### Comparativa General de Servicios -### Resumen de Resultados +**Tabla A5.** *Comparativa de servicios OCR en dataset de 45 páginas (GPU RTX 3060).* -**Tabla A4.** *Resumen de resultados del benchmark por servicio.* +| 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 | -| 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: Benchmark realizado el 2026-01-19. Elaboración propia.* + +**Ganador:** PaddleOCR (Mobile) - Mejor precisión (7.76% CER) con velocidad competitiva y mínimo consumo de VRAM. + +### Resultados de Ajuste de Hiperparámetros + +Se ejecutaron 64 trials por servicio utilizando Ray Tune con Optuna sobre las páginas 5-10 del primer documento. + +**Tabla A6.** *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: Resultados de 64 trials Ray Tune por servicio. Elaboración propia.* + +> **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 grande (15-20 páginas) mejoraría la generalización. + +### Configuración Óptima PaddleOCR + +La siguiente configuración logró el mejor rendimiento en el ajuste de hiperparámetros: + +```json +{ + "use_doc_orientation_classify": true, + "use_doc_unwarping": false, + "textline_orientation": true, + "text_det_thresh": 0.0462, + "text_det_box_thresh": 0.4862, + "text_det_unclip_ratio": 0.0, + "text_rec_score_thresh": 0.5658 +} +``` + +**Hallazgos clave:** +- `textline_orientation=true`: Crítico para documentos con layouts mixtos +- `use_doc_orientation_classify=true`: Mejora detección de orientación +- `use_doc_unwarping=false`: Innecesario para PDFs digitales +- `text_det_thresh` bajo (0.0462): Detección más sensible mejora resultados + +### Rendimiento CPU vs GPU + +**Tabla A7.** *Comparación de rendimiento CPU vs GPU (PaddleOCR).* + +| Métrica | CPU | GPU (RTX 3060) | Aceleración | +|---------|-----|----------------|-------------| +| Tiempo/Página | 69.4s | 0.55s | **126x más rápido** | +| Mejor CER | 1.15% | 0.79% | GPU mejor | +| 45 páginas | ~52 min | ~25 seg | **126x más rápido** | + +*Fuente: Datos CPU de `raytune_paddle_subproc_results_20251207_192320.csv`. Elaboración propia.* + +### Análisis de Errores por Servicio + +**Tabla A8.** *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 (~5%) | 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.* + +### Archivos de Resultados + +Los resultados crudos de los 64 trials por servicio están disponibles en el repositorio: + +**Tabla A9.** *Ubicación de archivos de resultados.* + +| Servicio | Archivo CSV | +|----------|-------------| +| PaddleOCR | [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/results/raytune_paddle_results_20260119_122609.csv) | +| DocTR | [`src/results/raytune_doctr_results_20260119_121445.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/results/raytune_doctr_results_20260119_121445.csv) | +| EasyOCR | [`src/results/raytune_easyocr_results_20260119_120204.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/results/raytune_easyocr_results_20260119_120204.csv) | *Fuente: Elaboración propia.* diff --git a/docs/metrics/metrics.md b/docs/metrics/metrics.md index 38ea7f2..eb99784 100644 --- a/docs/metrics/metrics.md +++ b/docs/metrics/metrics.md @@ -75,6 +75,17 @@ La fase de optimización representa el **resultado principal del TFM** (CER 1.49 ### Comparación de Precisión (CER - menor es mejor) ```mermaid +--- +config: + theme: base + themeVariables: + primaryColor: "#E6F4F9" + primaryTextColor: "#404040" + primaryBorderColor: "#0098CD" + lineColor: "#0098CD" + xyChart: + plotColorPalette: "#0098CD" +--- xychart-beta title "Tasa de Error de Caracteres por Servicio" x-axis ["PaddleOCR", "EasyOCR", "DocTR"] @@ -85,6 +96,17 @@ xychart-beta ### Comparación de Velocidad (Tiempo por Página) ```mermaid +--- +config: + theme: base + themeVariables: + primaryColor: "#E6F4F9" + primaryTextColor: "#404040" + primaryBorderColor: "#0098CD" + lineColor: "#0098CD" + xyChart: + plotColorPalette: "#0098CD" +--- xychart-beta title "Tiempo de Procesamiento por Página (segundos)" x-axis ["DocTR", "PaddleOCR", "EasyOCR"] @@ -167,6 +189,17 @@ Datos de `raytune_paddle_subproc_results_20251207_192320.csv` (CPU) vs RTX 3060 | **45 páginas** | ~52 min | ~25 seg | **126x más rápido** | ```mermaid +--- +config: + theme: base + themeVariables: + primaryColor: "#E6F4F9" + primaryTextColor: "#404040" + primaryBorderColor: "#0098CD" + lineColor: "#0098CD" + xyChart: + plotColorPalette: "#0098CD" +--- xychart-beta title "Tiempo de Procesamiento por Página: CPU vs GPU" x-axis ["CPU", "GPU (RTX 3060)"] diff --git a/generate_mermaid_figures.py b/generate_mermaid_figures.py index c76bf23..6e484e6 100644 --- a/generate_mermaid_figures.py +++ b/generate_mermaid_figures.py @@ -6,10 +6,18 @@ import re import subprocess import json +import cairosvg + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) DOCS_DIR = os.path.join(BASE_DIR, 'docs') OUTPUT_DIR = os.path.join(BASE_DIR, 'thesis_output/figures') MMDC = os.path.join(BASE_DIR, 'node_modules/.bin/mmdc') +CONFIG_FILE = os.path.join(BASE_DIR, 'mermaid.config.json') + +# Light blue color for bar charts +BAR_COLOR = '#0098CD' +# Default bar colors that need to be replaced (varies by theme) +DEFAULT_BAR_COLORS = ['#ECECFF', '#FFF4DD', '#ececff', '#fff4dd'] def extract_mermaid_diagrams(): """Extract all mermaid diagrams from markdown files.""" @@ -63,17 +71,51 @@ def convert_to_png(diagrams): temp_file = os.path.join(OUTPUT_DIR, f'temp_{diagram["index"]}.mmd') output_file = os.path.join(OUTPUT_DIR, f'figura_{diagram["index"]}.png') + # Check if this is a bar chart (xychart-beta) + is_bar_chart = 'xychart-beta' in diagram['code'] + with open(temp_file, 'w', encoding='utf-8') as f: f.write(diagram['code']) - # Convert using mmdc with high resolution for clarity try: - result = subprocess.run( - [MMDC, '-i', temp_file, '-o', output_file, '-b', 'white', '-w', '1600', '-s', '3'], - capture_output=True, - text=True, - timeout=60 - ) + if is_bar_chart: + # For bar charts: generate SVG, fix colors, convert to PNG + svg_file = os.path.join(OUTPUT_DIR, f'temp_{diagram["index"]}.svg') + + result = subprocess.run( + [MMDC, '-i', temp_file, '-o', svg_file, '-b', 'white', '-w', '1600', '-c', CONFIG_FILE], + capture_output=True, + text=True, + timeout=60 + ) + + if os.path.exists(svg_file): + # Read SVG and replace bar color + with open(svg_file, 'r', encoding='utf-8') as f: + svg_content = f.read() + + # Replace default bar colors with light blue (both fill and stroke) + for default_color in DEFAULT_BAR_COLORS: + svg_content = svg_content.replace(f'fill="{default_color}"', f'fill="{BAR_COLOR}"') + svg_content = svg_content.replace(f"fill='{default_color}'", f"fill='{BAR_COLOR}'") + svg_content = svg_content.replace(f'stroke="{default_color}"', f'stroke="{BAR_COLOR}"') + svg_content = svg_content.replace(f"stroke='{default_color}'", f"stroke='{BAR_COLOR}'") + + # Convert SVG to PNG using cairosvg (with scale for high resolution) + cairosvg.svg2png(bytestring=svg_content.encode('utf-8'), + write_to=output_file, + scale=3) + + # Clean up SVG + os.remove(svg_file) + else: + # For other diagrams: direct PNG generation + result = subprocess.run( + [MMDC, '-i', temp_file, '-o', output_file, '-b', 'white', '-w', '1600', '-s', '3', '-c', CONFIG_FILE], + capture_output=True, + text=True, + timeout=60 + ) if os.path.exists(output_file): print(f"✓ Generated: figura_{diagram['index']}.png - {diagram['title']}") diff --git a/mermaid.config.json b/mermaid.config.json new file mode 100644 index 0000000..2fc3b2d --- /dev/null +++ b/mermaid.config.json @@ -0,0 +1,12 @@ +{ + "theme": "base", + "themeVariables": { + "primaryColor": "#E6F4F9", + "primaryTextColor": "#404040", + "primaryBorderColor": "#0098CD", + "lineColor": "#0098CD" + }, + "xyChart": { + "plotColorPalette": "#0098CD" + } +} diff --git a/thesis_output/figures/figura_10.png b/thesis_output/figures/figura_10.png index 8f9aea7..37ef151 100644 Binary files a/thesis_output/figures/figura_10.png and b/thesis_output/figures/figura_10.png differ diff --git a/thesis_output/figures/figura_11.png b/thesis_output/figures/figura_11.png index 632960f..43a6865 100644 Binary files a/thesis_output/figures/figura_11.png and b/thesis_output/figures/figura_11.png differ diff --git a/thesis_output/figures/figura_12.png b/thesis_output/figures/figura_12.png new file mode 100644 index 0000000..6f2afc6 Binary files /dev/null and b/thesis_output/figures/figura_12.png differ diff --git a/thesis_output/figures/figura_13.png b/thesis_output/figures/figura_13.png new file mode 100644 index 0000000..792aef4 Binary files /dev/null and b/thesis_output/figures/figura_13.png differ diff --git a/thesis_output/figures/figura_14.png b/thesis_output/figures/figura_14.png new file mode 100644 index 0000000..38106cd Binary files /dev/null and b/thesis_output/figures/figura_14.png differ diff --git a/thesis_output/figures/figura_15.png b/thesis_output/figures/figura_15.png new file mode 100644 index 0000000..943a64b Binary files /dev/null and b/thesis_output/figures/figura_15.png differ diff --git a/thesis_output/figures/figura_16.png b/thesis_output/figures/figura_16.png new file mode 100644 index 0000000..632960f Binary files /dev/null and b/thesis_output/figures/figura_16.png differ diff --git a/thesis_output/figures/figura_9.png b/thesis_output/figures/figura_9.png index b601da6..a1cd25e 100644 Binary files a/thesis_output/figures/figura_9.png and b/thesis_output/figures/figura_9.png differ diff --git a/thesis_output/figures/figures_manifest.json b/thesis_output/figures/figures_manifest.json index 104d806..411ab22 100644 --- a/thesis_output/figures/figures_manifest.json +++ b/thesis_output/figures/figures_manifest.json @@ -41,17 +41,42 @@ }, { "file": "figura_9.png", - "title": "Impacto de textline_orientation en CER", + "title": "Distribución de trials por rango de CER", "index": 9 }, { "file": "figura_10.png", - "title": "Reducción de errores: Baseline vs Optimizado (45 páginas)", + "title": "Correlación de hiperparámetros con CER", "index": 10 }, { "file": "figura_11.png", - "title": "Estructura del repositorio MastersThesis", + "title": "Impacto de textline_orientation en CER", "index": 11 + }, + { + "file": "figura_12.png", + "title": "Reducción de errores: Baseline vs Optimizado (45 páginas)", + "index": 12 + }, + { + "file": "figura_13.png", + "title": "Evolución del CER a través del estudio", + "index": 13 + }, + { + "file": "figura_14.png", + "title": "Ranking de importancia de hiperparámetros", + "index": 14 + }, + { + "file": "figura_15.png", + "title": "Tiempo de procesamiento: CPU vs GPU (segundos/página)", + "index": 15 + }, + { + "file": "figura_16.png", + "title": "Estructura del repositorio MastersThesis", + "index": 16 } ] \ No newline at end of file diff --git a/thesis_output/plantilla_individual.htm b/thesis_output/plantilla_individual.htm index 17866e8..5c3cf74 100644 --- a/thesis_output/plantilla_individual.htm +++ b/thesis_output/plantilla_individual.htm @@ -4806,7 +4806,7 @@ _Toc14106979">· Parámetros de regularización (dropout, weight decay)
· Umbrales de decisión en tiempo de inferencia (relevante para este trabajo)
El problema de HPO puede formalizarse como:
- +Donde:
· es un vector de hiperparámetros
· es el espacio de búsqueda
@@ -5371,6 +5371,10 @@ docker compose -f docker-compose.tuning.paddle.yml downRango 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.
Figura 9. Distribución de trials por rango de CER
+
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.
La configuración que minimizó el CER fue:
@@ -5401,6 +5405,11 @@ Configuración óptima: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.
Figura 10. Correlación de hiperparámetros con CER
+
Fuente: Elaboración propia.
+Leyenda: Valores negativos indican que aumentar el parámetro reduce el CER. El parámetro text_det_thresh tiene la correlación más fuerte (-0.52).
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:
@@ -5412,8 +5421,8 @@ Configuración óptima:1. Reducción del CER: Con textline_orientation=True, el CER medio es 3.3 veces menor (3.76% vs 12.40%).
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
-
Figura 11. Impacto de textline_orientation en CER
+
Fuente: Elaboración propia.
Explicación técnica:
@@ -5442,8 +5451,8 @@ Configuración óptima: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)
-
Figura 12. 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.
@@ -5478,6 +5487,11 @@ Configuración óptima: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.
Figura 13. Evolución del CER a través del estudio
+
Fuente: Elaboración propia.
+Leyenda: El mejor trial alcanza CER 0.79% (objetivo cumplido). La validación sobre dataset completo muestra CER 7.72%, evidenciando sobreajuste al subconjunto de optimización.
El incremento del CER de 0.79% (5 páginas) a 7.72% (45 páginas) evidencia sobreajuste al subconjunto de optimización. Este fenómeno es esperado cuando se optimiza sobre un subconjunto pequeño y se valida sobre el dataset completo con mayor diversidad de layouts.
Tabla 45. Verificación del objetivo general.
@@ -5492,6 +5506,11 @@ 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.
Figura 14. Ranking de importancia de hiperparámetros
+
Fuente: Elaboración propia.
+Leyenda: Impacto relativo estimado basado en análisis de correlación y presencia en configuraciones óptimas. textline_orientation es el parámetro más crítico.
Por qué es tan importante:
El clasificador de orientación de línea resuelve un problema fundamental en documentos con layouts complejos: determinar el orden correcto de lectura. Sin este clasificador:
@@ -5597,6 +5616,11 @@ Configuración óptima: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.
Figura 15. Tiempo de procesamiento: CPU vs GPU (segundos/página)
+
Fuente: Elaboración propia.
+Leyenda: Aceleración de 82× con GPU. El procesamiento de una página pasa de 69.4s (CPU) a 0.84s (GPU).
La aceleración de 82× obtenida con GPU transforma la viabilidad del enfoque:
· Optimización en CPU (6.4 horas): Viable pero lento para iteraciones rápidas
· Optimización en GPU (1.5 horas): Permite explorar más configuraciones y realizar múltiples experimentos
@@ -5642,7 +5666,7 @@ y trabajo futuroA lo largo
La principal contribución de este trabajo es una metodología reproducible para la optimización de hiperparámetros OCR. El proceso completo —desde la preparación del conjunto de datos hasta la validación de la configuración óptima— queda documentado y es replicable mediante las herramientas Ray Tune y Optuna. En segundo lugar, el análisis sistemático de los hiperparámetros de PaddleOCR constituye una contribución al conocimiento disponible sobre este motor OCR. Mediante el cálculo de correlaciones y análisis comparativo, se cuantifica el impacto de cada parámetro configurable, información que puede orientar futuros trabajos de optimización. Como resultado práctico, se aporta una configuración validada específicamente para documentos académicos en español. Aunque la generalización a otros tipos de documentos requiere validación adicional, esta configuración representa un punto de partida sólido para aplicaciones en el ámbito hispanohablante. Por último, todo el código fuente, las imágenes Docker y los datos experimentales están disponibles públicamente en el repositorio GitHub del proyecto, facilitando así la reproducción, verificación y extensión de este trabajo por parte de otros investigadores. Por último, todo el código fuente, las imágenes Docker y los datos experimentales están disponibles públicamente en el repositorio del proyecto, facilitando así la reproducción, verificación y extensión de este trabajo por parte de otros investigadores. Es necesario reconocer varias limitaciones que condicionan el alcance de las conclusiones presentadas. En primer lugar, todos los experimentos se realizaron sobre un único tipo de documento: textos académicos de UNIR. La generalización a otros formatos —facturas, formularios, documentos manuscritos— requeriría validación adicional con conjuntos de datos específicos. El tamaño del corpus constituye otra limitación relevante. Con 45 páginas, el conjunto de datos es modesto para extraer conclusiones estadísticamente robustas. Además, el subconjunto de optimización de tan solo 5 páginas resultó insuficiente para evitar el sobreajuste, como evidencia la brecha entre el CER del mejor trial (0.79%) y el resultado sobre el conjunto completo (7.72%). · Dataset: Imágenes y textos de referencia utilizados · Resultados: Archivos CSV con los resultados de los 64 trials por servicio Figura 11. Estructura del repositorio MastersThesis Figura 16. Estructura del repositorio MastersThesis Fuente: Elaboración propia. Tabla 56. Descripción de directorios principales. 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. Los resultados detallados de las evaluaciones y ajustes de hiperparámetros se encuentran en: · Métricas Generales - Comparativa de los tres servicios · PaddleOCR - Mejor precisión (8.85% CER baseline, 7.72% optimizado, 0.79% mejor trial) · DocTR - Más rápido (0.50s/página) · 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% Esta sección presenta los resultados completos de las evaluaciones comparativas y del ajuste de hiperparámetros realizado con Ray Tune sobre los tres servicios OCR evaluados. Tabla 60. 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: Elaboración propia. 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 61. 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: Elaboración propia. 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 grande (15-20 páginas) mejoraría la generalización. La siguiente configuración logró el mejor rendimiento en el ajuste de hiperparámetros: Hallazgos clave: · textline_orientation=true: Crítico para documentos con layouts mixtos · use_doc_orientation_classify=true: Mejora detección de orientación · use_doc_unwarping=false: Innecesario para PDFs digitales · text_det_thresh bajo (0.0462): Detección más sensible mejora resultados Tabla 62. Comparación de rendimiento CPU vs GPU (PaddleOCR). Métrica CPU GPU (RTX 3060) Aceleración Tiempo/Página 69.4s 0.55s 126x más rápido Mejor CER 1.15% 0.79% GPU mejor 45 páginas ~52 min ~25 seg 126x más rápido Fuente: Elaboración propia. Tabla 63. 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 (~5%) 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: Elaboración propia. Los resultados crudos de los 64 trials por servicio están disponibles en el repositorio: Tabla 64. Ubicación de archivos de resultados. Servicio Archivo CSV PaddleOCR DocTR EasyOCR Fuente: Elaboración propia.Limitaciones del Trabajo
A.2 Estructura del Repositorio
-

A.7 Métricas de Rendimiento
-Resumen de Resultados
-Comparativa General de Servicios
+Resultados de Ajuste de Hiperparámetros
+Configuración Óptima PaddleOCR
+{
+ "use_doc_orientation_classify": true,
+ "use_doc_unwarping": false,
+ "textline_orientation": true,
+ "text_det_thresh": 0.0462,
+ "text_det_box_thresh": 0.4862,
+ "text_det_unclip_ratio": 0.0,
+ "text_rec_score_thresh": 0.5658
+}
+Rendimiento CPU vs GPU
+Análisis de Errores por Servicio
+Archivos de Resultados
+A.8 Licencia