From 7adf12527ac1b1ac02b19946fb48565bee3fccf7 Mon Sep 17 00:00:00 2001
From: sergio {code}{code}
+
Los servicios se orquestan mediante Docker Compose (src/docker-compose.tuning.*.yml):
-El servicio OCR expone una API REST que retorna métricas en formato JSON: 1. Baseline: Ejecución con configuración por defecto de PaddleOCR 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 Los criterios establecidos para evaluar las soluciones fueron: 1. Precisión (CER < 5%): Error de caracteres aceptable para documentos académicos# 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
+{
+{
"CER": 0.0149,
"WER": 0.0762,
"TIME": 15.8,
"PAGES": 5,
"TIME_PER_PAGE": 3.16
-}
+}
+Fase 5: Validación
Protocolo de Validación
Criterios de Éxito
3. Comunicación via API REST (endpoints /health y /evaluate)
4. Soporte para GPU mediante nvidia-docker
-Respuesta del servicio OCR: La infraestructura del proyecto se basa en contenedores Docker para garantizar reproducibilidad y aislamiento de dependencias. Se generaron seis imágenes Docker, cada una optimizada para su propósito específico. Tabla 26. Imágenes Docker generadas para el proyecto. Todos los servicios implementan health checks para garantizar disponibilidad antes de iniciar la optimización: 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) Para reproducir los experimentos: Los resultados de los experimentos están disponibles en: La mayoría de trials (67.2%) alcanzaron CER < 2%, cumpliendo el objetivo establecido. Ningún trial presentó fallos catastróficos (CER > 10%), demostrando la estabilidad de la optimización con GPU. La configuración que minimizó el CER fue: 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. · 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 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. Imágenes Docker: · GPU: seryus.ddns.net/unir/paddle-ocr-gpu · CPU: seryus.ddns.net/unir/paddle-ocr-cpu Imagen Docker: seryus.ddns.net/unir/doctr-gpu 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 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# 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
+{
+{
"CER": 0.0149,
"WER": 0.0762,
"TIME": 15.8,
"PAGES": 5,
"TIME_PER_PAGE": 3.16
-}
+}
+Infraestructura Docker
Health Checks y Monitorizació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
+Reproducibilidad
# 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
+Mejor Configuración Encontrada
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
+Comparativa de Rendimiento CPU vs GPU
Configuración del Entorno GPU
@@ -5778,43 +5792,54 @@ major-latin;mso-bidi-font-family:"Calibri Light";mso-bidi-theme-font:major-latin
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)
cd src/doctr_service
+
cd src/doctr_service
# GPU
-docker compose up -d
+docker compose up -d
+EasyOCR (Puerto 8002)
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