2025-12-15 23:03:36 +01:00
|
|
|
# Anexo A. Código fuente y datos analizados {.unnumbered}
|
|
|
|
|
|
|
|
|
|
## A.1 Repositorio del Proyecto
|
|
|
|
|
|
|
|
|
|
El código fuente completo y los datos utilizados en este trabajo están disponibles en el siguiente repositorio:
|
|
|
|
|
|
|
|
|
|
**URL del repositorio:** https://github.com/seryus/MastersThesis
|
|
|
|
|
|
|
|
|
|
El repositorio incluye:
|
|
|
|
|
|
2026-01-19 17:35:24 +00:00
|
|
|
- **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
|
2025-12-15 23:03:36 +01:00
|
|
|
- **Dataset**: Imágenes y textos de referencia utilizados
|
2026-01-19 17:35:24 +00:00
|
|
|
- **Resultados**: Archivos CSV con los resultados de los 64 trials por servicio
|
2025-12-15 23:03:36 +01:00
|
|
|
|
|
|
|
|
## A.2 Estructura del Repositorio
|
|
|
|
|
|
|
|
|
|
```
|
2026-01-19 17:35:24 +00:00
|
|
|
MastersThesis/
|
|
|
|
|
├── docs/ # Documentación de la tesis
|
|
|
|
|
│ └── metrics/ # Métricas de rendimiento OCR
|
|
|
|
|
│ ├── metrics.md # Resumen comparativo
|
|
|
|
|
│ ├── metrics_paddle.md # Resultados PaddleOCR
|
|
|
|
|
│ ├── metrics_doctr.md # Resultados DocTR
|
|
|
|
|
│ └── metrics_easyocr.md # Resultados EasyOCR
|
|
|
|
|
├── src/
|
|
|
|
|
│ ├── paddle_ocr/ # Servicio PaddleOCR
|
|
|
|
|
│ │ ├── Dockerfile.gpu # Imagen Docker GPU
|
|
|
|
|
│ │ ├── Dockerfile.cpu # Imagen Docker CPU
|
|
|
|
|
│ │ ├── docker-compose.yml # Configuración Docker
|
|
|
|
|
│ │ └── main.py # API FastAPI
|
|
|
|
|
│ ├── doctr_service/ # Servicio DocTR
|
|
|
|
|
│ │ ├── Dockerfile.gpu
|
|
|
|
|
│ │ ├── docker-compose.yml
|
|
|
|
|
│ │ └── main.py
|
|
|
|
|
│ ├── easyocr_service/ # Servicio EasyOCR
|
|
|
|
|
│ │ ├── Dockerfile.gpu
|
|
|
|
|
│ │ ├── docker-compose.yml
|
|
|
|
|
│ │ └── main.py
|
|
|
|
|
│ ├── dataset/ # Dataset de evaluación
|
|
|
|
|
│ ├── raytune_ocr.py # Utilidades compartidas Ray Tune
|
|
|
|
|
│ └── results/ # Resultados de ajuste CSV
|
|
|
|
|
└── .gitea/workflows/ci.yaml # Pipeline CI/CD
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## A.3 Requisitos de Software
|
2025-12-16 00:25:16 +01:00
|
|
|
|
2026-01-19 17:35:24 +00:00
|
|
|
### Sistema de Desarrollo
|
2025-12-16 00:25:16 +01:00
|
|
|
|
2026-01-19 17:35:24 +00:00
|
|
|
**Tabla A1.** *Especificaciones del sistema de desarrollo.*
|
2025-12-15 23:03:36 +01:00
|
|
|
|
2026-01-19 17:35:24 +00:00
|
|
|
| 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 |
|
2025-12-15 23:03:36 +01:00
|
|
|
|
2026-01-19 17:35:24 +00:00
|
|
|
*Fuente: Elaboración propia.*
|
|
|
|
|
|
|
|
|
|
### Dependencias
|
|
|
|
|
|
|
|
|
|
**Tabla A2.** *Dependencias del proyecto.*
|
2025-12-15 23:03:36 +01:00
|
|
|
|
|
|
|
|
| Componente | Versión |
|
|
|
|
|
|------------|---------|
|
2026-01-19 17:35:24 +00:00
|
|
|
| Python | 3.12.3 |
|
|
|
|
|
| Docker | 29.1.5 |
|
|
|
|
|
| NVIDIA Container Toolkit | Requerido para GPU |
|
2025-12-15 23:03:36 +01:00
|
|
|
| Ray | 2.52.1 |
|
2026-01-19 17:35:24 +00:00
|
|
|
| Optuna | 4.7.0 |
|
|
|
|
|
|
|
|
|
|
*Fuente: Elaboración propia.*
|
|
|
|
|
|
|
|
|
|
## A.4 Instrucciones de Ejecución de Servicios OCR
|
|
|
|
|
|
|
|
|
|
### PaddleOCR (Puerto 8002)
|
|
|
|
|
|
|
|
|
|
**Imágenes Docker:**
|
|
|
|
|
- GPU: `seryus.ddns.net/unir/paddle-ocr-gpu`
|
|
|
|
|
- CPU: `seryus.ddns.net/unir/paddle-ocr-cpu`
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
cd src/paddle_ocr
|
|
|
|
|
|
|
|
|
|
# GPU (recomendado)
|
|
|
|
|
docker compose up -d
|
|
|
|
|
|
|
|
|
|
# CPU (más lento, 126x)
|
|
|
|
|
docker compose -f docker-compose.cpu-registry.yml up -d
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### DocTR (Puerto 8003)
|
|
|
|
|
|
|
|
|
|
**Imagen Docker:** `seryus.ddns.net/unir/doctr-gpu`
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
cd src/doctr_service
|
|
|
|
|
|
|
|
|
|
# GPU
|
|
|
|
|
docker compose up -d
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### EasyOCR (Puerto 8002)
|
|
|
|
|
|
|
|
|
|
**Imagen Docker:** `seryus.ddns.net/unir/easyocr-gpu`
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
cd src/easyocr_service
|
|
|
|
|
|
|
|
|
|
# GPU
|
|
|
|
|
docker compose up -d
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Verificar Estado del Servicio
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 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
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 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
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 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
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
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 A3.** *Servicios Docker y puertos.*
|
|
|
|
|
|
|
|
|
|
| Servicio | Puerto | Script de Ajuste |
|
|
|
|
|
|----------|--------|------------------|
|
|
|
|
|
| PaddleOCR | 8002 | `paddle_ocr_payload` |
|
|
|
|
|
| DocTR | 8003 | `doctr_payload` |
|
|
|
|
|
| EasyOCR | 8002 | `easyocr_payload` |
|
|
|
|
|
|
|
|
|
|
*Fuente: Elaboración propia.*
|
|
|
|
|
|
|
|
|
|
## A.7 Métricas de Rendimiento
|
|
|
|
|
|
|
|
|
|
Los resultados detallados de las evaluaciones y ajustes de hiperparámetros se encuentran en:
|
|
|
|
|
|
|
|
|
|
- [Métricas Generales](metrics/metrics.md) - Comparativa de los tres servicios
|
|
|
|
|
- [PaddleOCR](metrics/metrics_paddle.md) - Mejor precisión (7.76% CER baseline, **1.49% optimizado**)
|
|
|
|
|
- [DocTR](metrics/metrics_doctr.md) - Más rápido (0.50s/página)
|
|
|
|
|
- [EasyOCR](metrics/metrics_easyocr.md) - Balance intermedio
|
|
|
|
|
|
|
|
|
|
### Resumen de Resultados
|
|
|
|
|
|
|
|
|
|
**Tabla A4.** *Resumen de resultados del benchmark por servicio.*
|
2025-12-15 23:03:36 +01:00
|
|
|
|
2026-01-19 17:35:24 +00:00
|
|
|
| Servicio | CER Base | CER Ajustado | Mejora |
|
|
|
|
|
|----------|----------|--------------|--------|
|
|
|
|
|
| **PaddleOCR** | 8.85% | **7.72%** | 12.8% |
|
|
|
|
|
| DocTR | 12.06% | 12.07% | 0% |
|
|
|
|
|
| EasyOCR | 11.23% | 11.14% | 0.8% |
|
2025-12-15 23:03:36 +01:00
|
|
|
|
2026-01-19 17:35:24 +00:00
|
|
|
*Fuente: Elaboración propia.*
|
2025-12-15 23:03:36 +01:00
|
|
|
|
2026-01-19 17:35:24 +00:00
|
|
|
## A.8 Licencia
|
2025-12-15 23:03:36 +01:00
|
|
|
|
|
|
|
|
El código se distribuye bajo licencia MIT.
|