290 lines
12 KiB
Markdown
290 lines
12 KiB
Markdown
# Capítulo 3: Objetivos y Metodología de Trabajo
|
|
|
|
## 3.1 Introducción
|
|
|
|
Este capítulo establece los objetivos del trabajo siguiendo la metodología SMART (Específico, Medible, Alcanzable, Relevante, Temporal) y describe la metodología experimental empleada para alcanzarlos.
|
|
|
|
## 3.2 Objetivo General
|
|
|
|
> **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 |
|
|
|
|
## 3.3 Objetivos Específicos
|
|
|
|
### 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.**
|
|
|
|
## 3.4 Metodología de Trabajo
|
|
|
|
### 3.4.1 Visión General
|
|
|
|
La metodología sigue un enfoque experimental estructurado en cinco fases:
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Fase 1: Preparación del Dataset │
|
|
│ - Conversión PDF → Imágenes (300 DPI) │
|
|
│ - Extracción de texto de referencia (PyMuPDF) │
|
|
│ - Estructura: carpetas img/ y txt/ pareadas │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
↓
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Fase 2: Benchmark Comparativo │
|
|
│ - Evaluación de EasyOCR, PaddleOCR, DocTR │
|
|
│ - Métricas: CER, WER │
|
|
│ - Selección del modelo base │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
↓
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Fase 3: Definición del Espacio de Búsqueda │
|
|
│ - Identificación de hiperparámetros configurables │
|
|
│ - Definición de rangos y distribuciones │
|
|
│ - Configuración de Ray Tune + Optuna │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
↓
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Fase 4: Optimización de Hiperparámetros │
|
|
│ - Ejecución de 64 trials con Ray Tune │
|
|
│ - Paralelización (2 trials concurrentes) │
|
|
│ - Registro de métricas y configuraciones │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
↓
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Fase 5: Validación y Análisis │
|
|
│ - Comparación baseline vs optimizado │
|
|
│ - Análisis de correlaciones │
|
|
│ - Documentación de resultados │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 3.4.2 Fase 1: Preparación del Dataset
|
|
|
|
#### 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
|
|
|
|
```
|
|
dataset/
|
|
├── 0/
|
|
│ ├── instrucciones.pdf
|
|
│ ├── img/
|
|
│ │ ├── page_0001.png
|
|
│ │ ├── page_0002.png
|
|
│ │ └── ...
|
|
│ └── txt/
|
|
│ ├── page_0001.txt
|
|
│ ├── page_0002.txt
|
|
│ └── ...
|
|
└── ...
|
|
```
|
|
|
|
#### 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)
|
|
```
|
|
|
|
### 3.4.3 Fase 2: Benchmark Comparativo
|
|
|
|
#### 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)
|
|
}
|
|
```
|
|
|
|
### 3.4.4 Fase 3: Espacio de Búsqueda
|
|
|
|
#### 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
|
|
)
|
|
)
|
|
```
|
|
|
|
### 3.4.5 Fase 4: Ejecución de Optimización
|
|
|
|
#### Arquitectura de Ejecución
|
|
|
|
Debido a incompatibilidades entre Ray y PaddleOCR en el mismo proceso, se implementó una arquitectura basada en subprocesos:
|
|
|
|
```
|
|
Ray Tune (proceso principal)
|
|
│
|
|
├──► Subprocess 1: paddle_ocr_tuning.py --config {...}
|
|
│ └──► Retorna JSON con métricas
|
|
│
|
|
└──► Subprocess 2: paddle_ocr_tuning.py --config {...}
|
|
└──► Retorna JSON con métricas
|
|
```
|
|
|
|
#### 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
|
|
}
|
|
```
|
|
|
|
### 3.4.6 Fase 5: Validación
|
|
|
|
#### 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
|
|
|
|
### 3.5 Entorno de Ejecución
|
|
|
|
#### 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 |
|
|
|
|
### 3.6 Limitaciones Metodológicas
|
|
|
|
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.
|
|
|
|
## 3.7 Resumen del Capítulo
|
|
|
|
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
|
|
|
|
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.
|
|
|