diff --git a/README.md b/README.md index 7f1e74d..eeafb81 100644 --- a/README.md +++ b/README.md @@ -315,6 +315,9 @@ Este proyecto es parte de un Trabajo Fin de Máster académico. ## Referencias - [PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR) +- [EasyOCR](https://github.com/JaidedAI/EasyOCR) +- [DocTR](https://github.com/mindee/doctr) - [Ray Tune](https://docs.ray.io/en/latest/tune/index.html) - [Optuna](https://optuna.org/) - [jiwer](https://github.com/jitsi/jiwer) +- [PyMuPDF](https://pymupdf.readthedocs.io/) diff --git a/docs/04_desarrollo_especifico.md b/docs/04_desarrollo_especifico.md index 2e1d8f6..db5697a 100644 --- a/docs/04_desarrollo_especifico.md +++ b/docs/04_desarrollo_especifico.md @@ -217,7 +217,7 @@ El benchmark comparativo ha permitido identificar PaddleOCR como la solución m ### 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://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py) con apoyo de la librería [`src/raytune_ocr.py`](https://github.com/seryus/MastersThesis/blob/main/src/raytune_ocr.py), almacenándose los resultados en [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results). +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. @@ -317,7 +317,7 @@ La infraestructura del proyecto se basa en contenedores Docker para garantizar r | [`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://github.com/seryus/MastersThesis/tree/main/src/paddle_ocr), [`src/easyocr_service/`](https://github.com/seryus/MastersThesis/tree/main/src/easyocr_service), [`src/doctr_service/`](https://github.com/seryus/MastersThesis/tree/main/src/doctr_service), [`src/raytune/`](https://github.com/seryus/MastersThesis/tree/main/src/raytune).* +*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).* ##### Arquitectura de Microservicios @@ -401,10 +401,10 @@ El proyecto incluye múltiples archivos Docker Compose para diferentes escenario | Archivo | Propósito | Servicios | |---------|-----------|-----------| -| [`docker-compose.tuning.yml`](https://github.com/seryus/MastersThesis/blob/main/src/docker-compose.tuning.yml) | Optimización principal | RayTune + PaddleOCR + DocTR | -| [`docker-compose.tuning.easyocr.yml`](https://github.com/seryus/MastersThesis/blob/main/src/docker-compose.tuning.easyocr.yml) | Optimización EasyOCR | RayTune + EasyOCR | -| [`docker-compose.tuning.paddle.yml`](https://github.com/seryus/MastersThesis/blob/main/src/docker-compose.tuning.paddle.yml) | Optimización PaddleOCR | RayTune + PaddleOCR | -| [`docker-compose.tuning.doctr.yml`](https://github.com/seryus/MastersThesis/blob/main/src/docker-compose.tuning.doctr.yml) | Optimización DocTR | RayTune + DocTR | +| [`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.* @@ -488,7 +488,7 @@ Para reproducir los experimentos: ```bash # 1. Clonar repositorio -git clone https://github.com/seryus/MastersThesis.git +git clone https://seryus.ddns.net/unir/MastersThesis.git cd MastersThesis/src # 2. Iniciar servicio OCR (requiere nvidia-docker) @@ -509,9 +509,9 @@ 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://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv) -- [`src/results/raytune_easyocr_results_20260119_120204.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_easyocr_results_20260119_120204.csv) -- [`src/results/raytune_doctr_results_20260119_121445.csv`](https://github.com/seryus/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/-/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) #### Dataset Extendido @@ -669,7 +669,7 @@ Configuración óptima: | 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://github.com/seryus/MastersThesis/tree/main/src/results) generados por [`src/run_tuning.py`](https://github.com/seryus/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).* #### Análisis de Correlación @@ -684,7 +684,7 @@ Se calculó la correlación de Pearson entre los parámetros continuos y las mé | `text_rec_score_thresh` | -0.161 | Correlación débil negativa | | `text_det_unclip_ratio` | NaN | Varianza cero (valor fijo) | -*Fuente: Análisis de [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results) generados por [`src/run_tuning.py`](https://github.com/seryus/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.* @@ -694,7 +694,7 @@ Se calculó la correlación de Pearson entre los parámetros continuos y las mé | `text_det_box_thresh` | +0.227 | Correlación débil positiva | | `text_rec_score_thresh` | -0.173 | Correlación débil negativa | -*Fuente: Análisis de [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results) generados por [`src/run_tuning.py`](https://github.com/seryus/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).* **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. @@ -709,7 +709,7 @@ El parámetro booleano `textline_orientation` demostró tener el mayor impacto e | True | 3.76% | 7.12% | 12.73% | 32 | | False | 12.40% | 14.93% | 21.71% | 32 | -*Fuente: Análisis de [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results) generados por [`src/run_tuning.py`](https://github.com/seryus/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).* **Interpretación:** @@ -778,7 +778,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://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py), resultados en [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results).* +*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).* > **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. @@ -845,7 +845,7 @@ xychart-beta | Variabilidad (std) | 0.53 segundos/página | | Páginas procesadas totales | 320 | -*Fuente: [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/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/-/blob/main/src/results/raytune_paddle_results_20260119_122609.csv).* **Observaciones:** @@ -859,7 +859,7 @@ Los 64 trials ejecutados con Ray Tune y aceleración GPU revelaron patrones clar 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://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py), [`src/raytune_ocr.py`](https://github.com/seryus/MastersThesis/blob/main/src/raytune_ocr.py), [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv). +**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). ## Discusión y análisis de resultados @@ -915,7 +915,7 @@ Basándose en el análisis de los resultados de optimización: | 5 | `text_rec_score_thresh` | Medio | Moderado (0.5658) | | 6 | `use_doc_unwarping` | Nulo | Desactivado en configuración óptima | -*Fuente: Elaboración propia basada en [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/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).* #### Análisis del Parámetro textline_orientation @@ -1055,7 +1055,7 @@ Para documentos académicos en español similares a los evaluados: | `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://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv).* +*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).* #### Cuándo Aplicar Esta Metodología @@ -1092,10 +1092,10 @@ 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://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py): Script principal de optimización -- [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv): Resultados CSV de PaddleOCR -- [`src/results/raytune_easyocr_results_20260119_120204.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_easyocr_results_20260119_120204.csv): Resultados CSV de EasyOCR -- [`src/results/raytune_doctr_results_20260119_121445.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_doctr_results_20260119_121445.csv): Resultados CSV de DocTR +- [`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 **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 @@ -1124,7 +1124,7 @@ Este hardware representa configuración típica de desarrollo, permitiendo evalu #### 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://github.com/seryus/MastersThesis/blob/main/src/raytune_paddle_subproc_results_20251207_192320.csv) (CPU) y [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/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.* @@ -1134,7 +1134,7 @@ Se comparó el tiempo de procesamiento entre CPU y GPU utilizando los datos de [ | Dataset completo (45 páginas) | ~52 min | ~38 seg | **82x** | | 64 trials × 5 páginas | ~6.4 horas | ~1.5 horas | **4.3x** | -*Fuente: Elaboración propia a partir de [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://github.com/seryus/MastersThesis/blob/main/src/raytune_paddle_subproc_results_20251207_192320.csv) y [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/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).* 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 diff --git a/docs/05_conclusiones_trabajo_futuro.md b/docs/05_conclusiones_trabajo_futuro.md index f0b409a..1661976 100644 --- a/docs/05_conclusiones_trabajo_futuro.md +++ b/docs/05_conclusiones_trabajo_futuro.md @@ -96,5 +96,5 @@ La metodología propuesta cumple los requisitos de reproducibilidad científica: La infraestructura dockerizada desarrollada constituye una aportación práctica que trasciende los resultados numéricos. Al encapsular los motores OCR en contenedores independientes, se resuelven problemas de compatibilidad entre dependencias y se garantiza que cualquier investigador pueda reproducir exactamente las condiciones experimentales. La aceleración de 82× proporcionada por GPU transforma lo que sería un experimento de días en uno de horas, haciendo viable la exploración exhaustiva de espacios de hiperparámetros con hardware de consumo. -El código fuente, las imágenes Docker y los datos experimentales están disponibles públicamente en el [repositorio del proyecto](https://github.com/seryus/MastersThesis). Esta apertura busca facilitar no solo la reproducción de los resultados, sino también la extensión de este trabajo hacia nuevos tipos de documentos, idiomas o motores OCR. +El código fuente, las imágenes Docker y los datos experimentales están disponibles públicamente en el [repositorio del proyecto](https://seryus.ddns.net/unir/MastersThesis). Esta apertura busca facilitar no solo la reproducción de los resultados, sino también la extensión de este trabajo hacia nuevos tipos de documentos, idiomas o motores OCR. diff --git a/docs/07_anexo_a.md b/docs/07_anexo_a.md index 6660287..75e0525 100644 --- a/docs/07_anexo_a.md +++ b/docs/07_anexo_a.md @@ -6,7 +6,7 @@ Este anexo proporciona la información técnica necesaria para reproducir los ex Todo el código fuente y los datos utilizados en este trabajo están disponibles públicamente en el siguiente repositorio: -**URL del repositorio:** https://github.com/seryus/MastersThesis +**URL del repositorio:** https://seryus.ddns.net/unir/MastersThesis El repositorio incluye: diff --git a/thesis_output/plantilla_individual.htm b/thesis_output/plantilla_individual.htm index 23a0db6..17866e8 100644 --- a/thesis_output/plantilla_individual.htm +++ b/thesis_output/plantilla_individual.htm @@ -5196,7 +5196,7 @@ color:#0098CD;mso-font-kerning:16.0pt;mso-bidi-font-weight:bold'>Fuentes de datos: ocr_benchmark_notebook.ipynb y 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 con apoyo de la librería src/raytune_ocr.py, almacenándose los resultados en src/results/.

