# 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