Files
MastersThesis/docs/metrics/metrics_doctr.md
Sergio Jimenez Jimenez 316ace4d51
Some checks failed
build_docker / essential (pull_request) Successful in 1s
build_docker / build_gpu (pull_request) Has been cancelled
build_docker / build_easyocr (pull_request) Has been cancelled
build_docker / build_cpu (pull_request) Successful in 5m25s
build_docker / build_easyocr_gpu (pull_request) Has been cancelled
build_docker / build_doctr (pull_request) Has been cancelled
build_docker / build_doctr_gpu (pull_request) Has been cancelled
Docs aligment on latest metrics.
2026-01-19 13:41:07 +01:00

6.8 KiB
Raw Blame History

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

{
  "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

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: oO 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 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

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