+

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 con apoyo de la librería src/raytune_ocr.py, almacenándose los resultados en 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

Entorno de Ejecución

@@ -5264,7 +5264,7 @@ docker compose -f docker-compose.tuning.doctr.yml down

Docker Compose Files

El proyecto incluye múltiples archivos Docker Compose para diferentes escenarios de uso:

Tabla 27. Archivos Docker Compose del proyecto.

-

Archivo

Propósito

Servicios

docker-compose.tuning.yml

Optimización principal

RayTune + PaddleOCR + DocTR

docker-compose.tuning.easyocr.yml

Optimización EasyOCR

RayTune + EasyOCR

docker-compose.tuning.paddle.yml

Optimización PaddleOCR

RayTune + PaddleOCR

docker-compose.tuning.doctr.yml

Optimización DocTR

RayTune + DocTR

+

Archivo

Propósito

Servicios

docker-compose.tuning.yml

Optimización principal

RayTune + PaddleOCR + DocTR

docker-compose.tuning.easyocr.yml

Optimización EasyOCR

RayTune + EasyOCR

docker-compose.tuning.paddle.yml

Optimización PaddleOCR

RayTune + PaddleOCR

docker-compose.tuning.doctr.yml

Optimización DocTR

RayTune + DocTR

Fuente: Elaboración propia.

 

