Files
MastersThesis/docs/07_anexo_a.md
sergio 4195c67b0c
Some checks failed
build_docker / essential (pull_request) Successful in 0s
build_docker / build_easyocr (pull_request) Has been cancelled
build_docker / build_doctr_gpu (pull_request) Has been cancelled
build_docker / build_raytune (pull_request) Has been cancelled
build_docker / build_easyocr_gpu (pull_request) Has been cancelled
build_docker / build_doctr (pull_request) Has been cancelled
build_docker / build_cpu (pull_request) Has been cancelled
build_docker / build_gpu (pull_request) Has been cancelled
char colors
2026-01-20 15:18:56 +01:00

11 KiB

Anexo A. 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://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
  • Scripts de ajuste: Ray Tune con Optuna para optimización de hiperparámetros
  • Dataset: Imágenes y textos de referencia utilizados
  • Resultados: Archivos CSV con los resultados de los 64 trials por servicio

A.2 Estructura del Repositorio

---
title: "Estructura del repositorio MastersThesis"
config:
  theme: base
  themeVariables:
    primaryColor: "#E6F4F9"
    primaryTextColor: "#404040"
    primaryBorderColor: "#0098CD"
    lineColor: "#0098CD"
---
flowchart TB
    subgraph root["MastersThesis/"]
        direction TB

        subgraph docs["docs/ - Capítulos TFM"]
            d0["00-07 chapters (.md)"]
            subgraph metrics["metrics/"]
                m1["metrics_paddle.md"]
                m2["metrics_doctr.md"]
                m3["metrics_easyocr.md"]
            end
        end

        subgraph src["src/ - Código fuente"]
            subgraph paddle["paddle_ocr/"]
                p1["paddle_ocr_tuning_rest.py"]
                p2["Dockerfile.gpu/cpu"]
            end
            subgraph doctr["doctr_service/"]
                dt1["doctr_tuning_rest.py"]
            end
            subgraph easy["easyocr_service/"]
                e1["easyocr_tuning_rest.py"]
            end
            subgraph ray["raytune/"]
                r1["raytune_ocr.py"]
                r2["run_tuning.py"]
            end
            results["results/*.csv"]
            dataset["dataset/"]
        end

        subgraph thesis["thesis_output/"]
            htm["plantilla_individual.htm"]
            figs["figures/figura_1-11.png"]
        end

        subgraph inst["instructions/"]
            i1["instrucciones.pdf"]
            i2["plantilla_individual.htm"]
        end

        scripts["apply_content.py<br/>generate_mermaid_figures.py"]
        config["claude.md<br/>README.md"]
    end

Tabla A1. Descripción de directorios principales.

Directorio Contenido
docs/ Capítulos del TFM en Markdown (estructura UNIR)
docs/metrics/ Métricas de rendimiento por servicio OCR
src/paddle_ocr/ Servicio PaddleOCR dockerizado
src/doctr_service/ Servicio DocTR dockerizado
src/easyocr_service/ Servicio EasyOCR dockerizado
src/raytune/ Scripts de optimización Ray Tune
src/results/ CSVs con resultados de 64 trials por servicio
thesis_output/ Documento TFM generado + figuras PNG
instructions/ Plantilla e instrucciones UNIR oficiales

Fuente: Elaboración propia.

A.3 Requisitos de Software

Sistema de Desarrollo

Tabla A2. Especificaciones del sistema de desarrollo.

Componente Especificación
Sistema Operativo Ubuntu 24.04.3 LTS
CPU AMD Ryzen 7 5800H
RAM 16 GB DDR4
GPU NVIDIA RTX 3060 Laptop (5.66 GB VRAM)
CUDA 12.4

Fuente: Elaboración propia.

Dependencias

Tabla A3. Dependencias del proyecto.

Componente Versión
Python 3.12.3
Docker 29.1.5
NVIDIA Container Toolkit Requerido para GPU
Ray 2.52.1
Optuna 4.7.0

Fuente: Elaboración propia.

A.4 Instrucciones de Ejecución de Servicios OCR

PaddleOCR (Puerto 8002)

Imágenes Docker:

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

DocTR (Puerto 8003)

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

cd src/doctr_service

# GPU
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

# GPU (usar archivo separado para evitar conflicto de puerto)
docker compose up -d

Verificar Estado del Servicio

# Verificar salud del servicio
curl http://localhost:8002/health

# Respuesta esperada:
# {"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
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
curl -X POST http://localhost:8002/evaluate_full \
  -H "Content-Type: application/json" \
  -d '{
    "pdf_folder": "/app/dataset",
    "use_doc_orientation_classify": true,
    "use_doc_unwarping": false,
    "textline_orientation": true,
    "text_det_thresh": 0.0462,
    "text_det_box_thresh": 0.4862,
    "text_det_unclip_ratio": 0.0,
    "text_rec_score_thresh": 0.5658,
    "save_output": true
  }'

