Files
MastersThesis/README.md

378 lines
15 KiB
Markdown
Raw Normal View History

2025-12-10 16:06:47 +01:00
# Optimización de Hiperparámetros OCR con Ray Tune para Documentos Académicos en Español
2025-10-08 09:45:22 +02:00
2025-12-10 16:06:47 +01:00
**Trabajo Fin de Máster (TFM) Máster Universitario en Inteligencia Artificial**
**Líneas:** Percepción computacional · Aprendizaje automático
**Autor:** Sergio Jiménez Jiménez · **UNIR** · **Año:** 2025
2025-10-08 09:46:57 +02:00
2025-12-10 16:06:47 +01:00
> Optimización sistemática de hiperparámetros de **PaddleOCR (PP-OCRv5)** mediante **Ray Tune** con **Optuna** para mejorar el reconocimiento óptico de caracteres en documentos académicos en español.
2025-10-08 09:45:22 +02:00
---
2025-12-10 16:06:47 +01:00
## Objetivo
2025-10-08 09:45:22 +02:00
2025-12-10 16:06:47 +01:00
Optimizar el rendimiento de PaddleOCR para documentos académicos en español mediante ajuste de hiperparámetros, alcanzando un **CER inferior al 2%** sin requerir fine-tuning del modelo ni recursos GPU dedicados.
2025-10-12 14:35:21 +00:00
2025-12-10 16:06:47 +01:00
**Resultado alcanzado:** CER = **1.49%** (objetivo cumplido)
2025-10-08 09:45:22 +02:00
---
2025-12-10 16:06:47 +01:00
## Resultados Principales
2025-10-08 09:45:22 +02:00
2026-01-19 16:32:45 +01:00
**Tabla.** *Comparación de métricas OCR entre configuración baseline y optimizada.*
2025-12-10 16:06:47 +01:00
| Modelo | CER | Precisión Caracteres | WER | Precisión Palabras |
|--------|-----|---------------------|-----|-------------------|
| PaddleOCR (Baseline) | 7.78% | 92.22% | 14.94% | 85.06% |
| **PaddleOCR-HyperAdjust** | **1.49%** | **98.51%** | **7.62%** | **92.38%** |
2026-01-19 16:32:45 +01:00
*Fuente: Elaboración propia.*
2025-12-10 16:06:47 +01:00
**Mejora obtenida:** Reducción del CER en un **80.9%**
### Configuración Óptima Encontrada
```python
config_optimizada = {
"textline_orientation": True, # CRÍTICO - reduce CER ~70%
"use_doc_orientation_classify": False,
"use_doc_unwarping": False,
"text_det_thresh": 0.4690, # Correlación -0.52 con CER
"text_det_box_thresh": 0.5412,
"text_det_unclip_ratio": 0.0,
"text_rec_score_thresh": 0.6350,
}
```
---
## Metodología
### Pipeline de Trabajo
```
PDF (académico UNIR)
└─► Conversión a imagen (PyMuPDF, 300 DPI)
└─► Extracción de ground truth
└─► OCR con PaddleOCR (PP-OCRv5)
└─► Evaluación (CER, WER con jiwer)
└─► Optimización (Ray Tune + Optuna)
```
### Experimento de Optimización
2026-01-19 16:32:45 +01:00
**Tabla.** *Parámetros de configuración del experimento Ray Tune.*
2025-12-10 16:06:47 +01:00
| Parámetro | Valor |
|-----------|-------|
| Número de trials | 64 |
| Algoritmo de búsqueda | OptunaSearch (TPE) |
| Métrica objetivo | CER (minimizar) |
| Trials concurrentes | 2 |
| Tiempo total | ~6 horas (CPU) |
2026-01-19 16:32:45 +01:00
*Fuente: Elaboración propia.*
2025-12-10 16:06:47 +01:00
---
## Estructura del Repositorio
```
MastersThesis/
2025-12-16 00:00:58 +01:00
├── docs/ # Capítulos del TFM en Markdown (estructura UNIR)
│ ├── 00_resumen.md # Resumen + Abstract + Keywords
2025-12-15 23:28:21 +01:00
│ ├── 01_introduccion.md # Cap. 1: Introducción (1.1-1.3)
│ ├── 02_contexto_estado_arte.md # Cap. 2: Contexto y estado del arte (2.1-2.3)
│ ├── 03_objetivos_metodologia.md # Cap. 3: Objetivos y metodología (3.1-3.4)
│ ├── 04_desarrollo_especifico.md # Cap. 4: Desarrollo específico (4.1-4.3)
│ ├── 05_conclusiones_trabajo_futuro.md # Cap. 5: Conclusiones (5.1-5.2)
│ ├── 06_referencias_bibliograficas.md # Referencias bibliográficas (APA)
│ └── 07_anexo_a.md # Anexo A: Código fuente y datos
2025-12-16 00:00:58 +01:00
├── thesis_output/ # Documento final generado
│ ├── plantilla_individual.htm # TFM completo (abrir en Word)
│ └── figures/ # Figuras generadas desde Mermaid
│ ├── figura_1.png ... figura_7.png
│ └── figures_manifest.json
2025-12-10 16:06:47 +01:00
├── src/
│ ├── paddle_ocr_fine_tune_unir_raytune.ipynb # Experimento principal
2025-12-15 23:28:21 +01:00
│ ├── paddle_ocr_tuning.py # Script de evaluación CLI
2025-12-10 16:06:47 +01:00
│ ├── dataset_manager.py # Clase ImageTextDataset
│ ├── prepare_dataset.ipynb # Preparación del dataset
│ └── raytune_paddle_subproc_results_*.csv # Resultados de 64 trials
├── results/ # Resultados de benchmarks
2025-12-15 23:28:21 +01:00
├── instructions/ # Plantilla e instrucciones UNIR
│ ├── instrucciones.pdf
│ ├── plantilla_individual.pdf
│ └── plantilla_individual.htm
2025-12-16 00:00:58 +01:00
├── apply_content.py # Genera documento TFM desde docs/ + plantilla
├── generate_mermaid_figures.py # Convierte diagramas Mermaid a PNG
2025-12-10 16:06:47 +01:00
├── ocr_benchmark_notebook.ipynb # Benchmark comparativo inicial
└── README.md
```
---
## Hallazgos Clave
1. **`textline_orientation=True` es crítico**: Reduce el CER en un 69.7%. Para documentos con layouts mixtos (tablas, encabezados), la clasificación de orientación de línea es esencial.
2. **Umbral `text_det_thresh` importante**: Correlación -0.52 con CER. Valores óptimos entre 0.4-0.5. Valores < 0.1 causan fallos catastróficos (CER >40%).
3. **Componentes innecesarios para PDFs digitales**: `use_doc_orientation_classify` y `use_doc_unwarping` no mejoran el rendimiento en documentos académicos digitales.
---
2026-01-19 13:41:07 +01:00
## Rendimiento GPU
Se realizó una validación adicional con aceleración GPU para evaluar la viabilidad práctica del enfoque en escenarios de producción.
**Tabla.** *Comparación de rendimiento CPU vs GPU.*
| Métrica | CPU | GPU (RTX 3060) | Aceleración |
|---------|-----|----------------|-------------|
| Tiempo/Página | 69.4s | 0.55s | **126x** |
| Dataset completo (45 páginas) | ~52 min | ~25 seg | **126x** |
*Fuente: Elaboración propia.*
### Recomendación de Modelos
**Tabla.** *Comparación de modelos PaddleOCR en RTX 3060.*
| Modelo | VRAM | Recomendación |
|--------|------|---------------|
| **PP-OCRv5 Mobile** | 0.06 GB | ✓ Recomendado |
| PP-OCRv5 Server | 5.3 GB | ✗ Causa OOM en RTX 3060 |
*Fuente: Elaboración propia.*
**Conclusión:** Para hardware con VRAM limitada (≤6 GB), los modelos Mobile ofrecen el mejor balance entre precisión y recursos. La aceleración GPU hace viable el procesamiento en tiempo real.
---
2025-12-10 16:06:47 +01:00
## Requisitos
2026-01-19 16:32:45 +01:00
**Tabla.** *Dependencias principales del proyecto y versiones utilizadas.*
2025-12-10 16:06:47 +01:00
| Componente | Versión |
|------------|---------|
2026-01-19 16:32:45 +01:00
| Python | 3.12.3 |
2025-12-10 16:06:47 +01:00
| PaddlePaddle | 3.2.2 |
| PaddleOCR | 3.3.2 |
| Ray | 2.52.1 |
2026-01-19 16:32:45 +01:00
| Optuna | 4.7.0 |
2025-12-10 16:06:47 +01:00
| jiwer | (para métricas CER/WER) |
| PyMuPDF | (para conversión PDF) |
2025-10-08 09:45:22 +02:00
2026-01-19 16:32:45 +01:00
*Fuente: Elaboración propia.*
2025-10-08 09:45:22 +02:00
---
2025-12-10 16:06:47 +01:00
## Uso
### Preparar dataset
```bash
# Ejecutar prepare_dataset.ipynb para convertir PDF a imágenes y extraer ground truth
jupyter notebook src/prepare_dataset.ipynb
```
2025-10-12 14:35:21 +00:00
2025-12-10 16:06:47 +01:00
### Ejecutar optimización
```bash
# Ejecutar el notebook principal de Ray Tune
jupyter notebook src/paddle_ocr_fine_tune_unir_raytune.ipynb
2025-10-12 14:35:21 +00:00
```
2025-10-08 09:45:22 +02:00
2025-12-10 16:06:47 +01:00
### Evaluación individual
```bash
python src/paddle_ocr_tuning.py \
--pdf-folder ./dataset \
--textline-orientation True \
--text-det-thresh 0.469 \
--text-det-box-thresh 0.541 \
--text-rec-score-thresh 0.635
```
---
## Fuentes de Datos
2026-01-19 14:00:28 +01:00
- **Dataset**: 2 documentos UNIR (45 páginas total): Instrucciones TFE (24 pág.) + Plantilla TFE (21 pág.)
2025-12-16 00:48:14 +01:00
- **Resultados Ray Tune (PRINCIPAL)**: `src/raytune_paddle_subproc_results_20251207_192320.csv` - 64 trials de optimización con todas las métricas y configuraciones
2025-12-10 16:06:47 +01:00
---
2025-12-16 00:00:58 +01:00
## Generación del Documento TFM
2025-12-16 00:48:14 +01:00
### Prerrequisitos
2025-12-16 00:00:58 +01:00
```bash
2025-12-16 00:48:14 +01:00
# Instalar dependencias de Python
pip install beautifulsoup4
# Instalar mermaid-cli para generación de figuras
npm install @mermaid-js/mermaid-cli
```
### Flujo de Generación del Documento
El documento TFM se genera en **3 pasos** que deben ejecutarse en orden:
```
┌─────────────────────────────────────────────────────────────────────┐
│ PASO 1: generate_mermaid_figures.py │
│ ────────────────────────────────────────────────────────────────── │
│ • Lee diagramas Mermaid de docs/*.md │
│ • Genera thesis_output/figures/figura_*.png │
│ • Crea figures_manifest.json con títulos │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ PASO 2: apply_content.py │
│ ────────────────────────────────────────────────────────────────── │
│ • Lee plantilla desde instructions/plantilla_individual.htm │
│ • Inserta contenido de docs/*.md en cada capítulo │
│ • Genera tablas con formato APA y figuras con referencias │
│ • Guarda en thesis_output/plantilla_individual.htm │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ PASO 3: Abrir en Microsoft Word │
│ ────────────────────────────────────────────────────────────────── │
│ • Abrir thesis_output/plantilla_individual.htm │
│ • Ctrl+A → F9 para actualizar índices (contenidos/figuras/tablas) │
│ • Guardar como TFM_Sergio_Jimenez.docx │
└─────────────────────────────────────────────────────────────────────┘
```
### Comandos de Generación
```bash
# Desde el directorio raíz del proyecto:
# PASO 1: Generar figuras PNG desde diagramas Mermaid
2025-12-16 00:00:58 +01:00
python3 generate_mermaid_figures.py
2025-12-16 00:48:14 +01:00
# Output: thesis_output/figures/figura_1.png ... figura_8.png
2025-12-16 00:00:58 +01:00
2025-12-16 00:48:14 +01:00
# PASO 2: Aplicar contenido de docs/ a la plantilla UNIR
2025-12-16 00:00:58 +01:00
python3 apply_content.py
2025-12-16 00:48:14 +01:00
# Output: thesis_output/plantilla_individual.htm
2025-12-16 00:00:58 +01:00
2025-12-16 00:48:14 +01:00
# PASO 3: Abrir en Word y finalizar documento
2025-12-16 00:00:58 +01:00
# - Abrir thesis_output/plantilla_individual.htm en Microsoft Word
2025-12-16 00:48:14 +01:00
# - Ctrl+A → F9 para actualizar todos los índices
# - IMPORTANTE: Ajustar manualmente el tamaño de las imágenes para legibilidad
# (seleccionar imagen → clic derecho → Tamaño y posición → ajustar al ancho de página)
2025-12-16 00:00:58 +01:00
# - Guardar como .docx
```
2025-12-16 00:48:14 +01:00
### Notas Importantes para Edición en Word
1. **Ajuste de imágenes**: Las figuras Mermaid pueden requerir ajuste manual de tamaño para ser legibles. Seleccionar cada imagen y ajustar al ancho de texto (~16cm).
2. **Actualización de índices**: Después de cualquier cambio, usar Ctrl+A → F9 para regenerar índices.
3. **Formato de código**: Los bloques de código usan Consolas 9pt. Verificar que no se corten líneas largas.
### Archivos de Entrada y Salida
2026-01-19 16:32:45 +01:00
**Tabla.** *Relación de scripts de generación con sus archivos de entrada y salida.*
2025-12-16 00:48:14 +01:00
| Script | Entrada | Salida |
|--------|---------|--------|
| `generate_mermaid_figures.py` | `docs/*.md` (bloques ```mermaid```) | `thesis_output/figures/figura_*.png`, `figures_manifest.json` |
| `apply_content.py` | `instructions/plantilla_individual.htm`, `docs/*.md`, `thesis_output/figures/*.png` | `thesis_output/plantilla_individual.htm` |
2026-01-19 16:32:45 +01:00
*Fuente: Elaboración propia.*
2025-12-16 00:48:14 +01:00
### Contenido Generado Automáticamente
2026-01-19 16:56:48 +01:00
- **53 tablas** con formato APA (Tabla X. *Título* + Fuente: ...)
2025-12-16 00:48:14 +01:00
- **8 figuras** desde Mermaid (Figura X. *Título* + Fuente: Elaboración propia)
- **25 referencias** en formato APA con sangría francesa
- **Resumen/Abstract** con palabras clave
- **Índices** actualizables (contenidos, figuras, tablas)
2025-12-16 00:00:58 +01:00
- Eliminación automática de textos de instrucción de la plantilla
---
2025-12-10 16:06:47 +01:00
## Trabajo Pendiente para Completar el TFM
2026-01-19 13:41:07 +01:00
### Contexto: Hardware
Este trabajo adoptó la estrategia de **optimización de hiperparámetros** en lugar de **fine-tuning** debido a que el fine-tuning de modelos OCR requiere datasets etiquetados extensos y tiempos de entrenamiento prohibitivos.
2025-12-10 16:06:47 +01:00
2026-01-19 13:41:07 +01:00
**Hardware utilizado:**
- **Optimización (CPU)**: Los 64 trials de Ray Tune se ejecutaron en CPU (~69s/página)
- **Validación (GPU)**: Se validó con RTX 3060 logrando 126x de aceleración (0.55s/página)
2025-12-10 16:06:47 +01:00
La optimización de hiperparámetros demostró ser una **alternativa efectiva** al fine-tuning, logrando una reducción del 80.9% en el CER sin reentrenar el modelo.
2026-01-19 14:00:28 +01:00
### Tareas Pendientes
2025-12-16 00:00:58 +01:00
2026-01-19 14:00:28 +01:00
#### Obligatorias para Entrega
- [ ] **Revisión final del documento**: Abrir en Word, actualizar índices (Ctrl+A → F9), ajustar figuras, guardar como .docx
- [ ] **Crear presentación**: Preparar slides para la defensa del TFM
2025-12-16 00:00:58 +01:00
2026-01-19 14:00:28 +01:00
#### Opcionales (Mejoras Futuras)
- [ ] **Validación cruzada**: Evaluar configuración en otros documentos (facturas, formularios)
- [ ] **Explorar `text_det_unclip_ratio`**: Parámetro fijado en 0.0, podría mejorar resultados
- [ ] **Comparativa con fine-tuning**: Cuantificar brecha vs fine-tuning real
- [ ] **Herramienta de configuración automática**: Auto-detectar configuración óptima por documento
- [ ] **Benchmark público para español**: Facilitar comparación de soluciones OCR
2025-12-10 16:06:47 +01:00
2026-01-19 14:00:28 +01:00
#### Completadas
- [x] **Estructura docs/ según plantilla UNIR**
- [x] **Diagramas Mermaid**: 8 figuras generadas
- [x] **Documento TFM unificado**: Script `apply_content.py`
- [x] **Evaluación con GPU**: RTX 3060 - 126x más rápido (0.55s/página)
2025-12-10 16:06:47 +01:00
2026-01-19 14:00:28 +01:00
### Dataset
2025-12-10 16:06:47 +01:00
2026-01-19 14:00:28 +01:00
El dataset contiene **45 páginas** de 2 documentos UNIR:
- `src/dataset/0/`: Instrucciones TFE (24 páginas)
- `src/dataset/1/`: Plantilla TFE (21 páginas)
2025-12-10 16:06:47 +01:00
2026-01-19 14:00:28 +01:00
#### Formato Hugging Face
El dataset está disponible en formato Hugging Face en `src/dataset_hf/`:
```
src/dataset_hf/
├── README.md # Dataset card
├── metadata.jsonl # Metadata (image_path, text, doc_id, page_num)
└── data/ # 45 imágenes PNG
```
2025-12-10 16:06:47 +01:00
2026-01-19 14:00:28 +01:00
#### Generar/Regenerar Dataset
2025-12-10 16:06:47 +01:00
2026-01-19 14:00:28 +01:00
```bash
# Convertir de formato original a HF
source .venv/bin/activate
python src/dataset_formatting/convert_to_hf_dataset.py
# Upload a Gitea packages (requiere GITEA_TOKEN)
./src/dataset_formatting/upload-dataset.sh $GITEA_TOKEN
```
#### Descargar Dataset
```bash
# Desde Gitea packages
curl -O https://seryus.ddns.net/api/packages/unir/generic/ocr-dataset-spanish/1.0.0/dataset-1.0.0.tar.gz
tar -xzf dataset-1.0.0.tar.gz -C src/dataset_hf/
```
2025-12-10 16:06:47 +01:00
---
## Licencia
Este proyecto es parte de un Trabajo Fin de Máster académico.
---
## Referencias
2025-09-23 10:14:19 +00:00
2025-12-10 16:06:47 +01:00
- [PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR)
- [Ray Tune](https://docs.ray.io/en/latest/tune/index.html)
- [Optuna](https://optuna.org/)
- [jiwer](https://github.com/jitsi/jiwer)