Nota: EasyOCR y PaddleOCR utilizan el mismo puerto (8002). Debido a limitaciones de recursos GPU (VRAM insuficiente para ejecutar múltiples modelos OCR simultáneamente), solo se ejecuta un servicio a la vez durante los experimentos. Por esta razón, EasyOCR tiene su propio archivo Docker Compose separado.

@@ -5297,7 +5297,7 @@ docker compose -f docker-compose.tuning.doctr.yml down

Para reproducir los experimentos:

# 1. Clonar repositorio
-git clone https://github.com/seryus/MastersThesis.git
+git clone https://seryus.ddns.net/unir/MastersThesis.git
 cd MastersThesis/src
 
 # 2. Iniciar servicio OCR (requiere nvidia-docker)
@@ -5317,9 +5317,9 @@ ls -la results/raytune_paddle_results_*.csv
 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

-

·     src/results/raytune_easyocr_results_20260119_120204.csv

-

·     src/results/raytune_doctr_results_20260119_121445.csv

+

·     src/results/raytune_paddle_results_20260119_122609.csv

+

·     src/results/raytune_easyocr_results_20260119_120204.csv

+

·     src/results/raytune_doctr_results_20260119_121445.csv

Dataset Extendido

Para la fase de optimización se extendió el dataset:

Tabla 29. Características del dataset de optimización.

@@ -5468,7 +5468,7 @@ Configuración óptima:

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.

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, src/raytune_ocr.py, src/results/raytune_paddle_results_20260119_122609.csv.

+

Fuentes de datos: src/run_tuning.py, src/raytune_ocr.py, src/results/raytune_paddle_results_20260119_122609.csv.

Discusión y análisis de resultados

Introducción

Los resultados obtenidos en las secciones anteriores requieren un análisis que trascienda los números individuales para comprender su significado práctico. En esta sección se consolidan los hallazgos del benchmark comparativo y la optimización de hiperparámetros, evaluando hasta qué punto se han cumplido los objetivos planteados y qué limitaciones condicionan la generalización de las conclusiones.

@@ -5575,10 +5575,10 @@ Configuración óptima:

Los resultados cuantifican tanto los logros como las limitaciones del enfoque. El mejor trial individual alcanzó un CER de 0.79%, cumpliendo holgadamente el objetivo de CER < 2%. Sin embargo, la validación sobre el dataset completo de 45 páginas reveló un CER de 7.72%, lo que representa una mejora del 12.8% respecto al baseline (8.85%) pero evidencia sobreajuste al subconjunto de optimización. Esta observación es valiosa: indica que futuros trabajos deberían emplear subconjuntos de optimización más representativos o aplicar técnicas de regularización.

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: Script principal de optimización

-

·     src/results/raytune_paddle_results_20260119_122609.csv: Resultados CSV de PaddleOCR

-

·     src/results/raytune_easyocr_results_20260119_120204.csv: Resultados CSV de EasyOCR

-

·     src/results/raytune_doctr_results_20260119_121445.csv: Resultados CSV de DocTR

+

