Files
MastersThesis/docs/03_objetivos_metodologia.md

288 lines
9.6 KiB
Markdown
Raw Normal View History

2025-12-16 00:07:00 +01:00
# Objetivos concretos y metodología de trabajo
2025-12-10 16:06:47 +01:00
2025-12-15 23:03:36 +01:00
Este capítulo establece los objetivos del trabajo siguiendo la metodología SMART (Doran, 1981) y describe la metodología experimental empleada para alcanzarlos. Se define un objetivo general y cinco objetivos específicos, todos ellos medibles y verificables.
2025-12-10 16:06:47 +01:00
2025-12-16 00:07:00 +01:00
## Objetivo general
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.**
### Justificación SMART del Objetivo General
| Criterio | Cumplimiento |
|----------|--------------|
| **Específico (S)** | Se define claramente qué se quiere lograr: optimizar PaddleOCR mediante ajuste de hiperparámetros para documentos en español |
| **Medible (M)** | Se establece una métrica cuantificable: CER < 2% |
| **Alcanzable (A)** | Es viable dado que: (1) PaddleOCR permite configuración de hiperparámetros, (2) Ray Tune posibilita búsqueda automatizada, (3) No se requiere GPU |
| **Relevante (R)** | El impacto es demostrable: mejora la extracción de texto en documentos académicos sin costes adicionales de infraestructura |
| **Temporal (T)** | El plazo es un cuatrimestre, correspondiente al TFM |
2025-12-16 00:07:00 +01:00
## Objetivos específicos
2025-12-10 16:06:47 +01:00
### OE1: Comparar soluciones OCR de código abierto
> **Evaluar el rendimiento base de EasyOCR, PaddleOCR y DocTR en documentos académicos en español, utilizando CER y WER como métricas, para seleccionar el modelo más prometedor.**
### OE2: Preparar un dataset de evaluación
> **Construir un dataset estructurado de imágenes de documentos académicos en español con su texto de referencia (ground truth) extraído del PDF original.**
### OE3: Identificar hiperparámetros críticos
> **Analizar la correlación entre los hiperparámetros de PaddleOCR y las métricas de error para identificar los parámetros con mayor impacto en el rendimiento.**
### OE4: Optimizar hiperparámetros con Ray Tune
> **Ejecutar una búsqueda automatizada de hiperparámetros utilizando Ray Tune con Optuna, evaluando al menos 50 configuraciones diferentes.**
### OE5: Validar la configuración optimizada
> **Comparar el rendimiento de la configuración baseline versus la configuración optimizada sobre el dataset completo, documentando la mejora obtenida.**
2025-12-16 00:07:00 +01:00
## Metodología del trabajo
2025-12-15 23:03:36 +01:00
2025-12-16 00:07:00 +01:00
### Visión General
2025-12-15 23:03:36 +01:00
```mermaid
flowchart TD
A["Fase 1: Preparación del Dataset<br/>
• Conversión PDF → Imágenes (300 DPI)<br/>
• Extracción de texto de referencia (PyMuPDF)<br/>
• Estructura: carpetas img/ y txt/ pareadas"]
B["Fase 2: Benchmark Comparativo<br/>
• Evaluación de EasyOCR, PaddleOCR, DocTR<br/>
• Métricas: CER, WER<br/>
• Selección del modelo base"]
C["Fase 3: Definición del Espacio de Búsqueda<br/>
• Identificación de hiperparámetros configurables<br/>
• Definición de rangos y distribuciones<br/>
• Configuración de Ray Tune + Optuna"]
D["Fase 4: Optimización de Hiperparámetros<br/>
• Ejecución de 64 trials con Ray Tune<br/>
• Paralelización (2 trials concurrentes)<br/>
• Registro de métricas y configuraciones"]
E["Fase 5: Validación y Análisis<br/>
• Comparación baseline vs optimizado<br/>
• Análisis de correlaciones<br/>
• Documentación de resultados"]
A --> B --> C --> D --> E
2025-12-10 16:06:47 +01:00
```
2025-12-16 00:07:00 +01:00
### Fase 1: Preparación del Dataset
2025-12-10 16:06:47 +01:00
#### Fuente de Datos
Se utilizaron documentos PDF académicos de UNIR (Universidad Internacional de La Rioja), específicamente las instrucciones para la elaboración del TFE del Máster en Inteligencia Artificial.
#### Proceso de Conversión
El script `prepare_dataset.ipynb` implementa:
1. **Conversión PDF a imágenes**:
- Biblioteca: PyMuPDF (fitz)
- Resolución: 300 DPI
- Formato de salida: PNG
2. **Extracción de texto de referencia**:
- Método: `page.get_text("dict")` de PyMuPDF
- Preservación de estructura de líneas
- Tratamiento de texto vertical/marginal
- Normalización de espacios y saltos de línea
#### Estructura del Dataset
2025-12-15 23:03:36 +01:00
```mermaid
flowchart LR
dataset["dataset/"] --> d0["0/"]
d0 --> pdf["instrucciones.pdf"]
d0 --> img["img/"]
img --> img1["page_0001.png"]
img --> img2["page_0002.png"]
img --> imgN["..."]
d0 --> txt["txt/"]
txt --> txt1["page_0001.txt"]
txt --> txt2["page_0002.txt"]
txt --> txtN["..."]
dataset --> dots["..."]
2025-12-10 16:06:47 +01:00
```
#### Clase ImageTextDataset
Se implementó una clase Python para cargar pares imagen-texto:
```python
class ImageTextDataset:
def __init__(self, root):
# Carga pares (imagen, texto) de carpetas pareadas
def __getitem__(self, idx):
# Retorna (PIL.Image, str)
```
2025-12-16 00:07:00 +01:00
### Fase 2: Benchmark Comparativo
2025-12-10 16:06:47 +01:00
#### Modelos Evaluados
| Modelo | Versión | Configuración |
|--------|---------|---------------|
| EasyOCR | - | Idiomas: ['es', 'en'] |
| PaddleOCR | PP-OCRv5 | Modelos server_det + server_rec |
| DocTR | - | db_resnet50 + sar_resnet31 |
#### Métricas de Evaluación
Se utilizó la biblioteca `jiwer` para calcular:
```python
from jiwer import wer, cer
def evaluate_text(reference, prediction):
return {
'WER': wer(reference, prediction),
'CER': cer(reference, prediction)
}
```
2025-12-16 00:07:00 +01:00
### Fase 3: Espacio de Búsqueda
2025-12-10 16:06:47 +01:00
#### Hiperparámetros Seleccionados
| Parámetro | Tipo | Rango/Valores | Descripción |
|-----------|------|---------------|-------------|
| `use_doc_orientation_classify` | Booleano | [True, False] | Clasificación de orientación del documento |
| `use_doc_unwarping` | Booleano | [True, False] | Corrección de deformación del documento |
| `textline_orientation` | Booleano | [True, False] | Clasificación de orientación de línea de texto |
| `text_det_thresh` | Continuo | [0.0, 0.7] | Umbral de detección de píxeles de texto |
| `text_det_box_thresh` | Continuo | [0.0, 0.7] | Umbral de caja de detección |
| `text_det_unclip_ratio` | Fijo | 0.0 | Coeficiente de expansión (fijado) |
| `text_rec_score_thresh` | Continuo | [0.0, 0.7] | Umbral de confianza de reconocimiento |
#### Configuración de Ray Tune
```python
from ray import tune
from ray.tune.search.optuna import OptunaSearch
search_space = {
"use_doc_orientation_classify": tune.choice([True, False]),
"use_doc_unwarping": tune.choice([True, False]),
"textline_orientation": tune.choice([True, False]),
"text_det_thresh": tune.uniform(0.0, 0.7),
"text_det_box_thresh": tune.uniform(0.0, 0.7),
"text_det_unclip_ratio": tune.choice([0.0]),
"text_rec_score_thresh": tune.uniform(0.0, 0.7),
}
tuner = tune.Tuner(
trainable_paddle_ocr,
tune_config=tune.TuneConfig(
metric="CER",
mode="min",
search_alg=OptunaSearch(),
num_samples=64,
max_concurrent_trials=2
)
)
```
2025-12-16 00:07:00 +01:00
### Fase 4: Ejecución de Optimización
2025-12-10 16:06:47 +01:00
#### Arquitectura de Ejecución
Debido a incompatibilidades entre Ray y PaddleOCR en el mismo proceso, se implementó una arquitectura basada en subprocesos:
2025-12-15 23:03:36 +01:00
```mermaid
flowchart LR
A["Ray Tune (proceso principal)"]
A --> B["Subprocess 1: paddle_ocr_tuning.py --config"]
B --> B_out["Retorna JSON con métricas"]
A --> C["Subprocess 2: paddle_ocr_tuning.py --config"]
C --> C_out["Retorna JSON con métricas"]
2025-12-10 16:06:47 +01:00
```
#### Script de Evaluación (paddle_ocr_tuning.py)
El script recibe hiperparámetros por línea de comandos:
```bash
python paddle_ocr_tuning.py \
--pdf-folder ./dataset \
--textline-orientation True \
--text-det-box-thresh 0.5 \
--text-det-thresh 0.4 \
--text-rec-score-thresh 0.6
```
Y retorna métricas en formato JSON:
```json
{
"CER": 0.0125,
"WER": 0.1040,
"TIME": 331.09,
"PAGES": 5,
"TIME_PER_PAGE": 66.12
}
```
2025-12-16 00:07:00 +01:00
### Fase 5: Validación
2025-12-10 16:06:47 +01:00
#### Protocolo de Validación
1. **Baseline**: Ejecución con configuración por defecto de PaddleOCR
2. **Optimizado**: Ejecución con mejor configuración encontrada
3. **Comparación**: Evaluación sobre las 24 páginas del dataset completo
4. **Métricas reportadas**: CER, WER, tiempo de procesamiento
2025-12-16 00:07:00 +01:00
### Entorno de Ejecución
2025-12-10 16:06:47 +01:00
#### Hardware
| Componente | Especificación |
|------------|----------------|
| CPU | Intel Core (especificar modelo) |
| RAM | 16 GB |
| GPU | No disponible (ejecución en CPU) |
| Almacenamiento | SSD |
#### Software
| Componente | Versión |
|------------|---------|
| Sistema Operativo | Windows 10/11 |
| Python | 3.11.9 |
| PaddleOCR | 3.3.2 |
| PaddlePaddle | 3.2.2 |
| Ray | 2.52.1 |
| Optuna | 4.6.0 |
2025-12-16 00:07:00 +01:00
### Limitaciones Metodológicas
2025-12-10 16:06:47 +01:00
1. **Tamaño del dataset**: El dataset contiene 24 páginas de un único tipo de documento. Resultados pueden no generalizar a otros formatos.
2. **Ejecución en CPU**: Los tiempos de procesamiento (~70s/página) serían significativamente menores con GPU.
3. **Ground truth imperfecto**: El texto de referencia extraído de PDF puede contener errores en documentos con layouts complejos.
4. **Parámetro fijo**: `text_det_unclip_ratio` quedó fijado en 0.0 durante todo el experimento por decisión de diseño inicial.
2025-12-16 00:07:00 +01:00
## Resumen del capítulo
2025-12-10 16:06:47 +01:00
Este capítulo ha establecido:
1. Un objetivo general SMART: alcanzar CER < 2% mediante optimización de hiperparámetros
2. Cinco objetivos específicos medibles y alcanzables
3. Una metodología experimental en cinco fases claramente definidas
4. El espacio de búsqueda de hiperparámetros y la configuración de Ray Tune
5. Las limitaciones reconocidas del enfoque
2025-12-10 22:34:33 +01:00
El siguiente capítulo presenta el desarrollo específico de la contribución, incluyendo el benchmark comparativo de soluciones OCR, la optimización de hiperparámetros y el análisis de resultados.