From 7adf12527ac1b1ac02b19946fb48565bee3fccf7 Mon Sep 17 00:00:00 2001 From: sergio Date: Tue, 20 Jan 2026 12:29:51 +0100 Subject: [PATCH] style --- apply_content.py | 4 +- docs/04_desarrollo_especifico.md | 12 ++-- thesis_output/plantilla_individual.htm | 96 +++++++++++++++++--------- 3 files changed, 71 insertions(+), 41 deletions(-) diff --git a/apply_content.py b/apply_content.py index ff52677..3699c22 100644 --- a/apply_content.py +++ b/apply_content.py @@ -183,7 +183,9 @@ def parse_md_to_html_blocks(md_content): code = '\n'.join(code_lines) # Escape HTML entities in code code = code.replace('&', '&').replace('<', '<').replace('>', '>') - html_blocks.append(f'

{code}

') + html_blocks.append(f'''
+
{code}
+
''') i += 1 continue diff --git a/docs/04_desarrollo_especifico.md b/docs/04_desarrollo_especifico.md index bbac85e..ea3f84d 100644 --- a/docs/04_desarrollo_especifico.md +++ b/docs/04_desarrollo_especifico.md @@ -35,9 +35,9 @@ Se seleccionaron tres soluciones OCR de código abierto representativas del esta *Fuente: Elaboración propia.* **Imágenes Docker disponibles en el registro del proyecto:** -- PaddleOCR: `seryus.ddns.net/unir/paddle-ocr-gpu`, `seryus.ddns.net/unir/paddle-ocr-cpu` -- EasyOCR: `seryus.ddns.net/unir/easyocr-gpu` -- DocTR: `seryus.ddns.net/unir/doctr-gpu` +- 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) ### Criterios de Éxito @@ -1147,9 +1147,9 @@ Este capítulo ha presentado el desarrollo completo de la contribución: - [`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 **Imágenes Docker:** -- `seryus.ddns.net/unir/paddle-ocr-gpu`: PaddleOCR con soporte GPU -- `seryus.ddns.net/unir/easyocr-gpu`: EasyOCR con soporte GPU -- `seryus.ddns.net/unir/doctr-gpu`: DocTR con soporte GPU +- [`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 diff --git a/thesis_output/plantilla_individual.htm b/thesis_output/plantilla_individual.htm index 1b534b9..cbc2c73 100644 --- a/thesis_output/plantilla_individual.htm +++ b/thesis_output/plantilla_individual.htm @@ -5004,22 +5004,26 @@ concretos y metodología de trabajoSe implementó una arquitectura basada en contenedores Docker para aislar los servicios OCR y facilitar la reproducibilidad (ver sección 4.2.3 para detalles de la arquitectura).

Ejecución con Docker Compose

Los servicios se orquestan mediante Docker Compose (src/docker-compose.tuning.*.yml):

-

# Iniciar servicio OCR
+
+
# Iniciar servicio OCR
 docker compose -f docker-compose.tuning.doctr.yml up -d doctr-gpu
 
 # Ejecutar optimización (64 trials)
 docker compose -f docker-compose.tuning.doctr.yml run raytune --service doctr --samples 64
 
 # Detener servicios
-docker compose -f docker-compose.tuning.doctr.yml down

+docker compose -f docker-compose.tuning.doctr.yml down
+

El servicio OCR expone una API REST que retorna métricas en formato JSON:

-

{
+
+
{
     "CER": 0.0149,
     "WER": 0.0762,
     "TIME": 15.8,
     "PAGES": 5,
     "TIME_PER_PAGE": 3.16
-}

+}
+

Fase 5: Validación

Protocolo de Validación

1.   Baseline: Ejecución con configuración por defecto de PaddleOCR

@@ -5105,9 +5109,9 @@ color:#0098CD;mso-font-kerning:16.0pt;mso-bidi-font-weight:bold'>Fuente: Elaboración propia.

 

Imágenes Docker disponibles en el registro del proyecto:

-

·     PaddleOCR: seryus.ddns.net/unir/paddle-ocr-gpu, seryus.ddns.net/unir/paddle-ocr-cpu

-

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

-

·     DocTR: seryus.ddns.net/unir/doctr-gpu

+

·     PaddleOCR: seryus.ddns.net/unir/paddle-ocr-gpu, seryus.ddns.net/unir/paddle-ocr-cpu

+

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

+

·     DocTR: seryus.ddns.net/unir/doctr-gpu

Criterios de Éxito

Los criterios establecidos para evaluar las soluciones fueron:

1.   Precisión (CER < 5%): Error de caracteres aceptable para documentos académicos

@@ -5239,22 +5243,26 @@ color:#0098CD;mso-font-kerning:16.0pt;mso-bidi-font-weight:bold'>2.   Health checks automáticos para asegurar disponibilidad del servicio

3.   Comunicación via API REST (endpoints /health y /evaluate)

4.   Soporte para GPU mediante nvidia-docker

-

# Iniciar servicio OCR con GPU
+
+
# Iniciar servicio OCR con GPU
 docker compose -f docker-compose.tuning.doctr.yml up -d doctr-gpu
 
 # Ejecutar optimización (64 trials)
 docker compose -f docker-compose.tuning.doctr.yml run raytune --service doctr --samples 64
 
 # Detener servicios
-docker compose -f docker-compose.tuning.doctr.yml down

+docker compose -f docker-compose.tuning.doctr.yml down
+

Respuesta del servicio OCR:

-

{
+
+
{
     "CER": 0.0149,
     "WER": 0.0762,
     "TIME": 15.8,
     "PAGES": 5,
     "TIME_PER_PAGE": 3.16
-}

+}
+

Infraestructura Docker

La infraestructura del proyecto se basa en contenedores Docker para garantizar reproducibilidad y aislamiento de dependencias. Se generaron seis imágenes Docker, cada una optimizada para su propósito específico.

Tabla 26. Imágenes Docker generadas para el proyecto.

@@ -5291,12 +5299,14 @@ docker compose -f docker-compose.tuning.doctr.yml down

 

Health Checks y Monitorización

Todos los servicios implementan health checks para garantizar disponibilidad antes de iniciar la optimización:

-

healthcheck:
+
+
healthcheck:
   test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"]
   interval: 30s
   timeout: 10s
   retries: 3
-  start_period: 60s  # PaddleOCR: 60s, EasyOCR: 120s, DocTR: 180s

+ start_period: 60s # PaddleOCR: 60s, EasyOCR: 120s, DocTR: 180s
+

Los tiempos de start_period varían según el servicio debido al tiempo de carga de modelos:

·     PaddleOCR: 60 segundos (modelos más ligeros)

·     EasyOCR: 120 segundos (carga de modelos CRAFT)

@@ -5308,7 +5318,8 @@ docker compose -f docker-compose.tuning.doctr.yml down

 

Reproducibilidad

Para reproducir los experimentos:

-

# 1. Clonar repositorio
+
+
# 1. Clonar repositorio
 git clone https://github.com/seryus/MastersThesis.git
 cd MastersThesis/src
 
@@ -5326,7 +5337,8 @@ docker compose -f docker-compose.tuning.paddle.yml run raytune \
 ls -la results/raytune_paddle_results_*.csv
 
 # 6. Limpiar
-docker compose -f docker-compose.tuning.paddle.yml down

+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

@@ -5385,7 +5397,8 @@ docker compose -f docker-compose.tuning.paddle.yml down

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

La configuración que minimizó el CER fue:

-

Best CER: 0.007884 (0.79%)
+
+
Best CER: 0.007884 (0.79%)
 Best WER: 0.077848 (7.78%)
 
 Configuración óptima:
@@ -5395,7 +5408,8 @@ Configuración óptima:
   text_det_thresh: 0.0462
   text_det_box_thresh: 0.4862
   text_det_unclip_ratio: 0.0
-  text_rec_score_thresh: 0.5658

+ text_rec_score_thresh: 0.5658
+

Tabla 35. Configuración óptima identificada.

Parámetro

Valor óptimo

Valor por defecto

Cambio

textline_orientation

True

False

Activado

use_doc_orientation_classify

True

False

Activado

use_doc_unwarping

False

False

Sin cambio

text_det_thresh

0.0462

0.3

-0.254

text_det_box_thresh

0.4862

0.6

-0.114

text_det_unclip_ratio

0.0

1.5

-1.5 (fijado)

text_rec_score_thresh

0.5658

0.5

+0.066

Fuente: Elaboración propia.

@@ -5611,9 +5625,9 @@ Configuración óptima:

·     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

-

·     seryus.ddns.net/unir/doctr-gpu: DocTR con soporte GPU

+

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

+

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

+

·     seryus.ddns.net/unir/doctr-gpu: DocTR con soporte GPU

Comparativa de Rendimiento CPU vs GPU

Esta sección presenta la comparación de rendimiento entre ejecución en CPU y GPU, justificando la elección de GPU para el experimento principal y demostrando el impacto práctico de la aceleración por hardware.

Configuración del Entorno GPU

@@ -5778,43 +5792,54 @@ major-latin;mso-bidi-font-family:"Calibri Light";mso-bidi-theme-font:major-latin

Imágenes Docker:

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

·     CPU: seryus.ddns.net/unir/paddle-ocr-cpu

-

cd src/paddle_ocr
+
+
cd src/paddle_ocr
 
 # GPU (recomendado)
 docker compose up -d
 
 # CPU (más lento, 82x)
-docker compose -f docker-compose.cpu-registry.yml up -d

+docker compose -f docker-compose.cpu-registry.yml up -d
+

DocTR (Puerto 8003)

Imagen Docker: seryus.ddns.net/unir/doctr-gpu

-

cd src/doctr_service
+
+
cd src/doctr_service
 
 # GPU
-docker compose up -d

+docker compose up -d
+

EasyOCR (Puerto 8002)

Nota: EasyOCR utiliza el mismo puerto (8002) que PaddleOCR. No se pueden ejecutar simultáneamente. Por esta razón, existe un archivo docker-compose separado para EasyOCR.

Imagen Docker: seryus.ddns.net/unir/easyocr-gpu

-

cd src/easyocr_service
+
+
cd src/easyocr_service
 
 # GPU (usar archivo separado para evitar conflicto de puerto)
-docker compose up -d

+docker compose up -d
+

Verificar Estado del Servicio

-

# Verificar salud del servicio
+
+
# Verificar salud del servicio
 curl http://localhost:8002/health
 
 # Respuesta esperada:
-# {"status": "ok", "model_loaded": true, "gpu_name": "NVIDIA GeForce RTX 3060"}

+# {"status": "ok", "model_loaded": true, "gpu_name": "NVIDIA GeForce RTX 3060"}
+

A.5 Uso de la API OCR

Evaluar Dataset Completo

-

# PaddleOCR - Evaluación completa
+
+
# PaddleOCR - Evaluación completa
 curl -X POST http://localhost:8002/evaluate_full \
   -H "Content-Type: application/json" \
   -d '{
     "pdf_folder": "/app/dataset",
     "save_output": true
-  }'

+ }'
+

Evaluar con Hiperparámetros Optimizados

-

# PaddleOCR con configuración óptima
+
+
# PaddleOCR con configuración óptima
 curl -X POST http://localhost:8002/evaluate_full \
   -H "Content-Type: application/json" \
   -d '{
@@ -5827,10 +5852,12 @@ curl -X POST http://localhost:8002/evaluate_full \
     "text_det_unclip_ratio": 0.0,
     "text_rec_score_thresh": 0.5658,
     "save_output": true
-  }'

+ }'
+

A.6 Ajuste de Hiperparámetros con Ray Tune

Ejecutar Ajuste

-

cd src
+
+
cd src
 
 # Activar entorno virtual
 source ../.venv/bin/activate
@@ -5844,7 +5871,8 @@ check_workers(ports, 'PaddleOCR')
 trainable = create_trainable(ports, paddle_ocr_payload)
 results = run_tuner(trainable, PADDLE_OCR_SEARCH_SPACE, num_samples=64)
 analyze_results(results, prefix='raytune_paddle', config_keys=PADDLE_OCR_CONFIG_KEYS)
-"

+"
+

Servicios y Puertos

Tabla 59. Servicios Docker y puertos.

Servicio

Puerto

Script de Ajuste

Nota

PaddleOCR

8002

paddle_ocr_payload

-

DocTR

8003

doctr_payload

-

EasyOCR

8002

easyocr_payload

Conflicto con PaddleOCR