·     src/run_tuning.py: Script principal de optimización

+

·     src/results/raytune_paddle_results_20260119_122609.csv: Resultados CSV de PaddleOCR

+

·     src/results/raytune_easyocr_results_20260119_120204.csv: Resultados CSV de EasyOCR

+

·     src/results/raytune_doctr_results_20260119_121445.csv: Resultados CSV de DocTR

Imágenes Docker:

·     seryus.ddns.net/unir/paddle-ocr-gpu: PaddleOCR con soporte GPU

·     seryus.ddns.net/unir/easyocr-gpu: EasyOCR con soporte GPU

@@ -5592,7 +5592,7 @@ Configuración óptima:

 

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 (CPU) y 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 (CPU) y src/results/raytune_paddle_results_20260119_122609.csv (GPU).

Tabla 53. Rendimiento comparativo CPU vs GPU.

Métrica

CPU

GPU (RTX 3060)

Factor de Aceleración

Tiempo/Página (promedio)

69.4s

0.84s

82x

Dataset completo (45 páginas)

~52 min

~38 seg

82x

64 trials × 5 páginas

~6.4 horas

~1.5 horas

4.3x

Fuente: Elaboración propia.

@@ -5665,7 +5665,7 @@ y trabajo futuro

A lo largo

En síntesis, este trabajo ha demostrado que la optimización de hiperparámetros representa una alternativa viable al fine-tuning para mejorar sistemas OCR, especialmente cuando se dispone de modelos preentrenados para el idioma objetivo y recursos limitados de tiempo o datos etiquetados.

La metodología propuesta cumple los requisitos de reproducibilidad científica: los experimentos pueden replicarse, los resultados son cuantificables y las conclusiones son aplicables a escenarios reales de procesamiento documental. Sin embargo, la experiencia también ha puesto de manifiesto la importancia de diseñar cuidadosamente los experimentos de optimización. Aunque el objetivo de CER inferior al 2% se alcanzó en el mejor trial individual (0.79%), la validación sobre el conjunto de datos completo (7.72%) revela que el tamaño y representatividad del subconjunto de optimización son factores críticos que no deben subestimarse.

La infraestructura dockerizada desarrollada constituye una aportación práctica que trasciende los resultados numéricos. Al encapsular los motores OCR en contenedores independientes, se resuelven problemas de compatibilidad entre dependencias y se garantiza que cualquier investigador pueda reproducir exactamente las condiciones experimentales. La aceleración de 82× proporcionada por GPU transforma lo que sería un experimento de días en uno de horas, haciendo viable la exploración exhaustiva de espacios de hiperparámetros con hardware de consumo.

-

El código fuente, las imágenes Docker y los datos experimentales están disponibles públicamente en el repositorio del proyecto. Esta apertura busca facilitar no solo la reproducción de los resultados, sino también la extensión de este trabajo hacia nuevos tipos de documentos, idiomas o motores OCR.

Referencias +

El código fuente, las imágenes Docker y los datos experimentales están disponibles públicamente en el repositorio del proyecto. Esta apertura busca facilitar no solo la reproducción de los resultados, sino también la extensión de este trabajo hacia nuevos tipos de documentos, idiomas o motores OCR.

Referencias bibliográficas

Akiba, T., Sano, S., Yanase, T., Ohta, T., & Koyama, M. (2019). Optuna: A next-generation hyperparameter optimization framework. Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining, 2623-2631. https://doi.org/10.1145/3292500.3330701

Baek, Y., Lee, B., Han, D., Yun, S., & Lee, H. (2019). Character region awareness for text detection. Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition, 9365-9374. https://doi.org/10.1109/CVPR.2019.00959

Bergstra, J., & Bengio, Y. (2012). Random search for hyper-parameter optimization. Journal of Machine Learning Research, 13(1), 281-305. https://jmlr.org/papers/v13/bergstra12a.html

@@ -5695,7 +5695,7 @@ major-latin;mso-bidi-font-family:"Calibri Light";mso-bidi-theme-font:major-latin Código fuente y datos analizados

Este anexo proporciona la información técnica necesaria para reproducir los experimentos descritos en este trabajo. Se incluyen las instrucciones de instalación, configuración de los servicios OCR dockerizados, ejecución de los scripts de optimización y acceso a los resultados experimentales.

A.1 Repositorio del Proyecto

Todo el código fuente y los datos utilizados en este trabajo están disponibles públicamente en el siguiente repositorio:

-

URL del repositorio: https://github.com/seryus/MastersThesis

+

URL del repositorio: https://seryus.ddns.net/unir/MastersThesis

El repositorio incluye:

·     Servicios OCR dockerizados: PaddleOCR, DocTR, EasyOCR con soporte GPU

·     Scripts de evaluación: Herramientas para evaluar y comparar modelos OCR