All checks were successful
build_docker / essential (push) Successful in 0s
build_docker / build_paddle_ocr (push) Successful in 5m28s
build_docker / build_paddle_ocr_gpu (push) Successful in 21m16s
build_docker / build_easyocr (push) Successful in 15m52s
build_docker / build_easyocr_gpu (push) Successful in 18m22s
build_docker / build_doctr (push) Successful in 19m3s
build_docker / build_raytune (push) Successful in 3m34s
build_docker / build_doctr_gpu (push) Successful in 13m56s
276 lines
9.8 KiB
Markdown
276 lines
9.8 KiB
Markdown
# 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<br/>0.58s/página"]
|
||
C --> E["12.06% CER<br/>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
|