Markdown chapters.
This commit is contained in:
225
README.md
225
README.md
@@ -1,53 +1,206 @@
|
||||
# Sistema OCR multimotor con IA para PDFs escaneados en español
|
||||
# Optimización de Hiperparámetros OCR con Ray Tune para Documentos Académicos en Español
|
||||
|
||||
**Trabajo Fin de Máster (TFM) – Tipo 2: Desarrollo de Software**
|
||||
**Líneas:** Percepción computacional · Aprendizaje automático
|
||||
**Autor:** Sergio Jiménez Jiménez · **UNIR** · **Año:** 2025
|
||||
**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
|
||||
|
||||
> Extracción de texto desde **PDFs escaneados** en **español** mediante **motores OCR basados en IA** (EasyOCR · PaddleOCR · DocTR).
|
||||
> Se excluyen soluciones clásicas como **Tesseract** o propietarias como **ABBYY**, centrando el proyecto en modelos neuronales modernos.
|
||||
> 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.
|
||||
|
||||
---
|
||||
|
||||
## 🧭 Objetivo
|
||||
## Objetivo
|
||||
|
||||
Desarrollar y evaluar un **sistema OCR multimotor** capaz de:
|
||||
- Procesar PDFs escaneados extremo a extremo (**PDF → Imagen → Preprocesado → OCR → Evaluación**).
|
||||
- **Reducir el CER al menos un 15 %** respecto a una línea base neuronal (EasyOCR).
|
||||
- Mantener **tiempos por página** adecuados y un pipeline **modular y reproducible**.
|
||||
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.
|
||||
|
||||
**Métricas principales:**
|
||||
- **CER** (*Character Error Rate*)
|
||||
- **WER** (*Word Error Rate*)
|
||||
- **Latencia por página*
|
||||
**Resultado alcanzado:** CER = **1.49%** (objetivo cumplido)
|
||||
|
||||
---
|
||||
|
||||
## 🧩 Alcance y diseño
|
||||
## Resultados Principales
|
||||
|
||||
- **Idioma:** español (texto impreso, no manuscrito).
|
||||
- **Entrada:** PDFs escaneados con calidad variable, ruido o inclinación.
|
||||
- **Motores evaluados:**
|
||||
- **EasyOCR** – baseline neuronal ligera.
|
||||
- **PaddleOCR (PP-OCR)** – referencia industrial multilingüe.
|
||||
- **DocTR (Mindee)** – arquitectura PyTorch modular con salida estructurada.
|
||||
- **Evaluación:** CER, WER y latencia promedio por página.
|
||||
| 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%** |
|
||||
|
||||
---
|
||||
**Mejora obtenida:** Reducción del CER en un **80.9%**
|
||||
|
||||
## 🏗️ Arquitectura del sistema
|
||||
### Configuración Óptima Encontrada
|
||||
|
||||
```text
|
||||
PDF (escaneado)
|
||||
└─► Conversión a imagen (PyMuPDF / pdf2image)
|
||||
└─► Preprocesado (OpenCV)
|
||||
└─► OCR (EasyOCR | PaddleOCR | DocTR)
|
||||
└─► Evaluación (CER · WER · latencia)
|
||||
```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,
|
||||
}
|
||||
```
|
||||
|
||||
## 🔜 Próximos pasos
|
||||
---
|
||||
|
||||
1. Ajustar parámetros y arquitecturas en DocTR (detector y reconocedor).
|
||||
2. Añadir métricas de latencia.
|
||||
3. Incorporar postprocesamiento lingüístico (corrección ortográfica).
|
||||
4. Explorar TrOCR o MMOCR como comparación avanzada en la segunda fase.
|
||||
## 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
|
||||
|
||||
| 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) |
|
||||
|
||||
---
|
||||
|
||||
## Estructura del Repositorio
|
||||
|
||||
```
|
||||
MastersThesis/
|
||||
├── docs/ # Documentación de capítulos del TFM
|
||||
│ ├── 00_resumen.md
|
||||
│ ├── 01_introduccion.md
|
||||
│ ├── 02_contexto_estado_arte.md
|
||||
│ ├── 03_objetivos_metodologia.md
|
||||
│ ├── 04_comparativa_soluciones.md
|
||||
│ ├── 05_optimizacion_hiperparametros.md
|
||||
│ ├── 06_resultados_discusion.md
|
||||
│ └── 07_conclusiones_trabajo_futuro.md
|
||||
├── src/
|
||||
│ ├── paddle_ocr_fine_tune_unir_raytune.ipynb # Experimento principal
|
||||
│ ├── paddle_ocr_tuning.py # Script de evaluación
|
||||
│ ├── 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
|
||||
├── instructions/ # Documento PDF de UNIR utilizado
|
||||
├── 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.
|
||||
|
||||
---
|
||||
|
||||
## Requisitos
|
||||
|
||||
| Componente | Versión |
|
||||
|------------|---------|
|
||||
| Python | 3.11.9 |
|
||||
| PaddlePaddle | 3.2.2 |
|
||||
| PaddleOCR | 3.3.2 |
|
||||
| Ray | 2.52.1 |
|
||||
| Optuna | 4.6.0 |
|
||||
| jiwer | (para métricas CER/WER) |
|
||||
| PyMuPDF | (para conversión PDF) |
|
||||
|
||||
---
|
||||
|
||||
## Uso
|
||||
|
||||
### Preparar dataset
|
||||
```bash
|
||||
# Ejecutar prepare_dataset.ipynb para convertir PDF a imágenes y extraer ground truth
|
||||
jupyter notebook src/prepare_dataset.ipynb
|
||||
```
|
||||
|
||||
### Ejecutar optimización
|
||||
```bash
|
||||
# Ejecutar el notebook principal de Ray Tune
|
||||
jupyter notebook src/paddle_ocr_fine_tune_unir_raytune.ipynb
|
||||
```
|
||||
|
||||
### 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
|
||||
|
||||
- **Dataset**: Instrucciones para la elaboración del TFE (UNIR), 24 páginas
|
||||
- **Resultados benchmark**: `results/ai_ocr_benchmark_finetune_results_20251206_113206.csv`
|
||||
- **Resultados Ray Tune**: `src/raytune_paddle_subproc_results_20251207_192320.csv`
|
||||
|
||||
---
|
||||
|
||||
## Trabajo Pendiente para Completar el TFM
|
||||
|
||||
### Contexto: Limitaciones de Hardware
|
||||
|
||||
Este trabajo adoptó la estrategia de **optimización de hiperparámetros** en lugar de **fine-tuning** debido a:
|
||||
- **Sin GPU dedicada**: Ejecución exclusivamente en CPU
|
||||
- **Tiempo de inferencia elevado**: ~69 segundos/página en CPU
|
||||
- **Fine-tuning inviable**: Entrenar modelos de deep learning sin GPU requeriría tiempos prohibitivos
|
||||
|
||||
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.
|
||||
|
||||
### Tareas Pendientes
|
||||
|
||||
#### 1. Validación del Enfoque (Prioridad Alta)
|
||||
- [ ] **Validación cruzada en otros documentos**: Evaluar la configuración óptima en otros tipos de documentos en español (facturas, formularios, contratos) para verificar generalización
|
||||
- [ ] **Ampliar el dataset**: El dataset actual tiene solo 24 páginas. Construir un corpus más amplio y diverso (mínimo 100 páginas)
|
||||
- [ ] **Validación del ground truth**: Revisar manualmente el texto de referencia extraído automáticamente para asegurar su exactitud
|
||||
|
||||
#### 2. Experimentación Adicional (Prioridad Media)
|
||||
- [ ] **Explorar `text_det_unclip_ratio`**: Este parámetro quedó fijado en 0.0. Incluirlo en el espacio de búsqueda podría mejorar resultados
|
||||
- [ ] **Comparativa con fine-tuning** (si se obtiene acceso a GPU): Cuantificar la brecha de rendimiento entre optimización de hiperparámetros y fine-tuning real
|
||||
- [ ] **Evaluación con GPU**: Medir tiempos de inferencia con aceleración GPU para escenarios de producción
|
||||
|
||||
#### 3. Documentación y Presentación (Prioridad Alta)
|
||||
- [ ] **Completar memoria TFM**: Unificar los capítulos del directorio `docs/` en documento final siguiendo plantilla UNIR
|
||||
- [ ] **Crear presentación**: Preparar slides para la defensa del TFM
|
||||
- [ ] **Añadir diagramas y figuras**: Incluir visualizaciones de los resultados de Ray Tune (distribución CER, correlaciones)
|
||||
|
||||
#### 4. Extensiones Futuras (Opcional)
|
||||
- [ ] **Herramienta de configuración automática**: Desarrollar una herramienta que determine automáticamente la configuración óptima para un nuevo tipo de documento
|
||||
- [ ] **Benchmark público para español**: Publicar un benchmark de OCR para documentos en español que facilite comparación de soluciones
|
||||
- [ ] **Optimización multi-objetivo**: Considerar CER, WER y tiempo de inferencia simultáneamente
|
||||
|
||||
### Recomendación de Próximos Pasos
|
||||
|
||||
1. **Inmediato**: Validar en 2-3 tipos de documentos adicionales para demostrar generalización
|
||||
2. **Corto plazo**: Ampliar dataset y revisar ground truth manualmente
|
||||
3. **Para la defensa**: Completar memoria unificada y crear presentación con visualizaciones
|
||||
|
||||
---
|
||||
|
||||
## Licencia
|
||||
|
||||
Este proyecto es parte de un Trabajo Fin de Máster académico.
|
||||
|
||||
---
|
||||
|
||||
## Referencias
|
||||
|
||||
- [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)
|
||||
|
||||
Reference in New Issue
Block a user