20 KiB
Capítulo 4: Desarrollo Específico de la Contribución
Este capítulo presenta el desarrollo completo del estudio comparativo y la optimización de hiperparámetros de sistemas OCR. Se estructura según el tipo de trabajo "Comparativa de soluciones" establecido por las instrucciones de UNIR: planteamiento de la comparativa (4.1), desarrollo de la comparativa (4.2), y discusión y análisis de resultados (4.3).
4.1 Planteamiento de la Comparativa: Soluciones OCR
4.1.1 Introducción
Esta sección presenta los resultados del estudio comparativo realizado entre tres soluciones OCR de código abierto: EasyOCR, PaddleOCR y DocTR. Los experimentos fueron documentados en el notebook ocr_benchmark_notebook.ipynb del repositorio. El objetivo es identificar el modelo base más prometedor para la posterior fase de optimización de hiperparámetros.
4.1.2 Configuración del Experimento
Dataset de Evaluación
Se utilizó el documento "Instrucciones para la redacción y elaboración del TFE" del Máster Universitario en Inteligencia Artificial de UNIR, ubicado en la carpeta instructions/.
| Característica | Valor |
|---|---|
| Número de páginas evaluadas | 5 (páginas 1-5 en benchmark inicial) |
| Formato | PDF digital (no escaneado) |
| Idioma | Español |
| Resolución de conversión | 300 DPI |
Configuración de los Modelos
Según el código en ocr_benchmark_notebook.ipynb:
EasyOCR:
easyocr_reader = easyocr.Reader(['es', 'en']) # Spanish and English
PaddleOCR (PP-OCRv5):
paddleocr_model = PaddleOCR(
text_detection_model_name="PP-OCRv5_server_det",
text_recognition_model_name="PP-OCRv5_server_rec",
use_doc_orientation_classify=False,
use_doc_unwarping=False,
use_textline_orientation=True,
)
Versión utilizada: PaddleOCR 3.2.0 (según output del notebook)
DocTR:
doctr_model = ocr_predictor(det_arch="db_resnet50", reco_arch="sar_resnet31", pretrained=True)
Métricas de Evaluación
Se utilizó la biblioteca jiwer para calcular CER y WER:
from jiwer import wer, cer
def evaluate_text(reference, prediction):
return {'WER': wer(reference, prediction), 'CER': cer(reference, prediction)}
4.1.3 Resultados del Benchmark
Resultados de PaddleOCR (Datos del CSV)
Del archivo results/ai_ocr_benchmark_finetune_results_20251206_113206.csv, se obtienen los siguientes resultados de PaddleOCR para las páginas 5-9 del documento:
| Página | WER | CER |
|---|---|---|
| 5 | 12.16% | 6.33% |
| 6 | 12.81% | 6.40% |
| 7 | 11.06% | 6.24% |
| 8 | 8.13% | 1.54% |
| 9 | 10.61% | 5.58% |
Promedio PaddleOCR (páginas 5-9):
- CER medio: ~5.22%
- WER medio: ~10.95%
Comparativa de Modelos
Según la documentación del notebook ocr_benchmark_notebook.ipynb, los tres modelos evaluados representan diferentes paradigmas de OCR:
| Modelo | Tipo | Componentes | Fortalezas Clave |
|---|---|---|---|
| EasyOCR | End-to-end (det + rec) | DB + CRNN/Transformer | Ligero, fácil de usar, multilingüe |
| PaddleOCR (PP-OCR) | End-to-end (det + rec + cls) | DB + SRN/CRNN | Soporte multilingüe robusto, pipeline configurable |
| DocTR | End-to-end (det + rec) | DB/LinkNet + CRNN/SAR/VitSTR | Orientado a investigación, API limpia |
Ejemplo de Salida OCR
Del archivo CSV, un ejemplo de predicción de PaddleOCR para la página 8:
"Escribe siempre al menos un párrafo de introducción en cada capítulo o apartado, explicando de qué vas a tratar en esa sección. Evita que aparezcan dos encabezados de nivel consecutivos sin ningún texto entre medias. [...] En esta titulacióon se cita de acuerdo con la normativa Apa."
Errores observados en este ejemplo:
titulacióonen lugar detitulación(carácter duplicado)Apaen lugar deAPA(capitalización)
4.1.4 Justificación de la Selección de PaddleOCR
Criterios de Selección
Basándose en los resultados obtenidos y la documentación del benchmark:
-
Rendimiento: PaddleOCR obtuvo CER entre 1.54% y 6.40% en las páginas evaluadas
-
Configurabilidad: PaddleOCR ofrece múltiples hiperparámetros ajustables:
- Umbrales de detección (
text_det_thresh,text_det_box_thresh) - Umbral de reconocimiento (
text_rec_score_thresh) - Componentes opcionales (
use_textline_orientation,use_doc_orientation_classify,use_doc_unwarping)
- Umbrales de detección (
-
Documentación oficial: PaddleOCR Documentation
Decisión
Se selecciona PaddleOCR (PP-OCRv5) para la fase de optimización debido a:
- Resultados iniciales prometedores (CER ~5%)
- Alta configurabilidad de hiperparámetros de inferencia
- Pipeline modular que permite experimentación
4.1.5 Limitaciones del Benchmark
- Tamaño reducido: Solo 5 páginas evaluadas en el benchmark comparativo inicial
- Único tipo de documento: Documentos académicos de UNIR únicamente
- Ground truth: El texto de referencia se extrajo automáticamente del PDF, lo cual puede introducir errores en layouts complejos
4.1.6 Resumen de la Sección
Esta sección ha presentado:
- La configuración del benchmark según
ocr_benchmark_notebook.ipynb - Los resultados cuantitativos de PaddleOCR del archivo CSV de resultados
- La justificación de la selección de PaddleOCR para optimización
Fuentes de datos utilizadas:
ocr_benchmark_notebook.ipynb: Código del benchmarkresults/ai_ocr_benchmark_finetune_results_20251206_113206.csv: Resultados numéricos- Documentación oficial de PaddleOCR
4.2 Desarrollo de la Comparativa: Optimización de Hiperparámetros
4.2.1 Introducción
Esta sección describe el proceso de optimización de hiperparámetros de PaddleOCR utilizando Ray Tune con el algoritmo de búsqueda Optuna. Los experimentos fueron implementados en el notebook src/paddle_ocr_fine_tune_unir_raytune.ipynb y los resultados se almacenaron en src/raytune_paddle_subproc_results_20251207_192320.csv.
4.2.2 Configuración del Experimento
Entorno de Ejecución
Según los outputs del notebook:
| Componente | Versión/Especificación |
|---|---|
| Python | 3.11.9 |
| PaddlePaddle | 3.2.2 |
| PaddleOCR | 3.3.2 |
| Ray | 2.52.1 |
| GPU | No disponible (CPU only) |
Dataset
Se utilizó un dataset estructurado en src/dataset/ creado mediante el notebook src/prepare_dataset.ipynb:
- Estructura: Carpetas con subcarpetas
img/ytxt/pareadas - Páginas evaluadas por trial: 5 (páginas 5-10 del documento)
- Gestión de datos: Clase
ImageTextDatasetensrc/dataset_manager.py
Espacio de Búsqueda
Según el código del notebook, se definió el siguiente espacio de búsqueda:
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]), # Fijado
"text_rec_score_thresh": tune.uniform(0.0, 0.7),
}
Descripción de parámetros (según documentación de PaddleOCR):
| Parámetro | Descripción |
|---|---|
use_doc_orientation_classify |
Clasificación de orientación del documento |
use_doc_unwarping |
Corrección de deformación del documento |
textline_orientation |
Clasificación de orientación de línea de texto |
text_det_thresh |
Umbral de detección de píxeles de texto |
text_det_box_thresh |
Umbral de caja de detección |
text_det_unclip_ratio |
Coeficiente de expansión (fijado en 0.0) |
text_rec_score_thresh |
Umbral de confianza de reconocimiento |
Configuración de Ray Tune
tuner = tune.Tuner(
trainable_paddle_ocr,
tune_config=tune.TuneConfig(
metric="CER",
mode="min",
search_alg=OptunaSearch(),
num_samples=64,
max_concurrent_trials=2
),
run_config=air.RunConfig(verbose=2, log_to_file=False),
param_space=search_space
)
- Métrica objetivo: CER (minimizar)
- Algoritmo de búsqueda: Optuna (TPE - Tree-structured Parzen Estimator)
- Número de trials: 64
- Trials concurrentes: 2
4.2.3 Resultados de la Optimización
Estadísticas Descriptivas
Del archivo CSV de resultados (raytune_paddle_subproc_results_20251207_192320.csv):
| Estadística | CER | WER | Tiempo (s) | Tiempo/Página (s) |
|---|---|---|---|---|
| count | 64 | 64 | 64 | 64 |
| mean | 5.25% | 14.28% | 347.61 | 69.42 |
| std | 11.03% | 10.75% | 7.88 | 1.57 |
| min | 1.15% | 9.89% | 320.97 | 64.10 |
| 25% | 1.20% | 10.04% | 344.24 | 68.76 |
| 50% | 1.23% | 10.20% | 346.42 | 69.19 |
| 75% | 4.03% | 13.20% | 350.14 | 69.93 |
| max | 51.61% | 59.45% | 368.57 | 73.63 |
Mejor Configuración Encontrada
Según el análisis del notebook:
Best CER: 0.011535 (1.15%)
Best WER: 0.098902 (9.89%)
Configuración óptima:
textline_orientation: True
use_doc_orientation_classify: False
use_doc_unwarping: False
text_det_thresh: 0.4690
text_det_box_thresh: 0.5412
text_det_unclip_ratio: 0.0
text_rec_score_thresh: 0.6350
Análisis de Correlación
Correlación de Pearson entre parámetros y métricas de error (del notebook):
Correlación con CER:
| Parámetro | Correlación |
|---|---|
| CER | 1.000 |
| config/text_det_box_thresh | 0.226 |
| config/text_rec_score_thresh | -0.161 |
| config/text_det_thresh | -0.523 |
| config/text_det_unclip_ratio | NaN |
Correlación con WER:
| Parámetro | Correlación |
|---|---|
| WER | 1.000 |
| config/text_det_box_thresh | 0.227 |
| config/text_rec_score_thresh | -0.173 |
| config/text_det_thresh | -0.521 |
| config/text_det_unclip_ratio | NaN |
Hallazgo clave: El parámetro text_det_thresh muestra la correlación más fuerte (-0.52), indicando que valores más altos de este umbral tienden a reducir el error.
Impacto del Parámetro textline_orientation
Según el análisis del notebook, este parámetro booleano tiene el mayor impacto:
| textline_orientation | CER Medio | WER Medio |
|---|---|---|
| True | ~3.76% | ~12.73% |
| False | ~12.40% | ~21.71% |
Interpretación del notebook:
"7x better CER with textline_orientation=True. And the variance is much tighter — more reliable results. For Spanish business documents with mixed layouts (tables, headers, addresses), orientation classification helps PaddleOCR correctly order text lines."
Análisis de Fallos
Los trials con CER muy alto (>40%) se produjeron cuando:
text_det_thresh< 0.1 (valores muy bajos)textline_orientation = False
Ejemplo de trial con fallo catastrófico:
- CER: 51.61%
- WER: 59.45%
- Configuración:
text_det_thresh=0.017,textline_orientation=True
4.2.4 Comparación Baseline vs Optimizado
Resultados sobre Dataset Completo (24 páginas)
Del análisis final del notebook ejecutando sobre las 24 páginas:
| Modelo | CER | WER |
|---|---|---|
| PaddleOCR (Baseline) | 7.78% | 14.94% |
| PaddleOCR-HyperAdjust | 1.49% | 7.62% |
Métricas de Mejora
| Métrica | Baseline | Optimizado | Mejora Absoluta | Reducción Error |
|---|---|---|---|---|
| CER | 7.78% | 1.49% | -6.29 pp | 80.9% |
| WER | 14.94% | 7.62% | -7.32 pp | 49.0% |
Interpretación (del notebook)
"La optimización de hiperparámetros mejoró la precisión de caracteres de 92.2% a 98.5%, una ganancia de 6.3 puntos porcentuales. Aunque el baseline ya ofrecía resultados aceptables, la configuración optimizada reduce los errores residuales en un 80.9%."
Impacto práctico: En un documento de 10,000 caracteres:
- Baseline: ~778 caracteres con error
- Optimizado: ~149 caracteres con error
- Diferencia: ~629 caracteres menos con errores
4.2.5 Tiempo de Ejecución
| Métrica | Valor |
|---|---|
| Tiempo total del experimento | ~6 horas (64 trials × ~6 min/trial) |
| Tiempo medio por trial | 367.72 segundos |
| Tiempo medio por página | 69.42 segundos |
| Total páginas procesadas | 64 trials × 5 páginas = 320 evaluaciones |
4.2.6 Resumen de la Sección
Esta sección ha presentado:
- Configuración del experimento: 64 trials con Ray Tune + Optuna sobre 7 hiperparámetros
- Resultados estadísticos: CER medio 5.25%, CER mínimo 1.15%
- Hallazgos clave:
textline_orientation=Truees crítico (reduce CER ~70%)text_det_threshtiene correlación -0.52 con CER- Valores bajos de
text_det_thresh(<0.1) causan fallos catastróficos
- Mejora final: CER reducido de 7.78% a 1.49% (reducción del 80.9%)
Fuentes de datos:
src/paddle_ocr_fine_tune_unir_raytune.ipynb: Código del experimentosrc/raytune_paddle_subproc_results_20251207_192320.csv: Resultados de 64 trialssrc/paddle_ocr_tuning.py: Script de evaluación
4.3 Discusión y Análisis de Resultados
4.3.1 Introducción
Esta sección presenta un análisis consolidado de los resultados obtenidos en las fases de benchmark comparativo y optimización de hiperparámetros. Se discuten las implicaciones prácticas y se evalúa el cumplimiento de los objetivos planteados.
4.3.2 Resumen de Resultados
Resultados del Benchmark Comparativo
Del archivo results/ai_ocr_benchmark_finetune_results_20251206_113206.csv, PaddleOCR con configuración inicial (use_textline_orientation=True) obtuvo los siguientes resultados en las páginas 5-9:
| Página | WER | CER |
|---|---|---|
| 5 | 12.16% | 6.33% |
| 6 | 12.81% | 6.40% |
| 7 | 11.06% | 6.24% |
| 8 | 8.13% | 1.54% |
| 9 | 10.61% | 5.58% |
| Promedio | 10.95% | 5.22% |
Resultados de la Optimización con Ray Tune
Del archivo src/raytune_paddle_subproc_results_20251207_192320.csv (64 trials):
| Métrica | Valor |
|---|---|
| CER mínimo | 1.15% |
| CER medio | 5.25% |
| CER máximo | 51.61% |
| WER mínimo | 9.89% |
| WER medio | 14.28% |
| WER máximo | 59.45% |
Comparación Final (Dataset Completo - 24 páginas)
Resultados del notebook src/paddle_ocr_fine_tune_unir_raytune.ipynb:
| Modelo | CER | Precisión Caracteres | WER | Precisión Palabras |
|---|---|---|---|---|
| PaddleOCR (Baseline) | 7.78% | 92.22% | 14.94% | 85.06% |
| PaddleOCR-HyperAdjust | 1.49% | 98.51% | 7.62% | 92.38% |
4.3.3 Análisis de Resultados
Mejora Obtenida
| Forma de Medición | Valor |
|---|---|
| Mejora en precisión de caracteres (absoluta) | +6.29 puntos porcentuales |
| Reducción del CER (relativa) | 80.9% |
| Mejora en precisión de palabras (absoluta) | +7.32 puntos porcentuales |
| Reducción del WER (relativa) | 49.0% |
| Precisión final de caracteres | 98.51% |
Impacto de Hiperparámetros Individuales
Parámetro textline_orientation
Este parámetro booleano demostró ser el más influyente:
| Valor | CER Medio | Impacto |
|---|---|---|
| True | ~3.76% | Rendimiento óptimo |
| False | ~12.40% | 3.3x peor |
Reducción del CER: 69.7% cuando se habilita la clasificación de orientación de línea.
Parámetro text_det_thresh
Correlación con CER: -0.523 (la más fuerte de los parámetros continuos)
| Rango | Comportamiento |
|---|---|
| < 0.1 | Fallos catastróficos (CER 40-50%) |
| 0.3 - 0.6 | Rendimiento óptimo |
| Valor óptimo | 0.4690 |
Parámetros con menor impacto
| Parámetro | Correlación con CER | Valor óptimo |
|---|---|---|
| text_det_box_thresh | +0.226 | 0.5412 |
| text_rec_score_thresh | -0.161 | 0.6350 |
| use_doc_orientation_classify | - | False |
| use_doc_unwarping | - | False |
Configuración Óptima Final
config_optimizada = {
"textline_orientation": True, # CRÍTICO
"use_doc_orientation_classify": False,
"use_doc_unwarping": False,
"text_det_thresh": 0.4690, # Correlación -0.52
"text_det_box_thresh": 0.5412,
"text_det_unclip_ratio": 0.0,
"text_rec_score_thresh": 0.6350,
}
4.3.4 Discusión
Hallazgos Principales
-
Importancia de la clasificación de orientación de línea: El parámetro
textline_orientation=Truees el factor más determinante. Esto tiene sentido para documentos con layouts mixtos (tablas, encabezados, direcciones) donde el orden correcto de las líneas de texto es crucial. -
Umbral de detección crítico: El parámetro
text_det_threshpresenta un umbral mínimo efectivo (~0.1). Valores inferiores generan demasiados falsos positivos en la detección, corrompiendo el reconocimiento posterior. -
Componentes opcionales innecesarios: Para documentos académicos digitales (no escaneados), los módulos de corrección de orientación de documento (
use_doc_orientation_classify) y corrección de deformación (use_doc_unwarping) no aportan mejora e incluso pueden introducir overhead.
Interpretación de la Correlación Negativa
La correlación negativa de text_det_thresh (-0.52) con el CER indica que:
- Umbrales más altos filtran detecciones de baja confianza
- Esto reduce falsos positivos que generan texto erróneo
- El reconocimiento es más preciso con menos regiones pero más confiables
Limitaciones de los Resultados
-
Generalización: Los resultados se obtuvieron sobre documentos de un único tipo (instrucciones académicas UNIR). La configuración óptima puede variar para otros tipos de documentos.
-
Ground truth automático: El texto de referencia se extrajo programáticamente del PDF. En layouts complejos, esto puede introducir errores en la evaluación.
-
Ejecución en CPU: Los tiempos reportados (~69s/página) corresponden a ejecución en CPU. Con GPU, los tiempos serían significativamente menores.
-
Parámetro fijo:
text_det_unclip_ratiopermaneció fijo en 0.0 durante todo el experimento por decisión de diseño.
Comparación con Objetivos
| Objetivo | Meta | Resultado | Cumplimiento |
|---|---|---|---|
| OE1: Comparar soluciones OCR | Evaluar EasyOCR, PaddleOCR, DocTR | PaddleOCR seleccionado | ✓ |
| OE2: Preparar dataset | Construir dataset estructurado | Dataset de 24 páginas | ✓ |
| OE3: Identificar hiperparámetros críticos | Analizar correlaciones | textline_orientation y text_det_thresh identificados |
✓ |
| OE4: Optimizar con Ray Tune | Mínimo 50 configuraciones | 64 trials ejecutados | ✓ |
| OE5: Validar configuración | Documentar mejora | CER 7.78% → 1.49% | ✓ |
| Objetivo General | CER < 2% | CER = 1.49% | ✓ |
4.3.5 Implicaciones Prácticas
Recomendaciones de Configuración
Para documentos académicos en español similares a los evaluados:
- Obligatorio:
use_textline_orientation=True - Recomendado:
text_det_threshentre 0.4 y 0.5 - Opcional:
text_det_box_thresh~0.5,text_rec_score_thresh>0.6 - No recomendado: Habilitar
use_doc_orientation_classifyouse_doc_unwarpingpara documentos digitales
Impacto Cuantitativo
En un documento típico de 10,000 caracteres:
| Configuración | Errores estimados |
|---|---|
| Baseline | ~778 caracteres |
| Optimizada | ~149 caracteres |
| Reducción | 629 caracteres menos con errores |
Aplicabilidad
Esta metodología de optimización es aplicable cuando:
- No se dispone de recursos GPU para fine-tuning
- El modelo preentrenado ya tiene soporte para el idioma objetivo
- Se busca mejorar rendimiento sin reentrenar
4.3.6 Resumen de la Sección
Esta sección ha presentado:
- Los resultados consolidados del benchmark y la optimización
- El análisis del impacto de cada hiperparámetro
- La configuración óptima identificada
- La discusión de limitaciones y aplicabilidad
- El cumplimiento de los objetivos planteados
Resultado principal: Se logró reducir el CER del 7.78% al 1.49% (mejora del 80.9%) mediante optimización de hiperparámetros, cumpliendo el objetivo de alcanzar CER < 2%.
Fuentes de datos:
results/ai_ocr_benchmark_finetune_results_20251206_113206.csvsrc/raytune_paddle_subproc_results_20251207_192320.csvsrc/paddle_ocr_fine_tune_unir_raytune.ipynb