Documentation review and data consistency.
Some checks failed
build_docker / essential (push) Successful in 0s
build_docker / build_paddle_ocr (push) Successful in 4m57s
build_docker / build_raytune (push) Has been cancelled
build_docker / build_easyocr_gpu (push) Has been cancelled
build_docker / build_doctr (push) Has been cancelled
build_docker / build_doctr_gpu (push) Has been cancelled
build_docker / build_paddle_ocr_gpu (push) Has been cancelled
build_docker / build_easyocr (push) Has been cancelled
Some checks failed
build_docker / essential (push) Successful in 0s
build_docker / build_paddle_ocr (push) Successful in 4m57s
build_docker / build_raytune (push) Has been cancelled
build_docker / build_easyocr_gpu (push) Has been cancelled
build_docker / build_doctr (push) Has been cancelled
build_docker / build_doctr_gpu (push) Has been cancelled
build_docker / build_paddle_ocr_gpu (push) Has been cancelled
build_docker / build_easyocr (push) Has been cancelled
This commit is contained in:
@@ -1,18 +1,18 @@
|
||||
# Desarrollo específico de la contribución
|
||||
|
||||
El presente capítulo constituye el núcleo técnico de este trabajo fin de máster. Siguiendo la estructura de "Comparativa de soluciones" establecida por las instrucciones de UNIR, se desarrollan tres fases interrelacionadas: el planteamiento y ejecución del benchmark comparativo, el proceso de optimización de hiperparámetros mediante Ray Tune, y finalmente el análisis e interpretación de los resultados obtenidos.
|
||||
El presente capítulo constituye el núcleo técnico de este trabajo fin de máster. Siguiendo la estructura de "Comparativa de soluciones" establecida por las instrucciones de UNIR, se desarrollan tres fases interrelacionadas. Estas fases son tres: planteamiento y ejecución del benchmark comparativo, optimización de hiperparámetros mediante Ray Tune, y análisis e interpretación de los resultados.
|
||||
|
||||
## Planteamiento de la comparativa
|
||||
|
||||
### Introducción
|
||||
|
||||
Antes de abordar la optimización de hiperparámetros, era necesario seleccionar el motor OCR que serviría como base para la experimentación. Para ello, se realizó un estudio comparativo entre tres soluciones de código abierto representativas del estado del arte: EasyOCR, PaddleOCR y DocTR. Los experimentos, documentados en el notebook `ocr_benchmark_notebook.ipynb` del repositorio, permitieron identificar el modelo más prometedor para la fase de optimización posterior.
|
||||
Antes de abordar la optimización de hiperparámetros, era necesario seleccionar el motor OCR que serviría como base para la experimentación. Para ello, se realizó un estudio comparativo entre tres soluciones de código abierto representativas del estado del arte: EasyOCR, PaddleOCR y DocTR. Los experimentos, documentados en los informes de métricas y en los CSV de resultados del repositorio, permitieron identificar el modelo más prometedor para la fase de optimización posterior.
|
||||
|
||||
### Identificación del Problema
|
||||
|
||||
El reconocimiento óptico de caracteres en documentos académicos en español presenta desafíos específicos que la literatura no ha abordado en profundidad. A diferencia de los benchmarks estándar en inglés, los documentos académicos hispanohablantes combinan características ortográficas propias —acentos, eñes, diéresis y signos de puntuación invertidos— con layouts estructuralmente complejos.
|
||||
El reconocimiento óptico de caracteres en documentos académicos en español presenta desafíos específicos que la literatura no ha abordado en profundidad. A diferencia de los benchmarks estándar en inglés, los documentos académicos hispanohablantes combinan características ortográficas propias, como acentos, eñes, diéresis y signos de puntuación invertidos, con una estructura sencilla basada en índice y encabezados.
|
||||
|
||||
Los documentos académicos típicos incluyen texto corrido entremezclado con tablas, listas numeradas, encabezados multinivel y notas al pie, lo que complica significativamente la tarea de ordenación del texto reconocido. A esto se suma el uso de tipografía profesional con múltiples fuentes, tamaños y estilos (negrita, cursiva), que puede confundir a los modelos de reconocimiento. Aunque los PDFs digitales suelen tener alta calidad, pueden contener artefactos de compresión que degradan la legibilidad de caracteres pequeños o de bajo contraste.
|
||||
Los documentos académicos típicos incluyen texto corrido con índice, listas numeradas, encabezados multinivel y notas al pie, lo que complica la tarea de ordenación del texto reconocido. A esto se suma el uso de tipografía profesional con múltiples fuentes, tamaños y estilos (negrita, cursiva), que puede confundir a los modelos de reconocimiento. Aunque los PDFs digitales suelen tener alta calidad, pueden contener artefactos de compresión que degradan la legibilidad de caracteres pequeños o de bajo contraste.
|
||||
|
||||
### Alternativas Evaluadas
|
||||
|
||||
@@ -25,10 +25,9 @@ Se seleccionaron tres soluciones OCR de código abierto representativas del esta
|
||||
| EasyOCR | Jaided AI | Última estable | Popularidad, facilidad de uso |
|
||||
| PaddleOCR | Baidu | PP-OCRv5 | Estado del arte industrial |
|
||||
| DocTR | Mindee | Última estable | Orientación académica |
|
||||
Fuente: [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md).
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
|
||||
**Imágenes Docker disponibles en el registro del proyecto:**
|
||||
Imágenes Docker disponibles en el registro del proyecto:
|
||||
- PaddleOCR: [`seryus.ddns.net/unir/paddle-ocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/paddle-ocr-gpu/latest), [`seryus.ddns.net/unir/paddle-ocr-cpu`](https://seryus.ddns.net/unir/-/packages/container/paddle-ocr-cpu/latest)
|
||||
- EasyOCR: [`seryus.ddns.net/unir/easyocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/easyocr-gpu/latest)
|
||||
- DocTR: [`seryus.ddns.net/unir/doctr-gpu`](https://seryus.ddns.net/unir/-/packages/container/doctr-gpu/latest)
|
||||
@@ -47,7 +46,7 @@ Los criterios establecidos para evaluar las soluciones fueron:
|
||||
|
||||
#### Dataset de Evaluación
|
||||
|
||||
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/`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/instructions/).
|
||||
|
||||
**Tabla 21.** *Características del dataset de evaluación inicial.*
|
||||
|
||||
@@ -59,55 +58,55 @@ Se utilizó el documento "Instrucciones para la redacción y elaboración del TF
|
||||
| Idioma principal | Español |
|
||||
| Resolución de conversión | 300 DPI |
|
||||
| Formato de imagen | PNG |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
Fuente: [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md).
|
||||
|
||||
#### Proceso de Conversión
|
||||
|
||||
La conversión del PDF a imágenes se realizó mediante PyMuPDF (fitz) a 300 DPI, resolución estándar para OCR que proporciona suficiente detalle para caracteres pequeños sin generar archivos excesivamente grandes. La implementación está disponible en `src/ocr_benchmark_notebook.ipynb` (ver Anexo A).
|
||||
La conversión del PDF a imágenes se realizó mediante PyMuPDF (fitz) a 300 DPI, resolución estándar para OCR que proporciona suficiente detalle para caracteres pequeños sin generar archivos excesivamente grandes. La implementación está disponible en [`src/prepare_dataset.ipynb`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/prepare_dataset.ipynb).
|
||||
|
||||
#### Extracción del Ground Truth
|
||||
|
||||
El texto de referencia se extrajo directamente del PDF mediante PyMuPDF, preservando la estructura de líneas del documento original. Esta aproximación puede introducir errores en layouts muy complejos (tablas anidadas, texto en columnas). La implementación está disponible en `src/ocr_benchmark_notebook.ipynb` (ver Anexo A).
|
||||
El texto de referencia se extrajo directamente del PDF mediante PyMuPDF, preservando la estructura de líneas del documento original. Esta aproximación puede introducir errores en el orden de lectura cuando hay secciones con encabezados, listas o saltos de línea, por lo que se documenta junto al pipeline de preparación en [`src/prepare_dataset.ipynb`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/prepare_dataset.ipynb). Para la comparación entre motores, las salidas se guardan en `debugset/` al activar `save_output=True`, y el flujo de trabajo se describe en [`src/README.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/README.md) y en los README de cada servicio: [`src/paddle_ocr/README.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/README.md), [`src/easyocr_service/README.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service/README.md), [`src/doctr_service/README.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/README.md).
|
||||
|
||||
#### Configuración de los Modelos
|
||||
|
||||
La configuración de cada modelo se detalla en `src/ocr_benchmark_notebook.ipynb` (ver Anexo A):
|
||||
La configuración de cada modelo se detalla en los README de cada servicio y sus ficheros de dependencias:
|
||||
|
||||
- **EasyOCR**: Configurado con soporte para español e inglés, permitiendo reconocer palabras en ambos idiomas que puedan aparecer en documentos académicos (referencias, términos técnicos).
|
||||
|
||||
- **PaddleOCR (PP-OCRv5)**: Se utilizaron los modelos "server" (PP-OCRv5_server_det y PP-OCRv5_server_rec) que ofrecen mayor precisión a costa de mayor tiempo de inferencia. La versión utilizada fue PaddleOCR 3.2.0.
|
||||
- **PaddleOCR (PP-OCRv5)**: Se utilizaron los modelos Mobile, adecuados para la VRAM disponible. Los modelos Server se probaron y produjeron OOM en este hardware. La versión utilizada fue PaddleOCR 3.3.2.
|
||||
|
||||
- **DocTR**: Se seleccionaron las arquitecturas db_resnet50 para detección y sar_resnet31 para reconocimiento, representando una configuración de alta precisión.
|
||||
|
||||
Fuente: [`src/paddle_ocr/README.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/README.md), [`src/easyocr_service/README.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service/README.md), [`src/doctr_service/README.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/README.md), [`src/paddle_ocr/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/requirements.txt), [`src/easyocr_service/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service/requirements.txt), [`src/doctr_service/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/requirements.txt).
|
||||
|
||||
#### Métricas de Evaluación
|
||||
|
||||
Se utilizó la biblioteca `jiwer` para calcular CER y WER de manera estandarizada. La normalización a minúsculas y eliminación de espacios extremos asegura una comparación justa que no penaliza diferencias de capitalización. La implementación está disponible en `src/ocr_benchmark_notebook.ipynb` (ver Anexo A).
|
||||
Se utilizó la biblioteca `jiwer` para calcular CER y WER de manera estandarizada. La normalización a minúsculas y eliminación de espacios extremos asegura una comparación justa que no penaliza diferencias de capitalización. La implementación está disponible en [`src/paddle_ocr/paddle_ocr_tuning_rest.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/paddle_ocr_tuning_rest.py), [`src/easyocr_service/easyocr_tuning_rest.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service/easyocr_tuning_rest.py) y [`src/doctr_service/doctr_tuning_rest.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/doctr_tuning_rest.py).
|
||||
|
||||
### Resultados del Benchmark
|
||||
|
||||
#### Resultados de PaddleOCR (Configuración Baseline)
|
||||
|
||||
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, en función de los cambios de formato y de la estructura del texto.
|
||||
|
||||
**Tabla 22.** *Variabilidad del CER por tipo de contenido.*
|
||||
**Tabla 22.** *Variabilidad del error por tipo de contenido.*
|
||||
|
||||
| Tipo de contenido | CER aproximado | Observaciones |
|
||||
|-------------------|----------------|---------------|
|
||||
| Texto corrido | ~1.5-2% | Mejor rendimiento |
|
||||
| Texto con listas | ~3-4% | Rendimiento medio |
|
||||
| Tablas | ~5-6% | Mayor dificultad |
|
||||
| Encabezados + notas | ~4-5% | Layouts mixtos |
|
||||
|
||||
*Fuente: Elaboración propia a partir del benchmark.*
|
||||
| Tipo de contenido | Nivel de error | Observaciones |
|
||||
|-------------------|---------------|---------------|
|
||||
| Texto corrido | Bajo | Mejor rendimiento |
|
||||
| Texto con listas | Medio | Rendimiento intermedio |
|
||||
| Índice y encabezados | Medio | Orden de lectura sensible |
|
||||
| Encabezados + notas | Medio | Variación tipográfica |
|
||||
Fuente: Elaboración propia a partir del benchmark.
|
||||
|
||||
**Observaciones del benchmark inicial:**
|
||||
|
||||
1. Las páginas con tablas y layouts complejos presentaron mayor error debido a la dificultad de ordenar correctamente las líneas de texto.
|
||||
1. Las páginas con más cambios de formato y listados presentaron mayor error debido a la dificultad de ordenar correctamente las líneas de texto.
|
||||
|
||||
2. La página con texto corrido continuo obtuvo el mejor resultado (CER ~1.5%), demostrando la capacidad del modelo para texto estándar.
|
||||
2. La página con texto corrido continuo obtuvo el mejor resultado, demostrando la capacidad del modelo para texto estándar.
|
||||
|
||||
3. El promedio general se situó en CER ~5-6%, superando el umbral de aceptabilidad para documentos académicos pero con margen de mejora.
|
||||
3. El promedio general se situó en un rango medio de error, con margen de mejora.
|
||||
|
||||
4. Los errores más frecuentes fueron: confusión de acentos, caracteres duplicados, y errores en signos de puntuación.
|
||||
|
||||
@@ -122,8 +121,7 @@ Los tres modelos evaluados representan diferentes paradigmas de OCR:
|
||||
| **EasyOCR** | End-to-end (det + rec) | CRAFT + CRNN/Transformer | Ligero, fácil de usar, multilingüe |
|
||||
| **PaddleOCR** | End-to-end (det + rec + cls) | DB + SVTR/CRNN | Soporte multilingüe robusto, pipeline configurable |
|
||||
| **DocTR** | End-to-end (det + rec) | DB/LinkNet + CRNN/SAR/ViTSTR | Orientado a investigación, API limpia |
|
||||
|
||||
*Fuente: Documentación oficial de cada herramienta (JaidedAI, 2020; PaddlePaddle, 2024; Mindee, 2021).*
|
||||
Fuente: Documentación oficial de cada herramienta (JaidedAI, 2020; PaddlePaddle, 2024; Mindee, 2021).
|
||||
|
||||
#### Análisis Cualitativo de Errores
|
||||
|
||||
@@ -156,17 +154,16 @@ 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 24.** *Evaluación de criterios de selección.*
|
||||
**Tabla 24.** *Evaluación de criterios de selección (cualitativa).*
|
||||
|
||||
| Criterio | EasyOCR | PaddleOCR | DocTR |
|
||||
|----------|---------|-----------|-------|
|
||||
| CER benchmark | ~6-8% | ~5-6% | ~7-9% |
|
||||
| Configurabilidad | Baja (3 params) | **Alta (>10 params)** | Media (5 params) |
|
||||
| CER benchmark | Medio | **Mejor** | Medio |
|
||||
| Configurabilidad | Baja | **Alta** | Media |
|
||||
| Soporte español | Sí | **Sí (dedicado)** | Limitado |
|
||||
| Documentación | Media | **Alta** | Alta |
|
||||
| Mantenimiento | Medio | **Alto** | Medio |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
Fuente: Elaboración propia a partir del benchmark y la documentación de cada herramienta.
|
||||
|
||||
#### Hiperparámetros Disponibles en PaddleOCR
|
||||
|
||||
@@ -191,8 +188,8 @@ Esta riqueza de configuración permite explorar sistemáticamente el espacio de
|
||||
|
||||
**Se selecciona PaddleOCR (PP-OCRv5)** para la fase de optimización debido a:
|
||||
|
||||
1. **Resultados iniciales prometedores**: CER ~5% en configuración por defecto, con potencial de mejora
|
||||
2. **Alta configurabilidad**: Más de 10 hiperparámetros ajustables en tiempo de inferencia
|
||||
1. **Resultados iniciales prometedores**: Rendimiento base competitivo con margen de mejora
|
||||
2. **Alta configurabilidad**: Múltiples hiperparámetros ajustables en tiempo de inferencia
|
||||
3. **Pipeline modular**: Permite aislar el impacto de cada componente
|
||||
4. **Soporte activo para español**: Modelos específicos y actualizaciones frecuentes
|
||||
5. **Documentación técnica**: Descripción detallada de cada parámetro
|
||||
@@ -203,23 +200,21 @@ Esta riqueza de configuración permite explorar sistemáticamente el espacio de
|
||||
|
||||
2. **Único tipo de documento**: Documentos académicos de UNIR únicamente. Otros tipos de documentos (facturas, formularios, contratos) podrían presentar resultados diferentes.
|
||||
|
||||
3. **Ground truth automático**: El texto de referencia se extrajo programáticamente del PDF, lo cual puede introducir errores en layouts complejos donde el orden de lectura no es evidente.
|
||||
3. **Ground truth automático**: El texto de referencia se extrajo programáticamente del PDF, lo cual puede introducir errores en el orden de lectura cuando hay secciones con encabezados y saltos de línea.
|
||||
|
||||
4. **Ejecución en CPU**: Todos los experimentos se realizaron en CPU, limitando la exploración de configuraciones que podrían beneficiarse de aceleración GPU.
|
||||
4. **Referencia CPU separada**: Los tiempos en CPU se midieron en un experimento independiente y solo se usan como comparación de rendimiento frente a GPU.
|
||||
|
||||
### Síntesis del Benchmark
|
||||
|
||||
El benchmark comparativo ha permitido identificar PaddleOCR como la solución más prometedora para la fase de optimización, gracias a su combinación de rendimiento base aceptable (~5-6% CER), alta configurabilidad del pipeline y documentación técnica completa. Sin embargo, el análisis también reveló limitaciones importantes: el tamaño reducido del benchmark (5 páginas), la restricción a un único tipo de documento, y la extracción automática del ground truth que puede introducir errores en layouts complejos. Estas limitaciones se tendrán en cuenta al interpretar los resultados de la fase de optimización.
|
||||
El benchmark comparativo ha permitido identificar PaddleOCR como la solución más prometedora para la fase de optimización, gracias a su combinación de rendimiento base competitivo, alta configurabilidad del pipeline y documentación técnica completa. Sin embargo, el análisis también reveló limitaciones importantes: el tamaño reducido del benchmark (5 páginas), la restricción a un único tipo de documento, y la extracción automática del ground truth que puede introducir errores en el orden de lectura cuando hay secciones con encabezados y saltos de línea. Estas limitaciones se tendrán en cuenta al interpretar los resultados de la fase de optimización.
|
||||
|
||||
**Fuentes de datos:** `ocr_benchmark_notebook.ipynb` y documentación oficial de PaddleOCR.
|
||||
Fuente: [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md), [`src/results/*.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/*.csv), documentación oficial de PaddleOCR.
|
||||
|
||||
## Desarrollo de la comparativa: Optimización de hiperparámetros
|
||||
|
||||
### Introducción
|
||||
|
||||
Una vez seleccionado PaddleOCR como motor base, el siguiente paso fue explorar sistemáticamente su espacio de configuración para identificar los hiperparámetros que maximizan el rendimiento en documentos académicos en español. Para ello se empleó Ray Tune con el algoritmo de búsqueda Optuna, una combinación que permite explorar eficientemente espacios de búsqueda mixtos (parámetros continuos y categóricos). Los experimentos se implementaron en [`src/run_tuning.py`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/run_tuning.py) con apoyo de la librería [`src/raytune_ocr.py`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/raytune_ocr.py), almacenándose los resultados en [`src/results/`](https://seryus.ddns.net/unir/MastersThesis/-/tree/main/src/results).
|
||||
|
||||
Esta aproximación ofrece ventajas significativas frente al fine-tuning tradicional: no requiere datasets de entrenamiento etiquetados, no modifica los pesos del modelo preentrenado, y puede ejecutarse con hardware de consumo cuando se dispone de aceleración GPU.
|
||||
Una vez seleccionado PaddleOCR como motor base, el siguiente paso fue explorar sistemáticamente su espacio de configuración para identificar los hiperparámetros que maximizan el rendimiento en documentos académicos en español. Para ello se empleó Ray Tune con el algoritmo de búsqueda Optuna, una combinación que permite explorar eficientemente espacios de búsqueda mixtos (parámetros continuos y categóricos). Los experimentos se implementaron en [`src/run_tuning.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/run_tuning.py) con apoyo de la librería [`src/raytune_ocr.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_ocr.py), almacenándose los resultados en [`src/results`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results). Esta aproximación ofrece ventajas significativas frente al fine-tuning tradicional: no requiere datasets de entrenamiento etiquetados, no modifica los pesos del modelo preentrenado, y puede ejecutarse con hardware de consumo cuando se dispone de aceleración GPU.
|
||||
|
||||
### Configuración del Experimento
|
||||
|
||||
@@ -240,8 +235,7 @@ El experimento se ejecutó en el siguiente entorno:
|
||||
| CPU | AMD Ryzen 7 5800H |
|
||||
| RAM | 16 GB DDR4 |
|
||||
| GPU | NVIDIA RTX 3060 Laptop (5.66 GB VRAM) |
|
||||
|
||||
*Fuente: Configuración del entorno de ejecución. Resultados en `src/results/` generados por `src/run_tuning.py`.*
|
||||
Fuente: [`src/paddle_ocr/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/requirements.txt), [`src/raytune/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune/requirements.txt), [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md).
|
||||
|
||||
#### Arquitectura de Ejecución
|
||||
|
||||
@@ -275,7 +269,7 @@ flowchart LR
|
||||
A -.->|"Health check /health"| B
|
||||
```
|
||||
|
||||
La arquitectura containerizada (`src/docker-compose.tuning.*.yml`) ofrece:
|
||||
La arquitectura containerizada [`src/docker-compose.tuning.paddle.yml)`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.paddle.yml))))), [`src/docker-compose.tuning.doctr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.doctr.yml), [`src/docker-compose.tuning.easyocr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.easyocr.yml), [`src/docker-compose.tuning.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.yml)ofrece:
|
||||
1. Aislamiento de dependencias entre Ray Tune y los motores OCR
|
||||
2. Health checks automáticos para asegurar disponibilidad del servicio
|
||||
3. Comunicación via API REST (endpoints `/health` y `/evaluate`)
|
||||
@@ -316,8 +310,7 @@ La infraestructura del proyecto se basa en contenedores Docker para garantizar r
|
||||
| [`seryus.ddns.net/unir/easyocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/easyocr-gpu/latest) | EasyOCR con aceleración GPU | `nvidia/cuda:13.0.2-cudnn-runtime` | 8002* |
|
||||
| [`seryus.ddns.net/unir/doctr-gpu`](https://seryus.ddns.net/unir/-/packages/container/doctr-gpu/latest) | DocTR con aceleración GPU | `nvidia/cuda:13.0.2-cudnn-runtime` | 8003 |
|
||||
| [`seryus.ddns.net/unir/raytune`](https://seryus.ddns.net/unir/-/packages/container/raytune/latest) | Orquestador Ray Tune | `python:3.12-slim` | - |
|
||||
|
||||
*Fuente: Elaboración propia. Dockerfiles disponibles en [`src/paddle_ocr/`](https://seryus.ddns.net/unir/MastersThesis/-/tree/main/src/paddle_ocr), [`src/easyocr_service/`](https://seryus.ddns.net/unir/MastersThesis/-/tree/main/src/easyocr_service), [`src/doctr_service/`](https://seryus.ddns.net/unir/MastersThesis/-/tree/main/src/doctr_service), [`src/raytune/`](https://seryus.ddns.net/unir/MastersThesis/-/tree/main/src/raytune).*
|
||||
Fuente: Elaboración propia. Dockerfiles disponibles en [`src/paddle_ocr`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr), [`src/easyocr_service`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service), [`src/doctr_service`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service), [`src/raytune`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune).
|
||||
|
||||
##### Arquitectura de Microservicios
|
||||
|
||||
@@ -390,7 +383,7 @@ flowchart LR
|
||||
|
||||
**Ventajas de esta estrategia:**
|
||||
1. **Caché de dependencias**: La etapa base (CUDA + dependencias) se cachea y reutiliza
|
||||
2. **Builds rápidos**: Los cambios de código solo reconstruyen la etapa de deploy (~10 segundos)
|
||||
2. **Builds rápidos**: Los cambios de código solo reconstruyen la etapa de deploy
|
||||
3. **Imágenes optimizadas**: Solo se incluyen los archivos necesarios para ejecución
|
||||
|
||||
##### Docker Compose Files
|
||||
@@ -401,12 +394,11 @@ El proyecto incluye múltiples archivos Docker Compose para diferentes escenario
|
||||
|
||||
| Archivo | Propósito | Servicios |
|
||||
|---------|-----------|-----------|
|
||||
| [`docker-compose.tuning.yml`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/docker-compose.tuning.yml) | Optimización principal | RayTune + PaddleOCR + DocTR |
|
||||
| [`docker-compose.tuning.easyocr.yml`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/docker-compose.tuning.easyocr.yml) | Optimización EasyOCR | RayTune + EasyOCR |
|
||||
| [`docker-compose.tuning.paddle.yml`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/docker-compose.tuning.paddle.yml) | Optimización PaddleOCR | RayTune + PaddleOCR |
|
||||
| [`docker-compose.tuning.doctr.yml`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/docker-compose.tuning.doctr.yml) | Optimización DocTR | RayTune + DocTR |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
| [`src/docker-compose.tuning.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.yml)| Optimización principal | RayTune + PaddleOCR + DocTR |
|
||||
| [`src/docker-compose.tuning.easyocr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.easyocr.yml)| Optimización EasyOCR | RayTune + EasyOCR |
|
||||
| [`src/docker-compose.tuning.paddle.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.paddle.yml)| Optimización PaddleOCR | RayTune + PaddleOCR |
|
||||
| [`src/docker-compose.tuning.doctr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.doctr.yml)| Optimización DocTR | RayTune + DocTR |
|
||||
Fuente: [`src/docker-compose.tuning.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.yml), [`src/docker-compose.tuning.easyocr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.easyocr.yml), [`src/docker-compose.tuning.paddle.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.paddle.yml), [`src/docker-compose.tuning.doctr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.doctr.yml).
|
||||
|
||||
> **Nota:** EasyOCR y PaddleOCR utilizan el mismo puerto (8002). Debido a limitaciones de recursos GPU (VRAM insuficiente para ejecutar múltiples modelos OCR simultáneamente), solo se ejecuta un servicio a la vez durante los experimentos. Por esta razón, EasyOCR tiene su propio archivo Docker Compose separado.
|
||||
|
||||
@@ -418,11 +410,10 @@ Se utilizan volúmenes Docker nombrados para persistir los modelos descargados e
|
||||
|
||||
| Volumen | Servicio | Contenido |
|
||||
|---------|----------|-----------|
|
||||
| `paddlex-model-cache` | PaddleOCR | Modelos PP-OCRv5 (~500 MB) |
|
||||
| `easyocr-model-cache` | EasyOCR | Modelos CRAFT + CRNN (~400 MB) |
|
||||
| `doctr-model-cache` | DocTR | Modelos db_resnet50 + crnn_vgg16_bn (~300 MB) |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
| `paddlex-model-cache` | PaddleOCR | Modelos PP-OCRv5 |
|
||||
| `easyocr-model-cache` | EasyOCR | Modelos CRAFT + CRNN |
|
||||
| `doctr-model-cache` | DocTR | Modelos db_resnet50 + crnn_vgg16_bn |
|
||||
Fuente: [`src/docker-compose.tuning.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.yml), [`src/docker-compose.tuning.easyocr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.easyocr.yml), [`src/docker-compose.tuning.paddle.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.paddle.yml), [`src/docker-compose.tuning.doctr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.doctr.yml).
|
||||
|
||||
##### Health Checks y Monitorización
|
||||
|
||||
@@ -442,6 +433,8 @@ Los tiempos de `start_period` varían según el servicio debido al tiempo de car
|
||||
- **EasyOCR**: 120 segundos (carga de modelos CRAFT)
|
||||
- **DocTR**: 180 segundos (modelos ResNet más pesados)
|
||||
|
||||
Fuente: [`src/docker-compose.tuning.paddle.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.paddle.yml), [`src/docker-compose.tuning.easyocr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.easyocr.yml), [`src/docker-compose.tuning.doctr.yml`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/docker-compose.tuning.doctr.yml).
|
||||
|
||||
##### Flujo de Ejecución Completo
|
||||
|
||||
```mermaid
|
||||
@@ -509,9 +502,10 @@ docker compose -f docker-compose.tuning.paddle.yml down
|
||||
```
|
||||
|
||||
Los resultados de los experimentos están disponibles en:
|
||||
- [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/results/raytune_paddle_results_20260119_122609.csv)
|
||||
- [`src/results/raytune_easyocr_results_20260119_120204.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/results/raytune_easyocr_results_20260119_120204.csv)
|
||||
- [`src/results/raytune_doctr_results_20260119_121445.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/results/raytune_doctr_results_20260119_121445.csv)
|
||||
- [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv)
|
||||
- [`src/results/raytune_easyocr_results_20260119_120204.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_easyocr_results_20260119_120204.csv)
|
||||
- [`src/results/raytune_doctr_results_20260119_121445.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_doctr_results_20260119_121445.csv)
|
||||
- [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_paddle_subproc_results_20251207_192320.csv)
|
||||
|
||||
#### Dataset Extendido
|
||||
|
||||
@@ -521,19 +515,18 @@ Para la fase de optimización se extendió el dataset:
|
||||
|
||||
| Característica | Valor |
|
||||
|----------------|-------|
|
||||
| Páginas totales | 24 |
|
||||
| Páginas del dataset completo | 45 |
|
||||
| Páginas por trial | 5 (páginas 5-10) |
|
||||
| Estructura | Carpetas `img/` y `txt/` pareadas |
|
||||
| Resolución | 300 DPI |
|
||||
| Formato imagen | PNG |
|
||||
Fuente: [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md), [`src/prepare_dataset.ipynb`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/prepare_dataset.ipynb).
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
|
||||
La clase `ImageTextDataset` gestiona la carga de pares imagen-texto desde la estructura de carpetas pareadas. La implementación está disponible en el repositorio (ver Anexo A).
|
||||
La clase `ImageTextDataset` gestiona la carga de pares imagen-texto desde la estructura de carpetas pareadas. La implementación está disponible en [`src/paddle_ocr/dataset_manager.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/dataset_manager.py), [`src/easyocr_service/dataset_manager.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service/dataset_manager.py) y [`src/doctr_service/dataset_manager.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/dataset_manager.py).
|
||||
|
||||
#### Espacio de Búsqueda
|
||||
|
||||
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`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune/raytune_ocr.py) (ver Anexo A).
|
||||
|
||||
**Tabla 30.** *Descripción detallada del espacio de búsqueda.*
|
||||
|
||||
@@ -546,8 +539,7 @@ El espacio de búsqueda se definió considerando los hiperparámetros más relev
|
||||
| `text_det_box_thresh` | Continuo | [0.0, 0.7] | Umbral de confianza para cajas detectadas |
|
||||
| `text_det_unclip_ratio` | Fijo | 0.0 | Coeficiente de expansión (no explorado) |
|
||||
| `text_rec_score_thresh` | Continuo | [0.0, 0.7] | Umbral de confianza de reconocimiento |
|
||||
|
||||
*Fuente: Documentación de PaddleOCR.*
|
||||
Fuente: Documentación de PaddleOCR.
|
||||
|
||||
**Justificación del espacio:**
|
||||
|
||||
@@ -559,7 +551,7 @@ El espacio de búsqueda se definió considerando los hiperparámetros más relev
|
||||
|
||||
#### Configuración de Ray Tune
|
||||
|
||||
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`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune/raytune_ocr.py) (ver Anexo A).
|
||||
|
||||
**Tabla 31.** *Parámetros de configuración de Ray Tune.*
|
||||
|
||||
@@ -570,16 +562,11 @@ Se configuró Ray Tune con OptunaSearch como algoritmo de búsqueda, optimizando
|
||||
| Algoritmo | OptunaSearch (TPE) | Eficiente para espacios mixtos |
|
||||
| Número de trials | 64 | Balance entre exploración y tiempo |
|
||||
| Trials concurrentes | 2 | Limitado por memoria disponible |
|
||||
Fuente: [`src/raytune/raytune_ocr.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune/raytune_ocr.py).
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
Elección de 64 trials:
|
||||
|
||||
**Elección de 64 trials:**
|
||||
|
||||
El número de trials se eligió considerando:
|
||||
- Espacio de búsqueda de 7 dimensiones (3 booleanas + 4 continuas)
|
||||
- Tiempo estimado por trial: ~6 minutos
|
||||
- Tiempo total objetivo: <8 horas
|
||||
- Regla empírica: 10× dimensiones = 70 trials mínimo recomendado
|
||||
El número de trials se eligió buscando un equilibrio entre exploración del espacio de búsqueda y tiempo total de ejecución.
|
||||
|
||||
### Resultados de la Optimización
|
||||
|
||||
@@ -587,21 +574,20 @@ El número de trials se eligió considerando:
|
||||
|
||||
El experimento se ejecutó exitosamente con los siguientes resultados globales:
|
||||
|
||||
**Tabla 32.** *Resumen de la ejecución del experimento.*
|
||||
**Tabla 32.** *Resumen de la ejecución del experimento (referencia CPU).*
|
||||
|
||||
| Métrica | Valor |
|
||||
|---------|-------|
|
||||
| Trials completados | 64/64 |
|
||||
| Trials fallidos | 0 |
|
||||
| Tiempo total | ~6.4 horas |
|
||||
| Tiempo medio por trial | 367.72 segundos |
|
||||
| Tiempo total (CPU) | 6.2 horas |
|
||||
| Tiempo medio por trial (CPU) | 347.6 segundos |
|
||||
| Páginas procesadas | 320 (64 trials × 5 páginas) |
|
||||
|
||||
*Fuente: Logs de Ray Tune.*
|
||||
Fuente: [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_paddle_subproc_results_20251207_192320.csv).
|
||||
|
||||
#### Estadísticas Descriptivas
|
||||
|
||||
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`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv):
|
||||
|
||||
**Tabla 33.** *Estadísticas descriptivas de los 64 trials.*
|
||||
|
||||
@@ -613,10 +599,9 @@ Del archivo CSV de resultados (`src/results/raytune_paddle_results_20260119_1226
|
||||
| **min** | 0.79% | 6.80% | 0.56 |
|
||||
| **50%** (mediana) | 0.87% | 8.39% | 0.59 |
|
||||
| **max** | 7.30% | 13.20% | 2.22 |
|
||||
Fuente: [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).
|
||||
|
||||
*Fuente: `src/results/raytune_paddle_results_20260119_122609.csv`.*
|
||||
|
||||
**Observaciones:**
|
||||
Observaciones:
|
||||
|
||||
1. **Baja varianza en CER**: La desviación estándar (2.20%) es similar a la media (2.30%), indicando una distribución relativamente consistente sin valores extremos catastróficos.
|
||||
|
||||
@@ -634,8 +619,9 @@ Del archivo CSV de resultados (`src/results/raytune_paddle_results_20260119_1226
|
||||
| 2% - 5% | 10 | 15.6% |
|
||||
| 5% - 10% | 11 | 17.2% |
|
||||
| > 10% | 0 | 0.0% |
|
||||
Fuente: [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).
|
||||
|
||||
*Fuente: Elaboración propia a partir de `src/results/raytune_paddle_results_20260119_122609.csv`.*
|
||||
**Figura 15.** *Distribución de trials por rango de CER.*
|
||||
|
||||
```mermaid
|
||||
---
|
||||
@@ -655,6 +641,8 @@ pie showData
|
||||
"CER 5-10%" : 11
|
||||
```
|
||||
|
||||
Fuente: [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).
|
||||
|
||||
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
|
||||
@@ -686,33 +674,39 @@ Configuración óptima:
|
||||
| text_det_box_thresh | **0.4862** | 0.6 | -0.114 |
|
||||
| text_det_unclip_ratio | 0.0 | 1.5 | -1.5 (fijado) |
|
||||
| text_rec_score_thresh | **0.5658** | 0.5 | +0.066 |
|
||||
|
||||
*Fuente: 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: [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).
|
||||
|
||||
#### Análisis de Correlación
|
||||
|
||||
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 de configuración (codificados como 0/1 en el caso de booleanos) y las métricas de error:
|
||||
|
||||
**Tabla 36.** *Correlación de parámetros con CER.*
|
||||
|
||||
| Parámetro | Correlación con CER | Interpretación |
|
||||
|-----------|---------------------|----------------|
|
||||
| `text_det_thresh` | **-0.523** | Correlación moderada negativa |
|
||||
| `text_det_box_thresh` | +0.226 | Correlación débil positiva |
|
||||
| `text_rec_score_thresh` | -0.161 | Correlación débil negativa |
|
||||
| `use_doc_unwarping` | **+0.879** | Correlación alta positiva |
|
||||
| `use_doc_orientation_classify` | -0.712 | Correlación alta negativa |
|
||||
| `textline_orientation` | -0.535 | Correlación moderada negativa |
|
||||
| `text_det_thresh` | +0.428 | Correlación moderada positiva |
|
||||
| `text_det_box_thresh` | +0.311 | Correlación moderada positiva |
|
||||
| `text_rec_score_thresh` | -0.268 | Correlación moderada negativa |
|
||||
| `text_det_unclip_ratio` | NaN | Varianza cero (valor fijo) |
|
||||
|
||||
*Fuente: 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: [`src/results/correlations/paddle_correlations.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/correlations/paddle_correlations.csv).
|
||||
|
||||
**Tabla 37.** *Correlación de parámetros con WER.*
|
||||
|
||||
| Parámetro | Correlación con WER | Interpretación |
|
||||
|-----------|---------------------|----------------|
|
||||
| `text_det_thresh` | **-0.521** | Correlación moderada negativa |
|
||||
| `text_det_box_thresh` | +0.227 | Correlación débil positiva |
|
||||
| `text_rec_score_thresh` | -0.173 | Correlación débil negativa |
|
||||
| `use_doc_unwarping` | **+0.744** | Correlación alta positiva |
|
||||
| `use_doc_orientation_classify` | -0.602 | Correlación alta negativa |
|
||||
| `textline_orientation` | -0.591 | Correlación moderada negativa |
|
||||
| `text_det_thresh` | +0.399 | Correlación moderada positiva |
|
||||
| `text_det_box_thresh` | +0.256 | Correlación moderada positiva |
|
||||
| `text_rec_score_thresh` | -0.080 | Correlación débil negativa |
|
||||
| `text_det_unclip_ratio` | NaN | Varianza cero (valor fijo) |
|
||||
Fuente: [`src/results/correlations/paddle_correlations.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/correlations/paddle_correlations.csv).
|
||||
|
||||
*Fuente: 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).*
|
||||
**Figura 16.** *Correlación de hiperparámetros con CER.*
|
||||
|
||||
```mermaid
|
||||
---
|
||||
@@ -727,15 +721,17 @@ config:
|
||||
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]
|
||||
xychart-beta horizontal
|
||||
y-axis "Correlación con CER" -0.8 --> 0.9
|
||||
x-axis ["unwarp", "orient_doc", "orient_line", "det_thresh", "box_thresh", "rec_score"]
|
||||
bar [0.879, -0.712, -0.535, 0.428, 0.311, -0.268]
|
||||
```
|
||||
|
||||
*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).*
|
||||
Fuente: [`src/results/correlations/paddle_correlations.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/correlations/paddle_correlations.csv).
|
||||
|
||||
**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.
|
||||
Leyenda: Valores positivos indican que aumentar el parámetro incrementa el CER. Los parámetros booleanos se codifican como 0/1 para el cálculo de la correlación. Abreviaturas: unwarp = `use_doc_unwarping`, orient_doc = `use_doc_orientation_classify`, orient_line = `textline_orientation`, det_thresh = `text_det_thresh`, box_thresh = `text_det_box_thresh`, rec_score = `text_rec_score_thresh`.
|
||||
|
||||
**Hallazgo clave**: `use_doc_unwarping` presenta la correlación positiva más alta con CER (0.879), lo que indica que activar este módulo incrementa el error en este dataset. En cambio, `use_doc_orientation_classify` y `textline_orientation` tienen correlación negativa, asociada a mejoras cuando están activados.
|
||||
|
||||
#### Impacto del Parámetro textline_orientation
|
||||
|
||||
@@ -745,18 +741,19 @@ El parámetro booleano `textline_orientation` demostró tener el mayor impacto e
|
||||
|
||||
| textline_orientation | CER Medio | CER Std | WER Medio | N trials |
|
||||
|---------------------|-----------|---------|-----------|----------|
|
||||
| True | 3.76% | 7.12% | 12.73% | 32 |
|
||||
| False | 12.40% | 14.93% | 21.71% | 32 |
|
||||
| True | 1.74% | 1.94% | 8.75% | 52 |
|
||||
| False | 4.73% | 1.37% | 11.42% | 12 |
|
||||
Fuente: [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).
|
||||
|
||||
*Fuente: 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).*
|
||||
Interpretación:
|
||||
|
||||
**Interpretación:**
|
||||
1. **Reducción del CER**: Con `textline_orientation=True`, el CER medio es 2.7 veces menor (1.74% vs 4.73%).
|
||||
|
||||
1. **Reducción del CER**: Con `textline_orientation=True`, el CER medio es 3.3 veces menor (3.76% vs 12.40%).
|
||||
2. **Varianza**: La desviación estándar es mayor cuando `textline_orientation=True` (1.94% vs 1.37%), aunque los valores medios siguen siendo mejores.
|
||||
|
||||
2. **Menor varianza**: La desviación estándar también se reduce significativamente (7.12% vs 14.93%), indicando resultados más consistentes.
|
||||
3. **Reducción del CER**: 63.2% cuando se habilita la clasificación de orientación de línea.
|
||||
|
||||
3. **Reducción del CER**: 69.7% cuando se habilita la clasificación de orientación de línea.
|
||||
**Figura 17.** *Impacto de textline_orientation en CER.*
|
||||
|
||||
```mermaid
|
||||
---
|
||||
@@ -774,37 +771,30 @@ config:
|
||||
xychart-beta
|
||||
x-axis ["textline_orientation=False", "textline_orientation=True"]
|
||||
y-axis "CER (%)" 0 --> 15
|
||||
bar [12.40, 3.76]
|
||||
bar [4.73, 1.74]
|
||||
```
|
||||
|
||||
**Explicación técnica:**
|
||||
Fuente: [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).
|
||||
|
||||
El parámetro `textline_orientation` activa un clasificador que determina la orientación de cada línea de texto detectada. Para documentos con layouts mixtos (tablas, encabezados laterales, direcciones postales), este clasificador asegura que el texto se lea en el orden correcto, evitando la mezcla de líneas de diferentes columnas o secciones.
|
||||
Explicación técnica:
|
||||
|
||||
#### Análisis de Fallos Catastróficos
|
||||
El parámetro `textline_orientation` activa un clasificador que determina la orientación de cada línea de texto detectada. Para documentos con índice, encabezados y listas, este clasificador asegura que el texto se lea en el orden correcto, evitando la mezcla de líneas de diferentes secciones.
|
||||
|
||||
Los trials con CER muy alto (>20%) presentaron patrones específicos:
|
||||
#### Análisis de Trials con Mayor CER
|
||||
|
||||
**Tabla 39.** *Características de trials con fallos catastróficos.*
|
||||
No se observaron fallos catastróficos (CER > 10%). El CER máximo fue 7.30%, por lo que el análisis se centra en los trials con peor desempeño relativo:
|
||||
|
||||
| Trial | CER | text_det_thresh | textline_orientation | Diagnóstico |
|
||||
|-------|-----|-----------------|---------------------|-------------|
|
||||
| #47 | 51.61% | 0.017 | True | Umbral muy bajo |
|
||||
| #23 | 43.29% | 0.042 | False | Umbral bajo + sin orientación |
|
||||
| #12 | 38.76% | 0.089 | False | Umbral bajo + sin orientación |
|
||||
| #56 | 35.12% | 0.023 | False | Umbral muy bajo + sin orientación |
|
||||
**Tabla 39.** *Trials con mayor CER.*
|
||||
|
||||
*Fuente: Análisis del CSV de resultados.*
|
||||
| Trial ID | CER | text_det_thresh | textline_orientation |
|
||||
|----------|-----|-----------------|---------------------|
|
||||
| f699b826 | 7.30% | 0.285 | False |
|
||||
| 34bfaecf | 7.29% | 0.030 | True |
|
||||
| 8c1998de | 6.44% | 0.369 | True |
|
||||
| 8b33e2a2 | 6.41% | 0.664 | False |
|
||||
Fuente: [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).
|
||||
|
||||
**Diagnóstico:**
|
||||
|
||||
1. **Umbral de detección muy bajo** (`text_det_thresh` < 0.1): Genera exceso de falsos positivos en la detección, incluyendo artefactos, manchas y ruido como "texto".
|
||||
|
||||
2. **Desactivación de orientación**: Sin el clasificador de orientación, las líneas de texto pueden mezclarse incorrectamente, especialmente en tablas.
|
||||
|
||||
3. **Combinación fatal**: La peor combinación es umbral bajo + sin orientación, que produce textos completamente desordenados y con inserciones de ruido.
|
||||
|
||||
**Recomendación**: Evitar `text_det_thresh` < 0.1 en cualquier configuración.
|
||||
Observación: Los peores resultados muestran variabilidad tanto en `text_det_thresh` como en `textline_orientation`, sin un patrón único dominante en este subconjunto de trials.
|
||||
|
||||
### Comparación Baseline vs Optimizado
|
||||
|
||||
@@ -818,8 +808,7 @@ La configuración óptima identificada se evaluó sobre el dataset completo de 4
|
||||
|--------|-----|---------------------|-----|-------------------|
|
||||
| PaddleOCR (Baseline) | 8.85% | 91.15% | 13.05% | 86.95% |
|
||||
| PaddleOCR-HyperAdjust | **7.72%** | **92.28%** | **11.40%** | **88.60%** |
|
||||
|
||||
*Fuente: Validación final. Código en [`src/run_tuning.py`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/run_tuning.py), resultados en [`src/results/`](https://seryus.ddns.net/unir/MastersThesis/-/tree/main/src/results).*
|
||||
Fuente: [`docs/metrics/metrics_paddle.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_paddle.md).
|
||||
|
||||
> **Nota sobre generalización:** El mejor trial individual (5 páginas) alcanzó un CER de 0.79%, cumpliendo el objetivo de CER < 2%. Sin embargo, al aplicar la configuración al dataset completo de 45 páginas, el CER aumentó a 7.72%, evidenciando sobreajuste al subconjunto de entrenamiento. Esta diferencia es un hallazgo importante que se discute en la sección de análisis.
|
||||
|
||||
@@ -835,8 +824,9 @@ La configuración óptima identificada se evaluó sobre el dataset completo de 4
|
||||
| Reducción relativa del error | **12.8%** | **12.6%** |
|
||||
| Factor de mejora | 1.15× | 1.14× |
|
||||
| **Mejor trial (5 páginas)** | **0.79%** | **7.78%** |
|
||||
Fuente: [`docs/metrics/metrics_paddle.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_paddle.md).
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
**Figura 18.** *Reducción de errores: baseline vs optimizado (45 páginas).*
|
||||
|
||||
```mermaid
|
||||
---
|
||||
@@ -857,24 +847,13 @@ xychart-beta
|
||||
bar [8.85, 7.72, 13.05, 11.40]
|
||||
```
|
||||
|
||||
*Leyenda: CER = Character Error Rate, WER = Word Error Rate. Baseline = configuración por defecto de PaddleOCR. Optimizado = configuración encontrada por Ray Tune. Los valores corresponden al dataset completo de 45 páginas.*
|
||||
Fuente: [`docs/metrics/metrics_paddle.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_paddle.md).
|
||||
|
||||
Leyenda: CER = Character Error Rate, WER = Word Error Rate. Baseline = configuración por defecto de PaddleOCR. Optimizado = configuración encontrada por Ray Tune. Los valores corresponden al dataset completo de 45 páginas.
|
||||
|
||||
#### Impacto Práctico
|
||||
|
||||
**En un documento típico de 10,000 caracteres:**
|
||||
|
||||
| Configuración | Caracteres con error | Palabras con error* |
|
||||
|---------------|---------------------|---------------------|
|
||||
| Baseline | ~885 | ~196 |
|
||||
| Optimizada (full dataset) | ~772 | ~171 |
|
||||
| Optimizada (mejor trial) | ~79 | ~117 |
|
||||
| **Reducción (full dataset)** | **113 menos** | **25 menos** |
|
||||
|
||||
*Asumiendo longitud media de palabra = 6.6 caracteres en español.
|
||||
|
||||
**Interpretación:**
|
||||
|
||||
> "La optimización de hiperparámetros logró una mejora del 12.8% en el CER sobre el dataset completo de 45 páginas. Aunque esta mejora es más modesta que la observada en los trials individuales (donde se alcanzó 0.79% CER), demuestra el valor de la optimización sistemática. La diferencia entre el mejor trial (0.79%) y el resultado en dataset completo (7.72%) revela un fenómeno de sobreajuste al subconjunto de 5 páginas usado para evaluación."
|
||||
La reducción de CER y WER implica menos correcciones manuales en el texto reconocido. En conjunto, los resultados muestran una mejora medible en precisión, aunque la generalización depende del tamaño y representatividad del subconjunto de optimización.
|
||||
|
||||
### Tiempo de Ejecución
|
||||
|
||||
@@ -882,15 +861,14 @@ xychart-beta
|
||||
|
||||
| Métrica | Valor |
|
||||
|---------|-------|
|
||||
| Tiempo total del experimento | ~1.5 horas |
|
||||
| Tiempo medio por trial | ~4.2 segundos |
|
||||
| Tiempo total del experimento | ~5.0 minutos |
|
||||
| Tiempo medio por trial | 4.64 segundos |
|
||||
| Tiempo medio por página | 0.84 segundos |
|
||||
| Variabilidad (std) | 0.53 segundos/página |
|
||||
| Páginas procesadas totales | 320 |
|
||||
Fuente: [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).
|
||||
|
||||
*Fuente: [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/results/raytune_paddle_results_20260119_122609.csv).*
|
||||
|
||||
**Observaciones:**
|
||||
Observaciones:
|
||||
|
||||
1. El tiempo por página (~0.84 segundos) corresponde a ejecución con GPU (RTX 3060).
|
||||
2. La variabilidad del tiempo es moderada (std = 0.53 s/página), con algunos trials más lentos debido a configuraciones con módulos de preprocesamiento activos.
|
||||
@@ -898,11 +876,11 @@ xychart-beta
|
||||
|
||||
### Síntesis de la Optimización
|
||||
|
||||
Los 64 trials ejecutados con Ray Tune y aceleración GPU revelaron patrones claros en el comportamiento de PaddleOCR. El hallazgo más significativo es que los parámetros estructurales —`textline_orientation` y `use_doc_orientation_classify`— tienen mayor impacto que los umbrales numéricos: activarlos reduce el CER medio de 12.40% a 3.76%. En cuanto a umbrales, valores bajos de `text_det_thresh` (~0.05) benefician el rendimiento, mientras que `use_doc_unwarping` resulta innecesario para PDFs digitales.
|
||||
Los 64 trials ejecutados con Ray Tune y aceleración GPU revelaron patrones claros en el comportamiento de PaddleOCR. El hallazgo más significativo es que los parámetros estructurales, `textline_orientation` y `use_doc_orientation_classify`, tienen mayor impacto que los umbrales numéricos. Al activarlos se reduce el CER medio de 4.73% a 1.74%. En cuanto a umbrales, valores bajos de `text_det_thresh` (aprox. 0.05) benefician el rendimiento, mientras que `use_doc_unwarping` resulta innecesario para PDFs digitales.
|
||||
|
||||
El mejor trial alcanzó un CER de 0.79%, cumpliendo el objetivo de CER < 2%. No obstante, la validación sobre el dataset completo de 45 páginas arrojó un CER de 7.72%, evidenciando sobreajuste al subconjunto de optimización de 5 páginas. Aun así, esto representa una mejora del 12.8% respecto al baseline (8.85%), demostrando el valor de la optimización sistemática incluso cuando la generalización es imperfecta.
|
||||
|
||||
**Fuentes de datos:** [`src/run_tuning.py`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/run_tuning.py), [`src/raytune_ocr.py`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/raytune_ocr.py), [`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: [`src/run_tuning.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/run_tuning.py), [`src/raytune_ocr.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_ocr.py), [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).
|
||||
|
||||
## Discusión y análisis de resultados
|
||||
|
||||
@@ -916,13 +894,14 @@ Los resultados obtenidos en las secciones anteriores requieren un análisis que
|
||||
|
||||
**Tabla 43.** *Evolución del rendimiento a través del estudio.*
|
||||
|
||||
| Fase | Configuración | CER | Mejora vs anterior |
|
||||
| Fase | Configuración | CER | Mejora vs baseline |
|
||||
|------|--------------|-----|-------------------|
|
||||
| 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 |
|
||||
| Benchmark inicial | Baseline (5 páginas) | 7.76% | - |
|
||||
| Optimización (mejor trial) | Optimizada (5 páginas) | **0.79%** | 89.8% |
|
||||
| Validación final | Optimizada (45 páginas) | 7.72% | 12.8% |
|
||||
Fuente: [`docs/metrics/metrics_paddle.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_paddle.md).
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
**Figura 19.** *Evolución del CER a través del estudio.*
|
||||
|
||||
```mermaid
|
||||
---
|
||||
@@ -940,12 +919,14 @@ config:
|
||||
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]
|
||||
bar [7.76, 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.*
|
||||
Fuente: [`docs/metrics/metrics_paddle.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_paddle.md).
|
||||
|
||||
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.
|
||||
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 secciones y estilos.
|
||||
|
||||
#### Comparación con Objetivo
|
||||
|
||||
@@ -957,8 +938,7 @@ El incremento del CER de 0.79% (5 páginas) a 7.72% (45 páginas) evidencia sobr
|
||||
| Umbral | < 2% | **0.79%** | 7.72% | Parcial |
|
||||
| Método | Sin fine-tuning | Solo hiperparámetros | Solo hiperparámetros | ✓ |
|
||||
| Hardware | GPU | RTX 3060 | RTX 3060 | ✓ |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
Fuente: [`docs/metrics/metrics_paddle.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_paddle.md).
|
||||
|
||||
> **Análisis del cumplimiento:** El objetivo de CER < 2% se cumple en el mejor trial individual (0.79%), demostrando que la optimización de hiperparámetros puede alcanzar la precisión objetivo. Sin embargo, la validación sobre el dataset completo (7.72%) muestra que la generalización requiere trabajo adicional, como un subconjunto de optimización más representativo o técnicas de regularización.
|
||||
|
||||
@@ -970,16 +950,17 @@ Basándose en el análisis de los resultados de optimización:
|
||||
|
||||
**Tabla 45.** *Ranking de importancia de hiperparámetros.*
|
||||
|
||||
| Rank | Parámetro | Impacto | Evidencia |
|
||||
|------|-----------|---------|-----------|
|
||||
| 1 | `textline_orientation` | **Crítico** | Presente en todos los mejores trials |
|
||||
| 2 | `use_doc_orientation_classify` | **Alto** | Activado en configuración óptima |
|
||||
| 3 | `text_det_thresh` | **Alto** | Valor óptimo bajo (0.0462) |
|
||||
| 4 | `text_det_box_thresh` | Medio | Moderado (0.4862) |
|
||||
| 5 | `text_rec_score_thresh` | Medio | Moderado (0.5658) |
|
||||
| 6 | `use_doc_unwarping` | Nulo | Desactivado en configuración óptima |
|
||||
| Rank | Parámetro | Pearson (CER) | Signo | Evidencia |
|
||||
|------|-----------|---------------|-------|-----------|
|
||||
| 1 | `use_doc_unwarping` | 0.879 | Positivo | Correlación más alta con CER |
|
||||
| 2 | `use_doc_orientation_classify` | -0.712 | Negativo | Correlación alta con CER |
|
||||
| 3 | `textline_orientation` | -0.535 | Negativo | Correlación alta con CER |
|
||||
| 4 | `text_det_thresh` | 0.428 | Positivo | Correlación moderada con CER |
|
||||
| 5 | `text_det_box_thresh` | 0.311 | Positivo | Correlación moderada con CER |
|
||||
| 6 | `text_rec_score_thresh` | -0.268 | Negativo | Correlación moderada con CER |
|
||||
Fuente: [`src/results/correlations/paddle_correlations.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/correlations/paddle_correlations.csv).
|
||||
|
||||
*Fuente: 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).*
|
||||
**Figura 21.** *Ranking de importancia de hiperparámetros.*
|
||||
|
||||
```mermaid
|
||||
---
|
||||
@@ -995,24 +976,28 @@ config:
|
||||
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"]
|
||||
x-axis ["use_doc_unwarping", "use_doc_orientation_classify", "textline_orientation", "text_det_thresh", "text_det_box_thresh", "text_rec_score_thresh"]
|
||||
y-axis "Impacto relativo" 0 --> 100
|
||||
bar [0, 30, 40, 70, 80, 100]
|
||||
bar [100.0, 81.0, 60.8, 48.7, 35.4, 30.5]
|
||||
```
|
||||
|
||||
*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.*
|
||||
Fuente: [`src/results/correlations/paddle_correlations.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/correlations/paddle_correlations.csv).
|
||||
|
||||
Leyenda: Impacto relativo basado en |Pearson| (CER), normalizado respecto al valor máximo.
|
||||
|
||||
En términos de correlación lineal, `use_doc_unwarping` es el parámetro con mayor relación absoluta con el CER y su signo positivo indica que activarlo incrementa el error en este dataset. En cambio, `use_doc_orientation_classify` y `textline_orientation` presentan correlación negativa, lo que sugiere mejoras cuando están activados.
|
||||
|
||||
#### Análisis del Parámetro textline_orientation
|
||||
|
||||
**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:
|
||||
El clasificador de orientación de línea resuelve un problema fundamental en documentos con secciones y cambios de formato: determinar el orden correcto de lectura. Sin este clasificador:
|
||||
|
||||
1. Las líneas de una tabla pueden mezclarse con texto adyacente
|
||||
2. Los encabezados laterales pueden insertarse en posiciones incorrectas
|
||||
3. El texto en columnas puede leerse en orden incorrecto
|
||||
1. Las líneas del índice pueden mezclarse con el cuerpo del texto
|
||||
2. Los encabezados pueden insertarse en posiciones incorrectas
|
||||
3. Las listas numeradas pueden leerse en orden incorrecto
|
||||
|
||||
Para documentos académicos que típicamente incluyen tablas, listas y encabezados multinivel, este clasificador es esencial.
|
||||
Para documentos académicos que típicamente incluyen índice, listas y encabezados multinivel, este clasificador es esencial.
|
||||
|
||||
**Recomendación**: Siempre activar `textline_orientation=True` para documentos estructurados.
|
||||
|
||||
@@ -1020,20 +1005,7 @@ Para documentos académicos que típicamente incluyen tablas, listas y encabezad
|
||||
|
||||
**Comportamiento observado:**
|
||||
|
||||
| Rango | CER típico | Comportamiento |
|
||||
|-------|------------|----------------|
|
||||
| 0.0 - 0.1 | 1-3% | Detecta más texto, incluyendo bordes |
|
||||
| 0.1 - 0.3 | 2-5% | Rendimiento variable |
|
||||
| 0.3 - 0.5 | 3-7% | Balance precisión/recall |
|
||||
| 0.5 - 0.7 | 4-7% | Más conservador |
|
||||
|
||||
**Interpretación:**
|
||||
|
||||
- En ejecución GPU con modelos Mobile, valores bajos de `text_det_thresh` funcionan bien
|
||||
- El valor óptimo (0.0462) indica que una detección más sensible beneficia el rendimiento
|
||||
- A diferencia de CPU, no se observaron fallos catastróficos con valores bajos
|
||||
|
||||
**Valor óptimo encontrado**: 0.0462
|
||||
El análisis de correlación muestra que valores más bajos de `text_det_thresh` favorecen el rendimiento en este dataset. El valor óptimo encontrado en los trials fue 0.0462, lo que sugiere que una detección más sensible beneficia el resultado.
|
||||
|
||||
#### Análisis de Parámetros de Preprocesamiento
|
||||
|
||||
@@ -1063,23 +1035,21 @@ Para documentos PDF digitales como los evaluados, este módulo es innecesario y
|
||||
| Confusión de puntuación | Media | ¿ → ? | Caracteres similares |
|
||||
| Pérdida de eñe | Baja | año → ano | Modelo de reconocimiento |
|
||||
| Texto desordenado | Variable | Mezcla de líneas | Fallo de orientación |
|
||||
|
||||
*Fuente: Análisis cualitativo.*
|
||||
Fuente: Análisis cualitativo.
|
||||
|
||||
#### Patrones de Fallo por Tipo de Contenido
|
||||
|
||||
**Tabla 47.** *Tasa de error por tipo de contenido.*
|
||||
**Tabla 47.** *Tasa de error por tipo de contenido (cualitativa).*
|
||||
|
||||
| Tipo de contenido | CER estimado | Factor de riesgo |
|
||||
|-------------------|--------------|------------------|
|
||||
| Párrafos de texto | ~1% | Bajo |
|
||||
| Listas numeradas | ~2% | Medio |
|
||||
| Tablas simples | ~3% | Medio |
|
||||
| Encabezados + pie de página | ~2% | Medio |
|
||||
| Tablas complejas | ~5% | Alto |
|
||||
| Texto en columnas | ~4% | Alto |
|
||||
|
||||
*Fuente: Estimación cualitativa.*
|
||||
| Tipo de contenido | Nivel de error | Factor de riesgo |
|
||||
|-------------------|----------------|------------------|
|
||||
| Párrafos de texto | Bajo | Bajo |
|
||||
| Listas numeradas | Medio | Medio |
|
||||
| Índice y encabezados | Medio | Medio |
|
||||
| Encabezados + pie de página | Medio | Medio |
|
||||
| Texto con cambios tipográficos | Medio | Medio |
|
||||
| Listas con numeración densa | Alto | Alto |
|
||||
Fuente: Estimación cualitativa.
|
||||
|
||||
### Comparación con Objetivos Específicos
|
||||
|
||||
@@ -1092,8 +1062,7 @@ Para documentos PDF digitales como los evaluados, este módulo es innecesario y
|
||||
| OE3 | Identificar hiperparámetros críticos | `textline_orientation`, `use_doc_orientation_classify`, `text_det_thresh` identificados | ✓ Cumplido |
|
||||
| OE4 | Optimizar con Ray Tune (≥50 trials) | 64 trials ejecutados con GPU | ✓ Cumplido |
|
||||
| OE5 | Validar configuración optimizada | CER: 8.85% → 7.72% (dataset), 0.79% (mejor trial) | ✓ Parcial |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
Fuente: [`docs/metrics/metrics_paddle.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics_paddle.md), [`src/results/correlations/paddle_correlations.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/correlations/paddle_correlations.csv), [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).
|
||||
|
||||
> **Nota sobre OE5:** El objetivo de CER < 2% se cumple en el mejor trial individual (0.79%). La validación sobre el dataset completo (7.72%) muestra que la generalización requiere mayor trabajo, identificándose como línea de trabajo futuro.
|
||||
|
||||
@@ -1109,7 +1078,7 @@ Para documentos PDF digitales como los evaluados, este módulo es innecesario y
|
||||
|
||||
#### Limitaciones Metodológicas
|
||||
|
||||
1. **Ground truth automático**: El texto de referencia se extrajo programáticamente del PDF, lo cual puede introducir errores en layouts complejos donde el orden de lectura no es evidente.
|
||||
1. **Ground truth automático**: El texto de referencia se extrajo programáticamente del PDF, lo cual puede introducir errores en el orden de lectura cuando hay secciones con encabezados y saltos de línea.
|
||||
|
||||
2. **Tamaño del dataset**: 45 páginas es un dataset limitado. Un dataset más amplio proporcionaría estimaciones más robustas.
|
||||
|
||||
@@ -1133,14 +1102,13 @@ Para documentos académicos en español similares a los evaluados:
|
||||
|
||||
| Parámetro | Valor | Prioridad | Justificación |
|
||||
|-----------|-------|-----------|---------------|
|
||||
| `textline_orientation` | True | Obligatorio | Crítico para layouts complejos |
|
||||
| `textline_orientation` | True | Obligatorio | Crítico para documentos con secciones |
|
||||
| `use_doc_orientation_classify` | True | Recomendado | Mejora orientación de documento |
|
||||
| `text_det_thresh` | 0.05 (rango: 0.04-0.10) | Recomendado | Detección sensible beneficia resultados |
|
||||
| `text_det_box_thresh` | 0.49 (rango: 0.4-0.6) | Recomendado | Balance de confianza |
|
||||
| `text_rec_score_thresh` | 0.57 (rango: 0.5-0.7) | Opcional | Filtra reconocimientos poco confiables |
|
||||
| `use_doc_unwarping` | False | No recomendado | Innecesario para PDFs digitales |
|
||||
|
||||
*Fuente: Análisis de [`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: [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).
|
||||
|
||||
#### Cuándo Aplicar Esta Metodología
|
||||
|
||||
@@ -1166,7 +1134,7 @@ La optimización de hiperparámetros puede ser insuficiente cuando:
|
||||
|
||||
3. **Documentos muy degradados**: Escaneos de baja calidad o documentos históricos.
|
||||
|
||||
4. **Requisitos de CER < 0.5%**: Puede requerir fine-tuning para alcanzar precisiones muy altas.
|
||||
4. **Requisitos de CER muy bajo**: Puede requerir fine-tuning para alcanzar precisiones muy altas.
|
||||
|
||||
### Síntesis del Capítulo
|
||||
|
||||
@@ -1176,16 +1144,22 @@ Los resultados cuantifican tanto los logros como las limitaciones del enfoque. E
|
||||
|
||||
Desde el punto de vista práctico, la infraestructura dockerizada desarrollada y la aceleración GPU (82× más rápida que CPU) demuestran la viabilidad de esta metodología tanto para experimentación como para despliegue en producción.
|
||||
|
||||
**Fuentes de datos:**
|
||||
- [`src/run_tuning.py`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/run_tuning.py): Script principal de optimización
|
||||
- [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/results/raytune_paddle_results_20260119_122609.csv): Resultados CSV de PaddleOCR
|
||||
- [`src/results/raytune_easyocr_results_20260119_120204.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/results/raytune_easyocr_results_20260119_120204.csv): Resultados CSV de EasyOCR
|
||||
- [`src/results/raytune_doctr_results_20260119_121445.csv`](https://seryus.ddns.net/unir/MastersThesis/-/blob/main/src/results/raytune_doctr_results_20260119_121445.csv): Resultados CSV de DocTR
|
||||
Fuente:
|
||||
- [`src/run_tuning.py`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/run_tuning.py) - Script principal de optimización
|
||||
- [`src/raytune/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune/requirements.txt) - Dependencias del orquestador Ray Tune
|
||||
- [`src/paddle_ocr/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/paddle_ocr/requirements.txt) - Dependencias del servicio PaddleOCR
|
||||
- [`src/easyocr_service/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/easyocr_service/requirements.txt) - Dependencias del servicio EasyOCR
|
||||
- [`src/doctr_service/requirements.txt`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/doctr_service/requirements.txt) - Dependencias del servicio DocTR
|
||||
- [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv) - Resultados CSV de PaddleOCR
|
||||
- [`src/results/correlations/paddle_correlations.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/correlations/paddle_correlations.csv) - Correlaciones de hiperparámetros (PaddleOCR)
|
||||
- [`src/results/raytune_easyocr_results_20260119_120204.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_easyocr_results_20260119_120204.csv) - Resultados CSV de EasyOCR
|
||||
- [`src/results/raytune_doctr_results_20260119_121445.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_doctr_results_20260119_121445.csv) - Resultados CSV de DocTR
|
||||
- [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_paddle_subproc_results_20251207_192320.csv) - Referencia de tiempos en CPU para PaddleOCR
|
||||
|
||||
**Imágenes Docker:**
|
||||
- [`seryus.ddns.net/unir/paddle-ocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/paddle-ocr-gpu/latest): PaddleOCR con soporte GPU
|
||||
- [`seryus.ddns.net/unir/easyocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/easyocr-gpu/latest): EasyOCR con soporte GPU
|
||||
- [`seryus.ddns.net/unir/doctr-gpu`](https://seryus.ddns.net/unir/-/packages/container/doctr-gpu/latest): DocTR con soporte GPU
|
||||
Imágenes Docker:
|
||||
- [`seryus.ddns.net/unir/paddle-ocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/paddle-ocr-gpu/latest) - PaddleOCR con soporte GPU
|
||||
- [`seryus.ddns.net/unir/easyocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/easyocr-gpu/latest) - EasyOCR con soporte GPU
|
||||
- [`seryus.ddns.net/unir/doctr-gpu`](https://seryus.ddns.net/unir/-/packages/container/doctr-gpu/latest) - DocTR con soporte GPU
|
||||
|
||||
### Comparativa de Rendimiento CPU vs GPU
|
||||
|
||||
@@ -1202,14 +1176,15 @@ Esta sección presenta la comparación de rendimiento entre ejecución en CPU y
|
||||
| CUDA | 12.4 |
|
||||
| Sistema Operativo | Ubuntu 24.04.3 LTS |
|
||||
| Kernel | 6.14.0-37-generic |
|
||||
Fuente: [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md).
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
Nota: Los requisitos de entorno documentados por dependencias se detallan en [`docs/07_anexo_a.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/07_anexo_a.md), sección A.9.
|
||||
|
||||
Este hardware representa configuración típica de desarrollo, permitiendo evaluar el rendimiento en condiciones realistas de despliegue.
|
||||
|
||||
#### Comparación CPU vs 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).
|
||||
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/src/branch/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/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv)(GPU).
|
||||
|
||||
**Tabla 51.** *Rendimiento comparativo CPU vs GPU.*
|
||||
|
||||
@@ -1217,9 +1192,10 @@ Se comparó el tiempo de procesamiento entre CPU y GPU utilizando los datos de [
|
||||
|---------|-----|----------------|----------------------|
|
||||
| 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** |
|
||||
| 64 trials × 5 páginas | 6.2 horas | ~5.0 min | **75x** |
|
||||
Fuente: [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_paddle_subproc_results_20251207_192320.csv), [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).
|
||||
|
||||
*Fuente: 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).*
|
||||
**Figura 20.** *Tiempo de procesamiento: CPU vs GPU (segundos/página).*
|
||||
|
||||
```mermaid
|
||||
---
|
||||
@@ -1240,11 +1216,13 @@ xychart-beta
|
||||
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).*
|
||||
Fuente: [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/raytune_paddle_subproc_results_20251207_192320.csv), [`src/results/raytune_paddle_results_20260119_122609.csv`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/src/results/raytune_paddle_results_20260119_122609.csv).
|
||||
|
||||
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
|
||||
- **Optimización en CPU (6.2 horas)**: Viable pero lento para iteraciones rápidas
|
||||
- **Optimización en GPU (~5.0 minutos)**: Permite explorar más configuraciones y realizar múltiples experimentos
|
||||
- **Producción con GPU (0.84s/página)**: Habilita procesamiento en tiempo real
|
||||
|
||||
#### Comparación de Modelos PaddleOCR
|
||||
@@ -1257,8 +1235,7 @@ PaddleOCR ofrece dos variantes de modelos: Mobile (optimizados para dispositivos
|
||||
|--------|----------------|-----------|---------------|
|
||||
| PP-OCRv5 Mobile | 0.06 GB | Funciona correctamente | ✓ Recomendado |
|
||||
| PP-OCRv5 Server | 5.3 GB | OOM en página 2 | ✗ Requiere >8 GB VRAM |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
Fuente: [`docs/metrics/metrics.md`](https://seryus.ddns.net/unir/MastersThesis/src/branch/main/docs/metrics/metrics.md).
|
||||
|
||||
Los modelos Server, a pesar de ofrecer potencialmente mayor precisión, resultan inviables en hardware con VRAM limitada (≤6 GB) debido a errores de memoria (Out of Memory). Los modelos Mobile, con un consumo de memoria 88 veces menor, funcionan de manera estable y ofrecen rendimiento suficiente para el caso de uso evaluado.
|
||||
|
||||
@@ -1270,7 +1247,7 @@ La validación con aceleración GPU permite extraer las siguientes conclusiones:
|
||||
|
||||
2. **Modelos Mobile recomendados**: Para hardware con VRAM limitada (≤6 GB), los modelos Mobile de PP-OCRv5 ofrecen el mejor balance entre precisión y recursos, funcionando de manera estable sin errores de memoria.
|
||||
|
||||
3. **Viabilidad práctica**: Con GPU, el procesamiento de un documento completo (45 páginas) toma menos de 30 segundos, validando la aplicabilidad en entornos de producción donde el tiempo de respuesta es crítico.
|
||||
3. **Viabilidad práctica**: Con GPU, el procesamiento de un documento completo (45 páginas) toma ~38 segundos, validando la aplicabilidad en entornos de producción donde el tiempo de respuesta es crítico.
|
||||
|
||||
4. **Escalabilidad**: La arquitectura de microservicios dockerizados utilizada para la validación GPU facilita el despliegue horizontal, permitiendo escalar el procesamiento según demanda.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user