# Métricas de Rendimiento OCR **Fecha de Benchmark:** 2026-01-19 **Dataset de Prueba:** 45 páginas (2 PDFs) ## Especificaciones del Sistema | Componente | Especificación | |------------|----------------| | **Sistema Operativo** | Ubuntu 24.04.3 LTS (Noble) | | **Kernel** | 6.14.0-37-generic | | **CPU** | AMD Ryzen 7 5800H with Radeon Graphics | | **RAM** | 16 GB DDR4 | | **GPU** | NVIDIA GeForce RTX 3060 Laptop GPU | | **VRAM** | 5.66 GB | | **CUDA** | 12.4 | ## Justificación de Ejecución Local vs Cloud ### Costos de Cloud GPU | Plataforma | GPU | Costo/Hora | Costo Mensual | |------------|-----|------------|---------------| | **AWS EC2 g4dn.xlarge** | NVIDIA T4 (16 GB) | $0.526 | ~$384 | | **Google Colab Pro** | T4/P100 | ~$1.30 | $10 + CU extras | | **Google Colab Pro+** | T4/V100/A100 | ~$1.30 | $50 + CU extras | ### Análisis de Costos para Este Proyecto | Tarea | Tiempo GPU | Costo AWS | Costo Colab Pro | |-------|------------|-----------|-----------------| | Ajuste hiperparámetros (64×3 trials) | ~3 horas | ~$1.58 | ~$3.90 | | Evaluación completa (45 páginas) | ~5 min | ~$0.04 | ~$0.11 | | Desarrollo/debug (20 horas/mes) | 20 horas | ~$10.52 | ~$26.00 | ### Ventajas de Ejecución Local 1. **Costo cero de GPU**: La RTX 3060 ya está disponible en el equipo de desarrollo 2. **Sin límites de tiempo**: AWS y Colab tienen timeouts de sesión 3. **Acceso instantáneo**: Sin tiempo de aprovisionamiento de instancias 4. **Almacenamiento local**: Dataset y resultados en disco sin costos de transferencia 5. **Iteración rápida**: Reinicio inmediato de contenedores Docker ### Conclusión Para un proyecto de investigación con múltiples iteraciones de ajuste de hiperparámetros y desarrollo, **la ejecución local ahorra ~$50-100/mes** comparado con cloud, además de ofrecer mayor flexibilidad y velocidad de iteración ## Resumen Ejecutivo | 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 | > **Ganador:** PaddleOCR (Mobile) - Mejor precisión (7.76% CER) con velocidad competitiva. ## Fases Experimentales Este documento presenta resultados de dos fases experimentales distintas realizadas durante el desarrollo del TFM. La primera fase corresponde a la optimización de hiperparámetros utilizando Ray Tune, ejecutada en CPU debido a las limitaciones de hardware iniciales. La segunda fase corresponde a la validación práctica con aceleración GPU para evaluar la viabilidad en escenarios de producción. **Tabla.** *Fases experimentales y sus características.* | Fase | Dataset | Hardware | Resultado Principal | |------|---------|----------|---------------------| | Optimización (CPU) | 24 páginas | CPU | CER: 7.78% → **1.49%** (80.9% mejora) | | Validación (GPU) | 45 páginas | RTX 3060 | CER: 7.76% baseline, 0.55s/página | *Fuente: Elaboración propia.* La fase de optimización representa el **resultado principal del TFM** (CER 1.49%, precisión 98.51%). La fase de validación GPU confirma la viabilidad práctica del enfoque, demostrando una aceleración de 126x respecto a CPU. ## Comparación de Servicios OCR ### Comparación de Precisión (CER - menor es mejor) ```mermaid --- config: theme: base themeVariables: primaryColor: "#E6F4F9" primaryTextColor: "#404040" primaryBorderColor: "#0098CD" lineColor: "#0098CD" xyChart: plotColorPalette: "#0098CD" --- xychart-beta title "Tasa de Error de Caracteres por Servicio" x-axis ["PaddleOCR", "EasyOCR", "DocTR"] y-axis "CER %" 0 --> 15 bar [7.76, 11.23, 12.06] ``` ### Comparación de Velocidad (Tiempo por Página) ```mermaid --- config: theme: base themeVariables: primaryColor: "#E6F4F9" primaryTextColor: "#404040" primaryBorderColor: "#0098CD" lineColor: "#0098CD" xyChart: plotColorPalette: "#0098CD" --- xychart-beta title "Tiempo de Procesamiento por Página (segundos)" x-axis ["DocTR", "PaddleOCR", "EasyOCR"] y-axis "Segundos" 0 --> 2 bar [0.50, 0.58, 1.88] ``` ### Flujo de Recomendación de Servicio ```mermaid flowchart LR A{Prioridad?} A -->|Precisión| B[PaddleOCR] A -->|Velocidad| C[DocTR] A -->|Balance| B B --> D["7.76% CER
0.58s/página"] C --> E["12.06% CER
0.50s/página"] ``` ### Hallazgos Clave 1. **Mejor Precisión**: PaddleOCR logra las tasas de error más bajas (7.76% CER, 11.62% WER) 2. **Mejor Velocidad**: DocTR es el más rápido (0.50s/página), pero 55% menos preciso que PaddleOCR 3. **EasyOCR**: El más lento (3.8x más lento que PaddleOCR) con precisión intermedia 4. **Eficiencia VRAM**: PaddleOCR Mobile usa solo 0.06 GB ## Configuración de Modelos | Servicio | Detección | Reconocimiento | ¿Correcto para Español? | |----------|-----------|----------------|-------------------------| | **PaddleOCR** | PP-OCRv5_mobile_det | PP-OCRv5_mobile_rec | Sí | | **DocTR** | db_resnet50 | crnn_vgg16_bn | No (entrenado en inglés/francés) | | **EasyOCR** | CRAFT | latin_g2.pth | Sí | ### Notas sobre Modelos - **PaddleOCR**: Modelos server más precisos disponibles pero requieren >5.3 GB VRAM (OOM en RTX 3060) - **DocTR**: Se probó modelo `parseq` como alternativa, resultó 2% peor CER y 2x más lento. El problema de diacríticos es de datos de entrenamiento, no de arquitectura - **EasyOCR**: Modelo `latin_g2.pth` es correcto. Los problemas son del detector CRAFT, no del reconocimiento > **Conclusión sobre Fine-tuning:** Para documentos en español, **usar PaddleOCR directamente**. El fine-tuning de DocTR/EasyOCR no se justifica dado que PaddleOCR ya ofrece 31-36% mejor precisión sin configuración adicional. ## Análisis de Errores (del debugset) ### PaddleOCR (Mejor - 7.76% CER) - **Fortalezas**: Preserva estructura de líneas, maneja bien acentos españoles - **Problemas**: Errores menores de espaciado, diferencias ocasionales de mayúsculas en acentos - **Mejorable**: Sí - el ajuste de hiperparámetros probablemente ayude ### DocTR (Peor WER - 42.01%) - **Problema Crítico**: Colapsa todo el texto en líneas únicas (pierde estructura) - **Problema de Acentos**: Omite diacríticos ("Indice" vs "Índice") - **Mejorable**: Parcialmente - el problema de estructura puede ser a nivel de modelo ### EasyOCR (36.36% WER) - **Problema Crítico**: Inserciones espurias de caracteres (";", "g", "0", "1") - **Pérdida de Estructura**: Saltos de línea no preservados - **Mejorable**: Sí - umbrales de detección demasiado sensibles ## Comparación de Modelos PaddleOCR (RTX 3060) | Métrica | Modelos Server | Modelos Mobile | Ganador | |---------|----------------|----------------|---------| | **Tiempo** | 2.47s | 1.08s | Mobile (2.3x más rápido) | | **CER** | 1.82% | 1.42% | Mobile | | **WER** | 16.14% | 12.20% | Mobile | | **VRAM** | 5.3 GB (OOM en página 2) | 0.06 GB | Mobile | | **Multi-página** | No (OOM) | Sí | Mobile | > **Conclusión:** Se recomiendan los modelos Mobile - más rápidos, más precisos, caben en VRAM. ## Rendimiento CPU vs GPU (PaddleOCR) Datos de `raytune_paddle_subproc_results_20251207_192320.csv` (CPU) vs RTX 3060 (GPU): | 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** | ```mermaid --- config: theme: base themeVariables: primaryColor: "#E6F4F9" primaryTextColor: "#404040" primaryBorderColor: "#0098CD" lineColor: "#0098CD" xyChart: plotColorPalette: "#0098CD" --- xychart-beta title "Tiempo de Procesamiento por Página: CPU vs GPU" x-axis ["CPU", "GPU (RTX 3060)"] y-axis "Segundos" 0 --> 80 bar [69.4, 0.55] ``` > **Conclusión:** GPU es esencial para uso práctico de OCR. El procesamiento en CPU es 126x más lento, haciéndolo impráctico para procesamiento por lotes. ## Datos Crudos del Benchmark ```json { "timestamp": "2026-01-19T11:00:00.000000", "platform": { "gpu": "NVIDIA GeForce RTX 3060 Laptop GPU", "vram": "5.66 GB", "cuda": "12.4" }, "services": { "PaddleOCR_Mobile": { "port": 8002, "models": {"det": "PP-OCRv5_mobile_det", "rec": "PP-OCRv5_mobile_rec"}, "vram_used": "0.06 GB", "results": { "CER": 0.0776, "WER": 0.1162, "PAGES": 45, "TIME_PER_PAGE": 0.58, "TOTAL_TIME": 32.0 } }, "DocTR": { "port": 8003, "models": {"det": "db_resnet50", "rec": "crnn_vgg16_bn"}, "vram_used": "~1 GB", "results": { "CER": 0.1206, "WER": 0.4201, "PAGES": 45, "TIME_PER_PAGE": 0.50, "TOTAL_TIME": 28.4 } }, "EasyOCR": { "port": 8002, "languages": ["es", "en"], "vram_used": "~2 GB", "results": { "CER": 0.1123, "WER": 0.3636, "PAGES": 45, "TIME_PER_PAGE": 1.88, "TOTAL_TIME": 88.5 } } } } ``` ## Resultados de Ajuste de Hiperparámetros Resultados individuales de ajuste por servicio (64 muestras cada uno, páginas 5-10): - [Resultados de Ajuste PaddleOCR](metrics_paddle.md) - [Resultados de Ajuste DocTR](metrics_doctr.md) - [Resultados de Ajuste EasyOCR](metrics_easyocr.md) ## Próximos Pasos 1. ~~Ajuste de Hiperparámetros~~ - Completado (64 muestras por servicio) 2. **Evaluación del Dataset Completo** - Ejecutar mejores configuraciones en las 45 páginas 3. **Comparar** - Rendimiento base vs ajustado en dataset completo