A.6 Ajuste de Hiperparámetros con Ray Tune

Ejecutar Ajuste

cd src

# Activar entorno virtual
source ../.venv/bin/activate

# PaddleOCR (64 muestras)
python -c "
from raytune_ocr import *

ports = [8002]
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 A4. 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

Fuente: Elaboración propia.

Nota: Debido a limitaciones de recursos GPU (VRAM insuficiente para ejecutar múltiples modelos OCR simultáneamente), solo se ejecuta un servicio a la vez. PaddleOCR y EasyOCR comparten el puerto 8002. Para cambiar de servicio, detener el actual con docker compose down.

A.7 Métricas de Rendimiento

Esta sección presenta los resultados completos de las evaluaciones comparativas y del ajuste de hiperparámetros realizado con Ray Tune sobre los tres servicios OCR evaluados.

Comparativa General de Servicios

Tabla A5. Comparativa de servicios OCR en dataset de 45 páginas (GPU RTX 3060).

Servicio CER WER Tiempo/Página Tiempo Total VRAM
PaddleOCR (Mobile) 7.76% 11.62% 0.58s 32.0s 0.06 GB
EasyOCR 11.23% 36.36% 1.88s 88.5s ~2 GB
DocTR 12.06% 42.01% 0.50s 28.4s ~1 GB

Fuente: Benchmark realizado el 2026-01-19. Elaboración propia.

Ganador: PaddleOCR (Mobile) - Mejor precisión (7.76% CER) con velocidad competitiva y mínimo consumo de VRAM.

Resultados de Ajuste de Hiperparámetros

Se ejecutaron 64 trials por servicio utilizando Ray Tune con Optuna sobre las páginas 5-10 del primer documento.

Tabla A6. Resultados del ajuste de hiperparámetros por servicio.

Servicio CER Base CER Ajustado Mejora Mejor Trial (5 páginas)
PaddleOCR 8.85% 7.72% 12.8% 0.79%
DocTR 12.06% 12.07% 0% 7.43%
EasyOCR 11.23% 11.14% 0.8% 5.83%

Fuente: Resultados de 64 trials Ray Tune por servicio. Elaboración propia.

Nota sobre sobreajuste: La diferencia entre los resultados del mejor trial (subconjunto de 5 páginas) y el dataset completo (45 páginas) indica sobreajuste parcial a las páginas de ajuste. Un subconjunto más grande (15-20 páginas) mejoraría la generalización.

Configuración Óptima PaddleOCR

La siguiente configuración logró el mejor rendimiento en el ajuste de hiperparámetros:

{
  "use_doc_orientation_classify": true,
  "use_doc_unwarping": false,
  "textline_orientation": true,
  "text_det_thresh": 0.0462,
  "text_det_box_thresh": 0.4862,
  "text_det_unclip_ratio": 0.0,
  "text_rec_score_thresh": 0.5658
}

Hallazgos clave:

  • textline_orientation=true: Crítico para documentos con layouts mixtos
  • use_doc_orientation_classify=true: Mejora detección de orientación
  • use_doc_unwarping=false: Innecesario para PDFs digitales
  • text_det_thresh bajo (0.0462): Detección más sensible mejora resultados

Rendimiento CPU vs GPU

Tabla A7. Comparación de rendimiento CPU vs GPU (PaddleOCR).

Métrica CPU GPU (RTX 3060) Aceleración
Tiempo/Página 69.4s 0.55s 126x más rápido
Mejor CER 1.15% 0.79% GPU mejor
45 páginas ~52 min ~25 seg 126x más rápido

Fuente: Datos CPU de raytune_paddle_subproc_results_20251207_192320.csv. Elaboración propia.

Análisis de Errores por Servicio

Tabla A8. Tipos de errores identificados por servicio OCR.

Servicio Fortalezas Debilidades ¿Fine-tuning recomendado?
PaddleOCR Preserva estructura, buen manejo de español Errores menores de acentos (~5%) No (ya excelente)
DocTR Más rápido Pierde estructura, omite TODOS los diacríticos Sí (para diacríticos)
EasyOCR Modelo correcto para español Caracteres espurios, confunde o/0 Sí (problemas del detector)

Fuente: Análisis manual del debugset. Elaboración propia.

Archivos de Resultados

Los resultados crudos de los 64 trials por servicio están disponibles en el repositorio:

Tabla A9. Ubicación de archivos de resultados.

Servicio Archivo CSV
PaddleOCR src/results/raytune_paddle_results_20260119_122609.csv
DocTR src/results/raytune_doctr_results_20260119_121445.csv
EasyOCR src/results/raytune_easyocr_results_20260119_120204.csv

Fuente: Elaboración propia.

A.8 Licencia

El código se distribuye bajo licencia MIT.