# Resultados de Ajuste de Hiperparámetros DocTR

**Fecha de Ajuste:** 2026-01-19
**Plataforma:** NVIDIA RTX 3060 Laptop GPU
**Muestras:** 64
**Páginas de Prueba:** 5-10 (primer documento)

### ¿Por Qué Solo 5 Páginas?

Usamos solo 5 páginas (páginas 5-10) para el ajuste de hiperparámetros porque:

1. **Velocidad**: 64 pruebas × 5 páginas = 320 evaluaciones de página. Con 45 páginas, serían 2,880 evaluaciones (~9x más tiempo)
2. **Eficiencia de recursos**: Cada prueba toma ~2-20 segundos en GPU

**Riesgo de Sobreajuste**: El ajuste de hiperparámetros en un subconjunto pequeño PUEDE causar sobreajuste. Nuestros resultados confirman esto:
- Subconjunto de ajuste: **38% mejora** (7.43% CER)
- Dataset completo: **0% mejora** (12.07% CER)

La falta total de mejora en el dataset completo indica sobreajuste severo a las páginas 5-10, combinado con limitaciones a nivel de modelo (manejo de diacríticos, estructura de líneas) que los hiperparámetros no pueden corregir.

## Evaluación del Dataset Completo (45 páginas)

| Métrica | Base | Ajustado | Mejora |
|---------|------|----------|--------|
| **CER** | 12.06% | 12.07% | **0%** |
| **WER** | 42.01% | 42.26% | **0%** |
| Tiempo/Página | 0.33s | 0.34s | - |

> **Nota:** El ajuste no generalizó al dataset completo. Los problemas de DocTR parecen ser a nivel de modelo (diacríticos, estructura de líneas).

## Resultados del Subconjunto de Ajuste (páginas 5-10)

| Métrica | Base | Ajustado | Mejora |
|---------|------|----------|--------|
| **CER** | 12.06% | **7.43%** | **38%** |
| **WER** | 42.01% | **35.23%** | **16%** |

> Nota: Las mejoras en el subconjunto de ajuste no se transfirieron al dataset completo.

## Mejor Configuración Encontrada

```json
{
  "assume_straight_pages": true,
  "straighten_pages": false,
  "preserve_aspect_ratio": false,
  "symmetric_pad": false,
  "disable_page_orientation": true,
  "disable_crop_orientation": false,
  "resolve_lines": true,
  "resolve_blocks": false,
  "paragraph_break": 0.0977
}
```

## Hallazgos Clave

1. **straighten_pages: false** - ¡Crítico! Configurarlo en true causa ~79% CER (catastrófico)
2. **assume_straight_pages: true** - Funciona bien con escaneos de documentos rectos
3. **resolve_lines: true** - Ayuda a mantener la estructura de líneas
4. **disable_page_orientation: true** - Evita rotación innecesaria

## Impacto de Parámetros

Parámetros que mejoraron la precisión:
- `straighten_pages=False` absolutamente crítico
- `assume_straight_pages=True` en los mejores resultados
- `resolve_lines=True` mantiene la estructura del texto

Parámetros que perjudicaron la precisión:
- `straighten_pages=True` catastróficamente malo (~79% CER)
- `resolve_blocks=True` ligeramente peor que False

## Limitaciones Conocidas

Incluso con ajuste, DocTR todavía tiene problemas:
- Omite diacríticos (tildes) - probablemente problema a nivel de modelo
- Todavía tiene mayor WER que PaddleOCR debido a problemas de estructura

## Evaluación del Dataset Completo

**Estado:** Completado

```bash
curl -X POST http://localhost:8003/evaluate_full \
  -H "Content-Type: application/json" \
  -d '{
    "pdf_folder": "/app/dataset",
    "assume_straight_pages": true,
    "straighten_pages": false,
    "preserve_aspect_ratio": false,
    "symmetric_pad": false,
    "disable_page_orientation": true,
    "disable_crop_orientation": false,
    "resolve_lines": true,
    "resolve_blocks": false,
    "paragraph_break": 0.0977,
    "save_output": true
  }'
```

**Resultado:** CER 12.07%, WER 42.26%, 0.34s/página (sin mejora sobre la base)

**Conclusión:** Los problemas de precisión de DocTR son a nivel de modelo, no ajustables por hiperparámetros.

## Configuración del Modelo

### Modelo Actual

| Componente | Modelo | Estado |
|------------|--------|--------|
| Detección | `db_resnet50` | Correcto |
| Reconocimiento | `crnn_vgg16_bn` | Mejor opción disponible |

El modelo `crnn_vgg16_bn` fue entrenado principalmente con datasets en inglés y francés, lo que explica la pérdida sistemática de diacríticos españoles (á, é, í, ó, ú, ñ).

### Prueba con Modelo Alternativo (parseq)

Se probó el modelo `parseq` (transformer) como alternativa:

| Métrica | crnn_vgg16_bn | parseq | Resultado |
|---------|---------------|--------|-----------|
| **CER** | 12.07% | 12.32% | **+2% peor** |
| **WER** | 42.26% | 44.0% | **+4% peor** |
| Tiempo/Página | 0.34s | 0.70s | 2x más lento |
| Diacríticos | No | No | Sin mejora |

**Conclusión:** El modelo `parseq` no mejora los diacríticos españoles y es más lento. Todos los modelos pre-entrenados de DocTR fueron entrenados principalmente en inglés/francés. Para español se requeriría **fine-tuning con corpus español**.

### No Se Recomienda Cambio de Modelo

Mantener `crnn_vgg16_bn` (más rápido, ligeramente mejor precisión). Los problemas de diacríticos son de **datos de entrenamiento**, no de arquitectura del modelo

## Análisis de Errores del Debugset

### Errores Observados

| Ground Truth | DocTR | Tipo de Error |
|--------------|-------|---------------|
| `bibliográficas` | `bibliograficas` | Diacrítico omitido |
| `sección` | `seccion` | Diacrítico omitido |
| `Máster` | `Master` | Diacrítico omitido |
| `información` | `informacion` | Diacrítico omitido |
| `o amplían` | `O amplian` | Mayúscula incorrecta |
| Líneas separadas | Todo en una línea | **Estructura perdida** |

### Problemas Críticos

1. **Pérdida total de estructura**: Todo el texto de la página se colapsa en una sola línea
2. **Omisión sistemática de diacríticos**: TODOS los acentos españoles se pierden
3. **Errores de capitalización**: `o` → `O` en medio de oraciones

### ¿Fine-tuning Recomendado?

**Sí, para diacríticos.** El modelo CRNN de DocTR fue entrenado principalmente con textos en inglés y francés, lo que explica la omisión sistemática de acentos españoles.

| Problema | ¿Fine-tuning ayuda? | Explicación |
|----------|---------------------|-------------|
| Diacríticos | **Sí** | Entrenar con corpus español enseñaría al modelo los acentos |
| Estructura de líneas | **No** | Problema arquitectural del modelo, no de entrenamiento |
| Capitalización | **Parcial** | Podría mejorar con datos de entrenamiento adecuados |

### Cómo Fine-Tunear DocTR

```python
from doctr.models import recognition_predictor
from doctr.datasets import RecognitionDataset

# Cargar dataset español
train_set = RecognitionDataset(
    img_folder="path/to/spanish/images",
    labels_path="path/to/spanish/labels.json"
)

# Fine-tune el modelo de reconocimiento
model = recognition_predictor(pretrained=True)
# ... configurar entrenamiento
```

Documentación: https://mindee.github.io/doctr/using_doctr/custom_models_training.html
