Documentation review. #5
@@ -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"
|
- Titles should describe the diagram content, not generic "Diagrama N"
|
||||||
- Verify theme is applied to all diagrams in `docs/*.md`
|
- 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
|
### Files to Review
|
||||||
- `docs/00_resumen.md` - Resumen/Abstract
|
- `docs/00_resumen.md` - Resumen/Abstract
|
||||||
- `docs/03_objetivos_metodologia.md` - Objectives
|
- `docs/03_objetivos_metodologia.md` - Objectives
|
||||||
|
|||||||
@@ -21,6 +21,11 @@ source .venv/bin/activate && python3 generate_mermaid_figures.py
|
|||||||
**Input:** Mermaid code blocks from `docs/*.md`
|
**Input:** Mermaid code blocks from `docs/*.md`
|
||||||
**Output:** `thesis_output/figures/figura_*.png` and `figures_manifest.json`
|
**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
|
### Step 2: Apply Content to UNIR Template
|
||||||
|
|
||||||
Run the content application script using the virtual environment:
|
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:
|
If scripts fail, check that dependencies are installed:
|
||||||
```bash
|
```bash
|
||||||
# Python dependencies (in .venv)
|
# Python dependencies (in .venv)
|
||||||
source .venv/bin/activate && pip install beautifulsoup4
|
source .venv/bin/activate && pip install beautifulsoup4 cairosvg
|
||||||
|
|
||||||
# Mermaid CLI for figure generation
|
# Mermaid CLI for figure generation
|
||||||
npm install @mermaid-js/mermaid-cli
|
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
|
### Error Handling
|
||||||
|
|
||||||
- If `generate_mermaid_figures.py` fails: Check mmdc (mermaid-cli) is installed
|
- If `generate_mermaid_figures.py` fails: Check mmdc (mermaid-cli) is installed
|
||||||
|
|||||||
@@ -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.
|
**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 |
|
| 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.
|
**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 |
|
| 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:
|
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 |
|
| 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).*
|
*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 |
|
| 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).*
|
*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 |
|
| Parámetro | Descripción | Impacto |
|
||||||
|-----------|-------------|---------|
|
|-----------|-------------|---------|
|
||||||
@@ -359,7 +359,7 @@ DocTR (Document Text Recognition) es una biblioteca desarrollada por Mindee (202
|
|||||||
|
|
||||||
#### Comparativa Detallada de Soluciones
|
#### 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 |
|
| 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).*
|
*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 |
|
| 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:
|
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:
|
Donde:
|
||||||
- $\lambda$ es un vector de hiperparámetros
|
- $\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.
|
**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 |
|
| 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.
|
**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 |
|
| Trabajo | Enfoque | Contribución |
|
||||||
|---------|---------|--------------|
|
|---------|---------|--------------|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ La motivación presentada en el capítulo anterior se traduce ahora en objetivos
|
|||||||
|
|
||||||
### Justificación SMART del Objetivo General
|
### Justificación SMART del Objetivo General
|
||||||
|
|
||||||
**Tabla 4.** *Justificación SMART del objetivo general.*
|
**Tabla 13.** *Justificación SMART del objetivo general.*
|
||||||
|
|
||||||
| Criterio | Cumplimiento |
|
| Criterio | Cumplimiento |
|
||||||
|----------|--------------|
|
|----------|--------------|
|
||||||
@@ -124,7 +124,7 @@ Se implementó una clase Python para cargar pares imagen-texto que retorna tupla
|
|||||||
|
|
||||||
#### Modelos Evaluados
|
#### 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 |
|
| 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
|
#### 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 |
|
| 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
|
#### Hardware
|
||||||
|
|
||||||
**Tabla 7.** *Especificaciones de hardware del entorno de desarrollo.*
|
**Tabla 16.** *Especificaciones de hardware del entorno de desarrollo.*
|
||||||
|
|
||||||
| Componente | Especificación |
|
| Componente | Especificación |
|
||||||
|------------|----------------|
|
|------------|----------------|
|
||||||
@@ -219,7 +219,7 @@ El servicio OCR expone una API REST que retorna métricas en formato JSON:
|
|||||||
|
|
||||||
#### Software
|
#### Software
|
||||||
|
|
||||||
**Tabla 8.** *Versiones de software utilizadas.*
|
**Tabla 17.** *Versiones de software utilizadas.*
|
||||||
|
|
||||||
| Componente | Versión |
|
| 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.
|
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 |
|
| 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:
|
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 |
|
| Tarea | Tiempo GPU | Costo AWS | Costo Colab Pro |
|
||||||
|-------|------------|-----------|-----------------|
|
|-------|------------|-----------|-----------------|
|
||||||
|
|||||||
@@ -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:
|
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 |
|
| 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/`.
|
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 |
|
| 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.
|
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 |
|
| 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:
|
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 |
|
| 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:
|
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 |
|
| 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:
|
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 |
|
| 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.
|
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 |
|
| Imagen | Propósito | Base | Puerto |
|
||||||
|--------|-----------|------|--------|
|
|--------|-----------|------|--------|
|
||||||
@@ -397,7 +397,7 @@ flowchart LR
|
|||||||
|
|
||||||
El proyecto incluye múltiples archivos Docker Compose para diferentes escenarios de uso:
|
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 |
|
| 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:
|
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 |
|
| 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:
|
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 |
|
| 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).
|
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 |
|
| 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).
|
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 |
|
| 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:
|
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 |
|
| 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`):
|
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) |
|
| 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
|
#### 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 |
|
| 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`.*
|
*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.
|
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
|
#### Mejor Configuración Encontrada
|
||||||
@@ -657,7 +675,7 @@ Configuración óptima:
|
|||||||
text_rec_score_thresh: 0.5658
|
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 |
|
| 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:
|
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 |
|
| 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).*
|
*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 |
|
| 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).*
|
*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.
|
**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
|
#### Impacto del Parámetro textline_orientation
|
||||||
|
|
||||||
El parámetro booleano `textline_orientation` demostró tener el mayor impacto en el rendimiento:
|
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 |
|
| textline_orientation | CER Medio | CER Std | WER Medio | N trials |
|
||||||
|---------------------|-----------|---------|-----------|----------|
|
|---------------------|-----------|---------|-----------|----------|
|
||||||
@@ -729,6 +768,8 @@ config:
|
|||||||
primaryTextColor: "#404040"
|
primaryTextColor: "#404040"
|
||||||
primaryBorderColor: "#0098CD"
|
primaryBorderColor: "#0098CD"
|
||||||
lineColor: "#0098CD"
|
lineColor: "#0098CD"
|
||||||
|
xyChart:
|
||||||
|
plotColorPalette: "#0098CD"
|
||||||
---
|
---
|
||||||
xychart-beta
|
xychart-beta
|
||||||
x-axis ["textline_orientation=False", "textline_orientation=True"]
|
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:
|
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 |
|
| 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`.
|
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 |
|
| 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
|
#### 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 |
|
| Forma de Medición | CER | WER |
|
||||||
|-------------------|-----|-----|
|
|-------------------|-----|-----|
|
||||||
@@ -807,6 +848,8 @@ config:
|
|||||||
primaryTextColor: "#404040"
|
primaryTextColor: "#404040"
|
||||||
primaryBorderColor: "#0098CD"
|
primaryBorderColor: "#0098CD"
|
||||||
lineColor: "#0098CD"
|
lineColor: "#0098CD"
|
||||||
|
xyChart:
|
||||||
|
plotColorPalette: "#0098CD"
|
||||||
---
|
---
|
||||||
xychart-beta
|
xychart-beta
|
||||||
x-axis ["CER Baseline", "CER Optimizado", "WER Baseline", "WER Optimizado"]
|
x-axis ["CER Baseline", "CER Optimizado", "WER Baseline", "WER Optimizado"]
|
||||||
@@ -835,7 +878,7 @@ xychart-beta
|
|||||||
|
|
||||||
### Tiempo de Ejecución
|
### 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 |
|
| Métrica | Valor |
|
||||||
|---------|-------|
|
|---------|-------|
|
||||||
@@ -871,7 +914,7 @@ Los resultados obtenidos en las secciones anteriores requieren un análisis que
|
|||||||
|
|
||||||
#### Progresión del Rendimiento
|
#### 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 |
|
| 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.*
|
*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.
|
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
|
#### 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 |
|
| 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:
|
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 |
|
| 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).*
|
*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
|
#### Análisis del Parámetro textline_orientation
|
||||||
|
|
||||||
**Por qué es tan importante:**
|
**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
|
#### 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 |
|
| 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
|
#### 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 |
|
| 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
|
### 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 |
|
| 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:
|
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 |
|
| 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
|
#### Configuración del Entorno GPU
|
||||||
|
|
||||||
**Tabla 41.** *Especificaciones del entorno GPU utilizado.*
|
**Tabla 50.** *Especificaciones del entorno GPU utilizado.*
|
||||||
|
|
||||||
| Componente | Especificación |
|
| 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).
|
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 |
|
| 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).*
|
*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:
|
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 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
|
- **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.
|
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 |
|
| Modelo | VRAM Requerida | Resultado | Recomendación |
|
||||||
|--------|----------------|-----------|---------------|
|
|--------|----------------|-----------|---------------|
|
||||||
|
|||||||
@@ -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:
|
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 |
|
| 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.
|
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
|
### Limitaciones del Trabajo
|
||||||
|
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ flowchart TB
|
|||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
**Tabla A5.** *Descripción de directorios principales.*
|
**Tabla A1.** *Descripción de directorios principales.*
|
||||||
|
|
||||||
| Directorio | Contenido |
|
| Directorio | Contenido |
|
||||||
|------------|-----------|
|
|------------|-----------|
|
||||||
@@ -96,7 +96,7 @@ flowchart TB
|
|||||||
|
|
||||||
### Sistema de Desarrollo
|
### Sistema de Desarrollo
|
||||||
|
|
||||||
**Tabla A1.** *Especificaciones del sistema de desarrollo.*
|
**Tabla A2.** *Especificaciones del sistema de desarrollo.*
|
||||||
|
|
||||||
| Componente | Especificación |
|
| Componente | Especificación |
|
||||||
|------------|----------------|
|
|------------|----------------|
|
||||||
@@ -110,7 +110,7 @@ flowchart TB
|
|||||||
|
|
||||||
### Dependencias
|
### Dependencias
|
||||||
|
|
||||||
**Tabla A2.** *Dependencias del proyecto.*
|
**Tabla A3.** *Dependencias del proyecto.*
|
||||||
|
|
||||||
| Componente | Versión |
|
| Componente | Versión |
|
||||||
|------------|---------|
|
|------------|---------|
|
||||||
@@ -231,7 +231,7 @@ analyze_results(results, prefix='raytune_paddle', config_keys=PADDLE_OCR_CONFIG_
|
|||||||
|
|
||||||
### Servicios y Puertos
|
### Servicios y Puertos
|
||||||
|
|
||||||
**Tabla A3.** *Servicios Docker y puertos.*
|
**Tabla A4.** *Servicios Docker y puertos.*
|
||||||
|
|
||||||
| Servicio | Puerto | Script de Ajuste | Nota |
|
| 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
|
## 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
|
### Comparativa General de 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
|
|
||||||
|
|
||||||
### 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 |
|
*Fuente: Benchmark realizado el 2026-01-19. Elaboración propia.*
|
||||||
|----------|----------|--------------|--------|
|
|
||||||
| **PaddleOCR** | 8.85% | **7.72%** | 12.8% |
|
**Ganador:** PaddleOCR (Mobile) - Mejor precisión (7.76% CER) con velocidad competitiva y mínimo consumo de VRAM.
|
||||||
| DocTR | 12.06% | 12.07% | 0% |
|
|
||||||
| EasyOCR | 11.23% | 11.14% | 0.8% |
|
### 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.*
|
*Fuente: Elaboración propia.*
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
### Comparación de Precisión (CER - menor es mejor)
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
theme: base
|
||||||
|
themeVariables:
|
||||||
|
primaryColor: "#E6F4F9"
|
||||||
|
primaryTextColor: "#404040"
|
||||||
|
primaryBorderColor: "#0098CD"
|
||||||
|
lineColor: "#0098CD"
|
||||||
|
xyChart:
|
||||||
|
plotColorPalette: "#0098CD"
|
||||||
|
---
|
||||||
xychart-beta
|
xychart-beta
|
||||||
title "Tasa de Error de Caracteres por Servicio"
|
title "Tasa de Error de Caracteres por Servicio"
|
||||||
x-axis ["PaddleOCR", "EasyOCR", "DocTR"]
|
x-axis ["PaddleOCR", "EasyOCR", "DocTR"]
|
||||||
@@ -85,6 +96,17 @@ xychart-beta
|
|||||||
### Comparación de Velocidad (Tiempo por Página)
|
### Comparación de Velocidad (Tiempo por Página)
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
theme: base
|
||||||
|
themeVariables:
|
||||||
|
primaryColor: "#E6F4F9"
|
||||||
|
primaryTextColor: "#404040"
|
||||||
|
primaryBorderColor: "#0098CD"
|
||||||
|
lineColor: "#0098CD"
|
||||||
|
xyChart:
|
||||||
|
plotColorPalette: "#0098CD"
|
||||||
|
---
|
||||||
xychart-beta
|
xychart-beta
|
||||||
title "Tiempo de Procesamiento por Página (segundos)"
|
title "Tiempo de Procesamiento por Página (segundos)"
|
||||||
x-axis ["DocTR", "PaddleOCR", "EasyOCR"]
|
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** |
|
| **45 páginas** | ~52 min | ~25 seg | **126x más rápido** |
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
|
---
|
||||||
|
config:
|
||||||
|
theme: base
|
||||||
|
themeVariables:
|
||||||
|
primaryColor: "#E6F4F9"
|
||||||
|
primaryTextColor: "#404040"
|
||||||
|
primaryBorderColor: "#0098CD"
|
||||||
|
lineColor: "#0098CD"
|
||||||
|
xyChart:
|
||||||
|
plotColorPalette: "#0098CD"
|
||||||
|
---
|
||||||
xychart-beta
|
xychart-beta
|
||||||
title "Tiempo de Procesamiento por Página: CPU vs GPU"
|
title "Tiempo de Procesamiento por Página: CPU vs GPU"
|
||||||
x-axis ["CPU", "GPU (RTX 3060)"]
|
x-axis ["CPU", "GPU (RTX 3060)"]
|
||||||
|
|||||||
@@ -6,10 +6,18 @@ import re
|
|||||||
import subprocess
|
import subprocess
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
import cairosvg
|
||||||
|
|
||||||
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
DOCS_DIR = os.path.join(BASE_DIR, 'docs')
|
DOCS_DIR = os.path.join(BASE_DIR, 'docs')
|
||||||
OUTPUT_DIR = os.path.join(BASE_DIR, 'thesis_output/figures')
|
OUTPUT_DIR = os.path.join(BASE_DIR, 'thesis_output/figures')
|
||||||
MMDC = os.path.join(BASE_DIR, 'node_modules/.bin/mmdc')
|
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():
|
def extract_mermaid_diagrams():
|
||||||
"""Extract all mermaid diagrams from markdown files."""
|
"""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')
|
temp_file = os.path.join(OUTPUT_DIR, f'temp_{diagram["index"]}.mmd')
|
||||||
output_file = os.path.join(OUTPUT_DIR, f'figura_{diagram["index"]}.png')
|
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:
|
with open(temp_file, 'w', encoding='utf-8') as f:
|
||||||
f.write(diagram['code'])
|
f.write(diagram['code'])
|
||||||
|
|
||||||
# Convert using mmdc with high resolution for clarity
|
|
||||||
try:
|
try:
|
||||||
result = subprocess.run(
|
if is_bar_chart:
|
||||||
[MMDC, '-i', temp_file, '-o', output_file, '-b', 'white', '-w', '1600', '-s', '3'],
|
# For bar charts: generate SVG, fix colors, convert to PNG
|
||||||
capture_output=True,
|
svg_file = os.path.join(OUTPUT_DIR, f'temp_{diagram["index"]}.svg')
|
||||||
text=True,
|
|
||||||
timeout=60
|
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):
|
if os.path.exists(output_file):
|
||||||
print(f"✓ Generated: figura_{diagram['index']}.png - {diagram['title']}")
|
print(f"✓ Generated: figura_{diagram['index']}.png - {diagram['title']}")
|
||||||
|
|||||||
12
mermaid.config.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"theme": "base",
|
||||||
|
"themeVariables": {
|
||||||
|
"primaryColor": "#E6F4F9",
|
||||||
|
"primaryTextColor": "#404040",
|
||||||
|
"primaryBorderColor": "#0098CD",
|
||||||
|
"lineColor": "#0098CD"
|
||||||
|
},
|
||||||
|
"xyChart": {
|
||||||
|
"plotColorPalette": "#0098CD"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 44 KiB |
BIN
thesis_output/figures/figura_12.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
thesis_output/figures/figura_13.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
thesis_output/figures/figura_14.png
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
thesis_output/figures/figura_15.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
thesis_output/figures/figura_16.png
Normal file
|
After Width: | Height: | Size: 198 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 127 KiB |
@@ -41,17 +41,42 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"file": "figura_9.png",
|
"file": "figura_9.png",
|
||||||
"title": "Impacto de textline_orientation en CER",
|
"title": "Distribución de trials por rango de CER",
|
||||||
"index": 9
|
"index": 9
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"file": "figura_10.png",
|
"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
|
"index": 10
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"file": "figura_11.png",
|
"file": "figura_11.png",
|
||||||
"title": "Estructura del repositorio MastersThesis",
|
"title": "Impacto de textline_orientation en CER",
|
||||||
"index": 11
|
"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
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||