assit commands for claude
All checks were successful
build_docker / essential (pull_request) Successful in 1s
build_docker / build_cpu (pull_request) Successful in 5m0s
build_docker / build_gpu (pull_request) Successful in 22m37s
build_docker / build_easyocr (pull_request) Successful in 18m5s
build_docker / build_easyocr_gpu (pull_request) Successful in 15m43s
build_docker / build_doctr (pull_request) Successful in 17m17s
build_docker / build_raytune (pull_request) Successful in 3m24s
build_docker / build_doctr_gpu (pull_request) Successful in 16m54s
All checks were successful
build_docker / essential (pull_request) Successful in 1s
build_docker / build_cpu (pull_request) Successful in 5m0s
build_docker / build_gpu (pull_request) Successful in 22m37s
build_docker / build_easyocr (pull_request) Successful in 18m5s
build_docker / build_easyocr_gpu (pull_request) Successful in 15m43s
build_docker / build_doctr (pull_request) Successful in 17m17s
build_docker / build_raytune (pull_request) Successful in 3m24s
build_docker / build_doctr_gpu (pull_request) Successful in 16m54s
This commit is contained in:
@@ -24,7 +24,7 @@ El reconocimiento óptico de caracteres (OCR) en documentos académicos en espa
|
||||
|
||||
Se seleccionaron tres soluciones OCR de código abierto representativas del estado del arte:
|
||||
|
||||
**Tabla 10.** *Soluciones OCR evaluadas en el benchmark comparativo.*
|
||||
**Tabla 11.** *Soluciones OCR evaluadas en el benchmark comparativo.*
|
||||
|
||||
| Solución | Desarrollador | Versión | Justificación de selección |
|
||||
|----------|---------------|---------|----------------------------|
|
||||
@@ -55,7 +55,7 @@ Los criterios establecidos para evaluar las soluciones fueron:
|
||||
|
||||
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/`.
|
||||
|
||||
**Tabla 11.** *Características del dataset de evaluación inicial.*
|
||||
**Tabla 12.** *Características del dataset de evaluación inicial.*
|
||||
|
||||
| Característica | Valor |
|
||||
|----------------|-------|
|
||||
@@ -96,7 +96,7 @@ Se utilizó la biblioteca `jiwer` para calcular CER y WER de manera estandarizad
|
||||
|
||||
Durante el benchmark inicial se evaluó PaddleOCR con configuración por defecto en un subconjunto del dataset. Los resultados preliminares mostraron variabilidad significativa entre páginas, con CER entre 1.54% y 6.40% dependiendo de la complejidad del layout.
|
||||
|
||||
**Tabla 12.** *Variabilidad del CER por tipo de contenido.*
|
||||
**Tabla 13.** *Variabilidad del CER por tipo de contenido.*
|
||||
|
||||
| Tipo de contenido | CER aproximado | Observaciones |
|
||||
|-------------------|----------------|---------------|
|
||||
@@ -121,7 +121,7 @@ Durante el benchmark inicial se evaluó PaddleOCR con configuración por defecto
|
||||
|
||||
Los tres modelos evaluados representan diferentes paradigmas de OCR:
|
||||
|
||||
**Tabla 13.** *Comparativa de arquitecturas OCR evaluadas.*
|
||||
**Tabla 14.** *Comparativa de arquitecturas OCR evaluadas.*
|
||||
|
||||
| Modelo | Tipo | Componentes | Fortalezas Clave |
|
||||
|--------|------|-------------|------------------|
|
||||
@@ -162,7 +162,7 @@ Un análisis cualitativo de los errores producidos reveló patrones específicos
|
||||
|
||||
La selección de PaddleOCR para la fase de optimización se basó en los siguientes criterios:
|
||||
|
||||
**Tabla 14.** *Evaluación de criterios de selección.*
|
||||
**Tabla 15.** *Evaluación de criterios de selección.*
|
||||
|
||||
| Criterio | EasyOCR | PaddleOCR | DocTR |
|
||||
|----------|---------|-----------|-------|
|
||||
@@ -244,7 +244,7 @@ La optimización de hiperparámetros representa una alternativa al fine-tuning t
|
||||
|
||||
El experimento se ejecutó en el siguiente entorno:
|
||||
|
||||
**Tabla 15.** *Entorno de ejecución del experimento.*
|
||||
**Tabla 16.** *Entorno de ejecución del experimento.*
|
||||
|
||||
| Componente | Versión/Especificación |
|
||||
|------------|------------------------|
|
||||
@@ -272,7 +272,14 @@ Esta arquitectura containerizada permite ejecutar cada componente en su entorno
|
||||
|
||||
```mermaid
|
||||
---
|
||||
title: "Arquitectura de ejecución con Docker Compose"
|
||||
title: Arquitectura de ejecución con Docker Compose
|
||||
config:
|
||||
theme: base
|
||||
themeVariables:
|
||||
primaryColor: "#E6F4F9"
|
||||
primaryTextColor: "#404040"
|
||||
primaryBorderColor: "#0098CD"
|
||||
lineColor: "#0098CD"
|
||||
---
|
||||
flowchart LR
|
||||
subgraph Docker["Docker Compose"]
|
||||
@@ -313,11 +320,221 @@ Respuesta del servicio OCR:
|
||||
}
|
||||
```
|
||||
|
||||
#### Infraestructura Docker
|
||||
|
||||
La infraestructura del proyecto se basa en contenedores Docker para garantizar reproducibilidad y aislamiento de dependencias. Se generaron seis imágenes Docker, cada una optimizada para su propósito específico.
|
||||
|
||||
**Tabla 17.** *Imágenes Docker generadas para el proyecto.*
|
||||
|
||||
| Imagen | Propósito | Base | Puerto |
|
||||
|--------|-----------|------|--------|
|
||||
| [`seryus.ddns.net/unir/paddle-ocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/paddle-ocr-gpu/latest) | PaddleOCR con aceleración GPU | `nvidia/cuda:12.4.1-cudnn-runtime` | 8002 |
|
||||
| [`seryus.ddns.net/unir/paddle-ocr-cpu`](https://seryus.ddns.net/unir/-/packages/container/paddle-ocr-cpu/latest) | PaddleOCR para entornos sin GPU | `python:3.11-slim` | 8002 |
|
||||
| [`seryus.ddns.net/unir/easyocr-gpu`](https://seryus.ddns.net/unir/-/packages/container/easyocr-gpu/latest) | EasyOCR con aceleración GPU | `nvidia/cuda:13.0.2-cudnn-runtime` | 8002* |
|
||||
| [`seryus.ddns.net/unir/doctr-gpu`](https://seryus.ddns.net/unir/-/packages/container/doctr-gpu/latest) | DocTR con aceleración GPU | `nvidia/cuda:13.0.2-cudnn-runtime` | 8003 |
|
||||
| [`seryus.ddns.net/unir/raytune`](https://seryus.ddns.net/unir/-/packages/container/raytune/latest) | Orquestador Ray Tune | `python:3.12-slim` | - |
|
||||
|
||||
*Fuente: Elaboración propia. Dockerfiles disponibles en [`src/paddle_ocr/`](https://github.com/seryus/MastersThesis/tree/main/src/paddle_ocr), [`src/easyocr_service/`](https://github.com/seryus/MastersThesis/tree/main/src/easyocr_service), [`src/doctr_service/`](https://github.com/seryus/MastersThesis/tree/main/src/doctr_service), [`src/raytune/`](https://github.com/seryus/MastersThesis/tree/main/src/raytune).*
|
||||
|
||||
##### Arquitectura de Microservicios
|
||||
|
||||
```mermaid
|
||||
---
|
||||
title: Arquitectura de microservicios para optimización OCR
|
||||
config:
|
||||
theme: base
|
||||
themeVariables:
|
||||
primaryColor: "#E6F4F9"
|
||||
primaryTextColor: "#404040"
|
||||
primaryBorderColor: "#0098CD"
|
||||
lineColor: "#0098CD"
|
||||
---
|
||||
flowchart TB
|
||||
subgraph Host["Host (Ubuntu 24.04)"]
|
||||
subgraph Docker["Docker Compose"]
|
||||
RT["RayTune\n(Orquestador)"]
|
||||
subgraph OCR["Servicios OCR (GPU)"]
|
||||
P["PaddleOCR\n:8002"]
|
||||
E["EasyOCR\n:8001"]
|
||||
D["DocTR\n:8003"]
|
||||
end
|
||||
end
|
||||
GPU["NVIDIA RTX 3060\n(5.66 GB VRAM)"]
|
||||
DS[("Dataset\n/app/dataset")]
|
||||
RES[("Resultados\n/app/results")]
|
||||
end
|
||||
|
||||
RT -->|"POST /evaluate"| P
|
||||
RT -->|"POST /evaluate"| E
|
||||
RT -->|"POST /evaluate"| D
|
||||
P & E & D --> GPU
|
||||
P & E & D --> DS
|
||||
RT --> RES
|
||||
```
|
||||
|
||||
##### Estrategia de Build Multi-Stage
|
||||
|
||||
Los Dockerfiles utilizan una estrategia de build multi-stage para optimizar tiempos de construcción y tamaño de imágenes:
|
||||
|
||||
```mermaid
|
||||
---
|
||||
title: "Estrategia de build multi-stage"
|
||||
config:
|
||||
theme: base
|
||||
themeVariables:
|
||||
primaryColor: "#E6F4F9"
|
||||
primaryTextColor: "#404040"
|
||||
primaryBorderColor: "#0098CD"
|
||||
lineColor: "#0098CD"
|
||||
---
|
||||
flowchart LR
|
||||
subgraph Stage1["Stage 1: Base"]
|
||||
B1["CUDA Runtime"]
|
||||
B2["Python + pip"]
|
||||
B3["Dependencias OCR"]
|
||||
end
|
||||
|
||||
subgraph Stage2["Stage 2: Deploy"]
|
||||
D1["Código aplicación"]
|
||||
D2["FastAPI REST"]
|
||||
end
|
||||
|
||||
Stage1 --> Stage2
|
||||
|
||||
B1 --> B2 --> B3
|
||||
D1 --> D2
|
||||
```
|
||||
|
||||
**Ventajas de esta estrategia:**
|
||||
1. **Caché de dependencias**: La etapa base (CUDA + dependencias) se cachea y reutiliza
|
||||
2. **Builds rápidos**: Los cambios de código solo reconstruyen la etapa de deploy (~10 segundos)
|
||||
3. **Imágenes optimizadas**: Solo se incluyen los archivos necesarios para ejecución
|
||||
|
||||
##### Docker Compose Files
|
||||
|
||||
El proyecto incluye múltiples archivos Docker Compose para diferentes escenarios de uso:
|
||||
|
||||
**Tabla 18.** *Archivos Docker Compose del proyecto.*
|
||||
|
||||
| Archivo | Propósito | Servicios |
|
||||
|---------|-----------|-----------|
|
||||
| [`docker-compose.tuning.yml`](https://github.com/seryus/MastersThesis/blob/main/src/docker-compose.tuning.yml) | Optimización principal | RayTune + PaddleOCR + DocTR |
|
||||
| [`docker-compose.tuning.easyocr.yml`](https://github.com/seryus/MastersThesis/blob/main/src/docker-compose.tuning.easyocr.yml) | Optimización EasyOCR | RayTune + EasyOCR |
|
||||
| [`docker-compose.tuning.paddle.yml`](https://github.com/seryus/MastersThesis/blob/main/src/docker-compose.tuning.paddle.yml) | Optimización PaddleOCR | RayTune + PaddleOCR |
|
||||
| [`docker-compose.tuning.doctr.yml`](https://github.com/seryus/MastersThesis/blob/main/src/docker-compose.tuning.doctr.yml) | Optimización DocTR | RayTune + DocTR |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
|
||||
> **\* Nota:** EasyOCR y PaddleOCR utilizan el mismo puerto (8002). Debido a limitaciones de recursos GPU (VRAM insuficiente para ejecutar múltiples modelos OCR simultáneamente), solo se ejecuta un servicio a la vez durante los experimentos. Por esta razón, EasyOCR tiene su propio archivo Docker Compose separado.
|
||||
|
||||
##### Gestión de Volúmenes
|
||||
|
||||
Se utilizan volúmenes Docker nombrados para persistir los modelos descargados entre ejecuciones:
|
||||
|
||||
**Tabla 19.** *Volúmenes Docker para caché de modelos.*
|
||||
|
||||
| Volumen | Servicio | Contenido |
|
||||
|---------|----------|-----------|
|
||||
| `paddlex-model-cache` | PaddleOCR | Modelos PP-OCRv5 (~500 MB) |
|
||||
| `easyocr-model-cache` | EasyOCR | Modelos CRAFT + CRNN (~400 MB) |
|
||||
| `doctr-model-cache` | DocTR | Modelos db_resnet50 + crnn_vgg16_bn (~300 MB) |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
|
||||
##### Health Checks y Monitorización
|
||||
|
||||
Todos los servicios implementan health checks para garantizar disponibilidad antes de iniciar la optimización:
|
||||
|
||||
```yaml
|
||||
healthcheck:
|
||||
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s # PaddleOCR: 60s, EasyOCR: 120s, DocTR: 180s
|
||||
```
|
||||
|
||||
Los tiempos de `start_period` varían según el servicio debido al tiempo de carga de modelos:
|
||||
- **PaddleOCR**: 60 segundos (modelos más ligeros)
|
||||
- **EasyOCR**: 120 segundos (carga de modelos CRAFT)
|
||||
- **DocTR**: 180 segundos (modelos ResNet más pesados)
|
||||
|
||||
##### Flujo de Ejecución Completo
|
||||
|
||||
```mermaid
|
||||
---
|
||||
title: "Flujo de ejecución de optimización con Ray Tune"
|
||||
config:
|
||||
theme: base
|
||||
themeVariables:
|
||||
primaryColor: "#E6F4F9"
|
||||
primaryTextColor: "#404040"
|
||||
primaryBorderColor: "#0098CD"
|
||||
lineColor: "#0098CD"
|
||||
---
|
||||
sequenceDiagram
|
||||
participant U as Usuario
|
||||
participant DC as Docker Compose
|
||||
participant RT as RayTune
|
||||
participant OCR as Servicio OCR
|
||||
participant GPU as GPU
|
||||
|
||||
U->>DC: docker compose up -d
|
||||
DC->>OCR: Iniciar contenedor
|
||||
OCR->>GPU: Cargar modelos CUDA
|
||||
OCR-->>DC: Health check OK
|
||||
|
||||
U->>DC: docker compose run raytune
|
||||
DC->>RT: Iniciar optimización
|
||||
|
||||
loop 64 trials
|
||||
RT->>RT: Optuna sugiere config
|
||||
RT->>OCR: POST /evaluate {config}
|
||||
OCR->>GPU: Inferencia OCR
|
||||
OCR-->>RT: {CER, WER, TIME}
|
||||
RT->>RT: Registrar métricas
|
||||
end
|
||||
|
||||
RT-->>U: Mejor configuración encontrada
|
||||
U->>DC: docker compose down
|
||||
```
|
||||
|
||||
##### Reproducibilidad
|
||||
|
||||
Para reproducir los experimentos:
|
||||
|
||||
```bash
|
||||
# 1. Clonar repositorio
|
||||
git clone https://github.com/seryus/MastersThesis.git
|
||||
cd MastersThesis/src
|
||||
|
||||
# 2. Iniciar servicio OCR (requiere nvidia-docker)
|
||||
docker compose -f docker-compose.tuning.paddle.yml up -d paddle-ocr-gpu
|
||||
|
||||
# 3. Verificar health check
|
||||
curl http://localhost:8002/health
|
||||
|
||||
# 4. Ejecutar optimización (64 trials)
|
||||
docker compose -f docker-compose.tuning.paddle.yml run raytune \
|
||||
--service paddle --samples 64
|
||||
|
||||
# 5. Resultados en src/results/
|
||||
ls -la results/raytune_paddle_results_*.csv
|
||||
|
||||
# 6. Limpiar
|
||||
docker compose -f docker-compose.tuning.paddle.yml down
|
||||
```
|
||||
|
||||
Los resultados de los experimentos están disponibles en:
|
||||
- [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv)
|
||||
- [`src/results/raytune_easyocr_results_20260119_120204.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_easyocr_results_20260119_120204.csv)
|
||||
- [`src/results/raytune_doctr_results_20260119_121445.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_doctr_results_20260119_121445.csv)
|
||||
|
||||
#### Dataset Extendido
|
||||
|
||||
Para la fase de optimización se extendió el dataset:
|
||||
|
||||
**Tabla 16.** *Características del dataset de optimización.*
|
||||
**Tabla 20.** *Características del dataset de optimización.*
|
||||
|
||||
| Característica | Valor |
|
||||
|----------------|-------|
|
||||
@@ -335,7 +552,7 @@ La clase `ImageTextDataset` gestiona la carga de pares imagen-texto desde la est
|
||||
|
||||
El espacio de búsqueda se definió considerando los hiperparámetros más relevantes identificados en la documentación de PaddleOCR, utilizando `tune.choice()` para parámetros booleanos y `tune.uniform()` para umbrales continuos. La implementación está disponible en `src/raytune/raytune_ocr.py` (ver Anexo A).
|
||||
|
||||
**Tabla 17.** *Descripción detallada del espacio de búsqueda.*
|
||||
**Tabla 21.** *Descripción detallada del espacio de búsqueda.*
|
||||
|
||||
| Parámetro | Tipo | Rango | Descripción |
|
||||
|-----------|------|-------|-------------|
|
||||
@@ -361,7 +578,7 @@ El espacio de búsqueda se definió considerando los hiperparámetros más relev
|
||||
|
||||
Se configuró Ray Tune con OptunaSearch como algoritmo de búsqueda, optimizando CER en 64 trials con 2 ejecuciones concurrentes. La implementación está disponible en `src/raytune/raytune_ocr.py` (ver Anexo A).
|
||||
|
||||
**Tabla 18.** *Parámetros de configuración de Ray Tune.*
|
||||
**Tabla 22.** *Parámetros de configuración de Ray Tune.*
|
||||
|
||||
| Parámetro | Valor | Justificación |
|
||||
|-----------|-------|---------------|
|
||||
@@ -387,7 +604,7 @@ El número de trials se eligió considerando:
|
||||
|
||||
El experimento se ejecutó exitosamente con los siguientes resultados globales:
|
||||
|
||||
**Tabla 19.** *Resumen de la ejecución del experimento.*
|
||||
**Tabla 23.** *Resumen de la ejecución del experimento.*
|
||||
|
||||
| Métrica | Valor |
|
||||
|---------|-------|
|
||||
@@ -401,76 +618,73 @@ El experimento se ejecutó exitosamente con los siguientes resultados globales:
|
||||
|
||||
#### Estadísticas Descriptivas
|
||||
|
||||
Del archivo CSV de resultados (`raytune_paddle_subproc_results_20251207_192320.csv`):
|
||||
Del archivo CSV de resultados (`src/results/raytune_paddle_results_20260119_122609.csv`):
|
||||
|
||||
**Tabla 20.** *Estadísticas descriptivas de los 64 trials.*
|
||||
**Tabla 24.** *Estadísticas descriptivas de los 64 trials.*
|
||||
|
||||
| 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%** (mediana) | 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 |
|
||||
| Estadística | CER | WER | Tiempo/Página (s) |
|
||||
|-------------|-----|-----|-------------------|
|
||||
| **count** | 64 | 64 | 64 |
|
||||
| **mean** | 2.30% | 9.25% | 0.84 |
|
||||
| **std** | 2.20% | 1.78% | 0.53 |
|
||||
| **min** | 0.79% | 6.80% | 0.56 |
|
||||
| **50%** (mediana) | 0.87% | 8.39% | 0.59 |
|
||||
| **max** | 7.30% | 13.20% | 2.22 |
|
||||
|
||||
*Fuente: `src/raytune_paddle_subproc_results_20251207_192320.csv`.*
|
||||
*Fuente: `src/results/raytune_paddle_results_20260119_122609.csv`.*
|
||||
|
||||
**Observaciones:**
|
||||
|
||||
1. **Alta varianza en CER**: La desviación estándar (11.03%) es mayor que la media (5.25%), indicando una distribución muy dispersa con algunos valores extremos.
|
||||
1. **Baja varianza en CER**: La desviación estándar (2.20%) es similar a la media (2.30%), indicando una distribución relativamente consistente sin valores extremos catastróficos.
|
||||
|
||||
2. **Mediana vs Media**: La mediana del CER (1.23%) es mucho menor que la media (5.25%), confirmando una distribución sesgada hacia valores bajos con outliers altos.
|
||||
2. **Mediana vs Media**: La mediana del CER (0.87%) es menor que la media (2.30%), confirmando una distribución ligeramente sesgada hacia valores bajos.
|
||||
|
||||
3. **Tiempo consistente**: El tiempo de ejecución es muy estable (std = 1.57 s/página), indicando que las configuraciones de hiperparámetros no afectan significativamente el tiempo de inferencia.
|
||||
3. **Velocidad GPU**: El tiempo de ejecución promedio es de 0.84 s/página, lo que representa una aceleración significativa respecto a la ejecución en CPU (~69 s/página, 82x más rápido).
|
||||
|
||||
#### Distribución de Resultados
|
||||
|
||||
**Tabla 21.** *Distribución de trials por rango de CER.*
|
||||
**Tabla 25.** *Distribución de trials por rango de CER.*
|
||||
|
||||
| Rango CER | Número de trials | Porcentaje |
|
||||
|-----------|------------------|------------|
|
||||
| < 2% | 43 | 67.2% |
|
||||
| 2% - 5% | 7 | 10.9% |
|
||||
| 5% - 10% | 2 | 3.1% |
|
||||
| 10% - 20% | 5 | 7.8% |
|
||||
| > 20% | 7 | 10.9% |
|
||||
| 2% - 5% | 10 | 15.6% |
|
||||
| 5% - 10% | 11 | 17.2% |
|
||||
| > 10% | 0 | 0.0% |
|
||||
|
||||
*Fuente: Elaboración propia a partir del CSV de resultados.*
|
||||
*Fuente: Elaboración propia a partir de `src/results/raytune_paddle_results_20260119_122609.csv`.*
|
||||
|
||||
La mayoría de trials (67.2%) alcanzaron CER < 2%, cumpliendo el objetivo establecido. Sin embargo, un 10.9% de trials presentaron fallos catastróficos (CER > 20%).
|
||||
La mayoría de trials (67.2%) alcanzaron CER < 2%, cumpliendo el objetivo establecido. Ningún trial presentó fallos catastróficos (CER > 10%), demostrando la estabilidad de la optimización con GPU.
|
||||
|
||||
#### Mejor Configuración Encontrada
|
||||
|
||||
La configuración que minimizó el CER fue:
|
||||
|
||||
```
|
||||
Best CER: 0.011535 (1.15%)
|
||||
Best WER: 0.098902 (9.89%)
|
||||
Best CER: 0.007884 (0.79%)
|
||||
Best WER: 0.077848 (7.78%)
|
||||
|
||||
Configuración óptima:
|
||||
textline_orientation: True
|
||||
use_doc_orientation_classify: False
|
||||
use_doc_orientation_classify: True
|
||||
use_doc_unwarping: False
|
||||
text_det_thresh: 0.4690
|
||||
text_det_box_thresh: 0.5412
|
||||
text_det_thresh: 0.0462
|
||||
text_det_box_thresh: 0.4862
|
||||
text_det_unclip_ratio: 0.0
|
||||
text_rec_score_thresh: 0.6350
|
||||
text_rec_score_thresh: 0.5658
|
||||
```
|
||||
|
||||
**Tabla 22.** *Configuración óptima identificada.*
|
||||
**Tabla 26.** *Configuración óptima identificada.*
|
||||
|
||||
| Parámetro | Valor óptimo | Valor por defecto | Cambio |
|
||||
|-----------|--------------|-------------------|--------|
|
||||
| textline_orientation | **True** | False | Activado |
|
||||
| use_doc_orientation_classify | False | False | Sin cambio |
|
||||
| use_doc_orientation_classify | **True** | False | Activado |
|
||||
| use_doc_unwarping | False | False | Sin cambio |
|
||||
| text_det_thresh | **0.4690** | 0.3 | +0.169 |
|
||||
| text_det_box_thresh | **0.5412** | 0.6 | -0.059 |
|
||||
| text_det_thresh | **0.0462** | 0.3 | -0.254 |
|
||||
| text_det_box_thresh | **0.4862** | 0.6 | -0.114 |
|
||||
| text_det_unclip_ratio | 0.0 | 1.5 | -1.5 (fijado) |
|
||||
| text_rec_score_thresh | **0.6350** | 0.5 | +0.135 |
|
||||
| text_rec_score_thresh | **0.5658** | 0.5 | +0.066 |
|
||||
|
||||
*Fuente: Análisis de [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results) generados por [`src/run_tuning.py`](https://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py).*
|
||||
|
||||
@@ -478,7 +692,7 @@ Configuración óptima:
|
||||
|
||||
Se calculó la correlación de Pearson entre los parámetros continuos y las métricas de error:
|
||||
|
||||
**Tabla 23.** *Correlación de parámetros con CER.*
|
||||
**Tabla 27.** *Correlación de parámetros con CER.*
|
||||
|
||||
| Parámetro | Correlación con CER | Interpretación |
|
||||
|-----------|---------------------|----------------|
|
||||
@@ -489,7 +703,7 @@ Se calculó la correlación de Pearson entre los parámetros continuos y las mé
|
||||
|
||||
*Fuente: Análisis de [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results) generados por [`src/run_tuning.py`](https://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py).*
|
||||
|
||||
**Tabla 24.** *Correlación de parámetros con WER.*
|
||||
**Tabla 28.** *Correlación de parámetros con WER.*
|
||||
|
||||
| Parámetro | Correlación con WER | Interpretación |
|
||||
|-----------|---------------------|----------------|
|
||||
@@ -505,7 +719,7 @@ Se calculó la correlación de Pearson entre los parámetros continuos y las mé
|
||||
|
||||
El parámetro booleano `textline_orientation` demostró tener el mayor impacto en el rendimiento:
|
||||
|
||||
**Tabla 25.** *Impacto del parámetro textline_orientation.*
|
||||
**Tabla 29.** *Impacto del parámetro textline_orientation.*
|
||||
|
||||
| textline_orientation | CER Medio | CER Std | WER Medio | N trials |
|
||||
|---------------------|-----------|---------|-----------|----------|
|
||||
@@ -525,6 +739,13 @@ El parámetro booleano `textline_orientation` demostró tener el mayor impacto e
|
||||
```mermaid
|
||||
---
|
||||
title: "Impacto de textline_orientation en CER"
|
||||
config:
|
||||
theme: base
|
||||
themeVariables:
|
||||
primaryColor: "#E6F4F9"
|
||||
primaryTextColor: "#404040"
|
||||
primaryBorderColor: "#0098CD"
|
||||
lineColor: "#0098CD"
|
||||
---
|
||||
xychart-beta
|
||||
x-axis ["textline_orientation=False", "textline_orientation=True"]
|
||||
@@ -540,7 +761,7 @@ El parámetro `textline_orientation` activa un clasificador que determina la ori
|
||||
|
||||
Los trials con CER muy alto (>20%) presentaron patrones específicos:
|
||||
|
||||
**Tabla 26.** *Características de trials con fallos catastróficos.*
|
||||
**Tabla 30.** *Características de trials con fallos catastróficos.*
|
||||
|
||||
| Trial | CER | text_det_thresh | textline_orientation | Diagnóstico |
|
||||
|-------|-----|-----------------|---------------------|-------------|
|
||||
@@ -565,42 +786,52 @@ Los trials con CER muy alto (>20%) presentaron patrones específicos:
|
||||
|
||||
#### Evaluación sobre Dataset Completo
|
||||
|
||||
La configuración óptima identificada se evaluó sobre el dataset completo de 24 páginas, comparando con la configuración baseline (valores por defecto de PaddleOCR). Los parámetros optimizados más relevantes fueron: `textline_orientation=True`, `text_det_thresh=0.4690`, `text_det_box_thresh=0.5412`, y `text_rec_score_thresh=0.6350`.
|
||||
La configuración óptima identificada se evaluó sobre el dataset completo de 45 páginas, comparando con la configuración baseline (valores por defecto de PaddleOCR). Los parámetros optimizados más relevantes fueron: `textline_orientation=True`, `use_doc_orientation_classify=True`, `text_det_thresh=0.0462`, `text_det_box_thresh=0.4862`, y `text_rec_score_thresh=0.5658`.
|
||||
|
||||
**Tabla 27.** *Comparación baseline vs optimizado (24 páginas).*
|
||||
**Tabla 31.** *Comparación baseline vs optimizado (45 páginas).*
|
||||
|
||||
| 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%** |
|
||||
| PaddleOCR (Baseline) | 8.85% | 91.15% | 13.05% | 86.95% |
|
||||
| PaddleOCR-HyperAdjust | **7.72%** | **92.28%** | **11.40%** | **88.60%** |
|
||||
|
||||
*Fuente: Validación final. Código en [`src/run_tuning.py`](https://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py), resultados en [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results).*
|
||||
|
||||
> **Nota sobre generalización:** El mejor trial individual (5 páginas) alcanzó un CER de 0.79%, cumpliendo el objetivo de CER < 2%. Sin embargo, al aplicar la configuración al dataset completo de 45 páginas, el CER aumentó a 7.72%, evidenciando sobreajuste al subconjunto de entrenamiento. Esta diferencia es un hallazgo importante que se discute en la sección de análisis.
|
||||
|
||||
#### Métricas de Mejora
|
||||
|
||||
**Tabla 28.** *Análisis cuantitativo de la mejora.*
|
||||
**Tabla 32.** *Análisis cuantitativo de la mejora.*
|
||||
|
||||
| Forma de Medición | CER | WER |
|
||||
|-------------------|-----|-----|
|
||||
| Valor baseline | 7.78% | 14.94% |
|
||||
| Valor optimizado | 1.49% | 7.62% |
|
||||
| Mejora absoluta | -6.29 pp | -7.32 pp |
|
||||
| Reducción relativa del error | **80.9%** | **49.0%** |
|
||||
| Factor de mejora | 5.2× | 2.0× |
|
||||
| Valor baseline | 8.85% | 13.05% |
|
||||
| Valor optimizado | 7.72% | 11.40% |
|
||||
| Mejora absoluta | -1.13 pp | -1.65 pp |
|
||||
| Reducción relativa del error | **12.8%** | **12.6%** |
|
||||
| Factor de mejora | 1.15× | 1.14× |
|
||||
| **Mejor trial (5 páginas)** | **0.79%** | **7.78%** |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
|
||||
```mermaid
|
||||
---
|
||||
title: "Reducción de errores: Baseline vs Optimizado"
|
||||
title: "Reducción de errores: Baseline vs Optimizado (45 páginas)"
|
||||
config:
|
||||
theme: base
|
||||
themeVariables:
|
||||
primaryColor: "#E6F4F9"
|
||||
primaryTextColor: "#404040"
|
||||
primaryBorderColor: "#0098CD"
|
||||
lineColor: "#0098CD"
|
||||
---
|
||||
xychart-beta
|
||||
x-axis ["CER Baseline", "CER Optimizado", "WER Baseline", "WER Optimizado"]
|
||||
y-axis "Tasa de error (%)" 0 --> 16
|
||||
bar [7.78, 1.49, 14.94, 7.62]
|
||||
bar [8.85, 7.72, 13.05, 11.40]
|
||||
```
|
||||
|
||||
*Leyenda: CER = Character Error Rate, WER = Word Error Rate. Baseline = configuración por defecto de PaddleOCR. Optimizado = configuración encontrada por Ray Tune.*
|
||||
*Leyenda: CER = Character Error Rate, WER = Word Error Rate. Baseline = configuración por defecto de PaddleOCR. Optimizado = configuración encontrada por Ray Tune. Los valores corresponden al dataset completo de 45 páginas.*
|
||||
|
||||
#### Impacto Práctico
|
||||
|
||||
@@ -608,58 +839,61 @@ xychart-beta
|
||||
|
||||
| Configuración | Caracteres con error | Palabras con error* |
|
||||
|---------------|---------------------|---------------------|
|
||||
| Baseline | ~778 | ~225 |
|
||||
| Optimizada | ~149 | ~115 |
|
||||
| **Reducción** | **629 menos** | **110 menos** |
|
||||
| Baseline | ~885 | ~196 |
|
||||
| Optimizada (full dataset) | ~772 | ~171 |
|
||||
| Optimizada (mejor trial) | ~79 | ~117 |
|
||||
| **Reducción (full dataset)** | **113 menos** | **25 menos** |
|
||||
|
||||
*Asumiendo longitud media de palabra = 6.6 caracteres en español.
|
||||
|
||||
**Interpretación del notebook:**
|
||||
**Interpretación:**
|
||||
|
||||
> "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%."
|
||||
> "La optimización de hiperparámetros logró una mejora del 12.8% en el CER sobre el dataset completo de 45 páginas. Aunque esta mejora es más modesta que la observada en los trials individuales (donde se alcanzó 0.79% CER), demuestra el valor de la optimización sistemática. La diferencia entre el mejor trial (0.79%) y el resultado en dataset completo (7.72%) revela un fenómeno de sobreajuste al subconjunto de 5 páginas usado para evaluación."
|
||||
|
||||
### Tiempo de Ejecución
|
||||
|
||||
**Tabla 29.** *Métricas de tiempo del experimento.*
|
||||
**Tabla 33.** *Métricas de tiempo del experimento (GPU).*
|
||||
|
||||
| Métrica | Valor |
|
||||
|---------|-------|
|
||||
| Tiempo total del experimento | ~6.4 horas |
|
||||
| Tiempo medio por trial | 347.61 segundos (~5.8 min) |
|
||||
| Tiempo medio por página | 69.42 segundos |
|
||||
| Variabilidad (std) | 1.57 segundos/página |
|
||||
| Tiempo total del experimento | ~1.5 horas |
|
||||
| Tiempo medio por trial | ~4.2 segundos |
|
||||
| Tiempo medio por página | 0.84 segundos |
|
||||
| Variabilidad (std) | 0.53 segundos/página |
|
||||
| Páginas procesadas totales | 320 |
|
||||
|
||||
*Fuente: CSV de resultados.*
|
||||
*Fuente: [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv).*
|
||||
|
||||
**Observaciones:**
|
||||
|
||||
1. El tiempo por página (~70 segundos) corresponde a ejecución en CPU sin aceleración.
|
||||
2. La variabilidad del tiempo es muy baja, indicando que los hiperparámetros no afectan significativamente la velocidad.
|
||||
3. Con GPU, los tiempos serían 10-50× menores según benchmarks de PaddleOCR.
|
||||
1. El tiempo por página (~0.84 segundos) corresponde a ejecución con GPU (RTX 3060).
|
||||
2. La variabilidad del tiempo es moderada (std = 0.53 s/página), con algunos trials más lentos debido a configuraciones con módulos de preprocesamiento activos.
|
||||
3. En comparación, la ejecución en CPU requiere ~69 segundos/página (82× más lento), lo que justifica el uso de GPU para optimización y producción.
|
||||
|
||||
### Resumen de la Sección
|
||||
|
||||
Esta sección ha presentado:
|
||||
|
||||
1. **Configuración del experimento**: Arquitectura Docker Compose, dataset extendido, espacio de búsqueda de 7 dimensiones
|
||||
1. **Configuración del experimento**: Arquitectura Docker Compose, dataset de 45 páginas, espacio de búsqueda de 7 dimensiones, ejecución con GPU RTX 3060
|
||||
|
||||
2. **Resultados estadísticos**:
|
||||
- CER medio: 5.25% (std: 11.03%)
|
||||
- CER mínimo: 1.15%
|
||||
- CER medio: 2.30% (std: 2.20%)
|
||||
- CER mínimo (mejor trial): **0.79%**
|
||||
- 67.2% de trials con CER < 2%
|
||||
|
||||
3. **Hallazgos clave**:
|
||||
- `textline_orientation=True` reduce CER en 69.7%
|
||||
- `text_det_thresh` tiene correlación -0.52 con CER
|
||||
- Valores de `text_det_thresh` < 0.1 causan fallos catastróficos
|
||||
- `textline_orientation=True` y `use_doc_orientation_classify=True` son críticos
|
||||
- `text_det_thresh` bajo (0.0462) optimiza la detección de texto
|
||||
- Ningún trial presentó fallos catastróficos (CER > 10%)
|
||||
|
||||
4. **Mejora final**: CER reducido de 7.78% a 1.49% (reducción del 80.9%)
|
||||
4. **Mejora en dataset completo**: CER reducido de 8.85% a 7.72% (reducción del 12.8%)
|
||||
|
||||
5. **Observación sobre generalización**: El mejor trial (0.79%) no generalizó completamente al dataset completo (7.72%), evidenciando sobreajuste al subconjunto de 5 páginas
|
||||
|
||||
**Fuentes de datos:**
|
||||
- [`src/run_tuning.py`](https://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py): Script principal de optimización
|
||||
- [`src/raytune_ocr.py`](https://github.com/seryus/MastersThesis/blob/main/src/raytune_ocr.py): Librería de utilidades Ray Tune
|
||||
- [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results): Resultados CSV de los trials
|
||||
- [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv): Resultados CSV de los 64 trials
|
||||
|
||||
## Discusión y análisis de resultados
|
||||
|
||||
@@ -671,49 +905,51 @@ Esta sección presenta un análisis consolidado de los resultados obtenidos en l
|
||||
|
||||
#### Progresión del Rendimiento
|
||||
|
||||
**Tabla 30.** *Evolución del rendimiento a través del estudio.*
|
||||
**Tabla 34.** *Evolución del rendimiento a través del estudio.*
|
||||
|
||||
| Fase | Configuración | CER | Mejora vs anterior |
|
||||
|------|--------------|-----|-------------------|
|
||||
| Benchmark inicial | Baseline (5 páginas) | ~5-6% | - |
|
||||
| Optimización (mejor trial) | Optimizada (5 páginas) | 1.15% | ~80% |
|
||||
| Validación final | Optimizada (24 páginas) | 1.49% | - |
|
||||
| Benchmark inicial | Baseline (5 páginas) | ~7-8% | - |
|
||||
| Optimización (mejor trial) | Optimizada (5 páginas) | **0.79%** | ~90% vs baseline |
|
||||
| Validación final | Optimizada (45 páginas) | 7.72% | 12.8% vs baseline |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
|
||||
El incremento del CER de 1.15% (5 páginas) a 1.49% (24 páginas) es esperado debido a la mayor diversidad de layouts en el dataset completo.
|
||||
El incremento del CER de 0.79% (5 páginas) a 7.72% (45 páginas) evidencia sobreajuste al subconjunto de optimización. Este fenómeno es esperado cuando se optimiza sobre un subconjunto pequeño y se valida sobre el dataset completo con mayor diversidad de layouts.
|
||||
|
||||
#### Comparación con Objetivo
|
||||
|
||||
**Tabla 31.** *Verificación del objetivo general.*
|
||||
**Tabla 35.** *Verificación del objetivo general.*
|
||||
|
||||
| Aspecto | Objetivo | Resultado | Cumplimiento |
|
||||
|---------|----------|-----------|--------------|
|
||||
| Métrica | CER | CER | ✓ |
|
||||
| Umbral | < 2% | 1.49% | ✓ |
|
||||
| Método | Sin fine-tuning | Solo hiperparámetros | ✓ |
|
||||
| Hardware | Sin GPU | CPU only | ✓ |
|
||||
| Aspecto | Objetivo | Resultado (trial) | Resultado (full) | Cumplimiento |
|
||||
|---------|----------|-------------------|------------------|--------------|
|
||||
| Métrica | CER | CER | CER | ✓ |
|
||||
| Umbral | < 2% | **0.79%** | 7.72% | Parcial |
|
||||
| Método | Sin fine-tuning | Solo hiperparámetros | Solo hiperparámetros | ✓ |
|
||||
| Hardware | GPU | RTX 3060 | RTX 3060 | ✓ |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
|
||||
> **Análisis del cumplimiento:** El objetivo de CER < 2% se cumple en el mejor trial individual (0.79%), demostrando que la optimización de hiperparámetros puede alcanzar la precisión objetivo. Sin embargo, la validación sobre el dataset completo (7.72%) muestra que la generalización requiere trabajo adicional, como un subconjunto de optimización más representativo o técnicas de regularización.
|
||||
|
||||
### Análisis Detallado de Hiperparámetros
|
||||
|
||||
#### Jerarquía de Importancia
|
||||
|
||||
Basándose en el análisis de correlación y el impacto observado:
|
||||
Basándose en el análisis de los resultados de optimización:
|
||||
|
||||
**Tabla 32.** *Ranking de importancia de hiperparámetros.*
|
||||
**Tabla 36.** *Ranking de importancia de hiperparámetros.*
|
||||
|
||||
| Rank | Parámetro | Impacto | Evidencia |
|
||||
|------|-----------|---------|-----------|
|
||||
| 1 | `textline_orientation` | **Crítico** | Reduce CER 69.7% |
|
||||
| 2 | `text_det_thresh` | **Alto** | Correlación -0.52 |
|
||||
| 3 | `text_rec_score_thresh` | Medio | Correlación -0.16 |
|
||||
| 4 | `text_det_box_thresh` | Bajo | Correlación +0.23 |
|
||||
| 5 | `use_doc_orientation_classify` | Nulo | Sin mejora |
|
||||
| 6 | `use_doc_unwarping` | Nulo | Sin mejora |
|
||||
| 1 | `textline_orientation` | **Crítico** | Presente en todos los mejores trials |
|
||||
| 2 | `use_doc_orientation_classify` | **Alto** | Activado en configuración óptima |
|
||||
| 3 | `text_det_thresh` | **Alto** | Valor óptimo bajo (0.0462) |
|
||||
| 4 | `text_det_box_thresh` | Medio | Moderado (0.4862) |
|
||||
| 5 | `text_rec_score_thresh` | Medio | Moderado (0.5658) |
|
||||
| 6 | `use_doc_unwarping` | Nulo | Desactivado en configuración óptima |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
*Fuente: Elaboración propia basada en [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv).*
|
||||
|
||||
#### Análisis del Parámetro textline_orientation
|
||||
|
||||
@@ -735,35 +971,39 @@ Para documentos académicos que típicamente incluyen tablas, listas y encabezad
|
||||
|
||||
| Rango | CER típico | Comportamiento |
|
||||
|-------|------------|----------------|
|
||||
| 0.0 - 0.1 | >20% | Fallos catastróficos |
|
||||
| 0.1 - 0.3 | 5-15% | Rendimiento pobre |
|
||||
| 0.3 - 0.5 | 1-5% | Rendimiento óptimo |
|
||||
| 0.5 - 0.7 | 2-8% | Rendimiento aceptable |
|
||||
| 0.0 - 0.1 | 1-3% | Detecta más texto, incluyendo bordes |
|
||||
| 0.1 - 0.3 | 2-5% | Rendimiento variable |
|
||||
| 0.3 - 0.5 | 3-7% | Balance precisión/recall |
|
||||
| 0.5 - 0.7 | 4-7% | Más conservador |
|
||||
|
||||
**Interpretación:**
|
||||
|
||||
- Valores muy bajos (< 0.1) incluyen ruido y artefactos como "texto"
|
||||
- Valores muy altos (> 0.6) filtran texto legítimo de bajo contraste
|
||||
- El rango óptimo (0.3-0.5) balancea precisión y recall de detección
|
||||
- En ejecución GPU con modelos Mobile, valores bajos de `text_det_thresh` funcionan bien
|
||||
- El valor óptimo (0.0462) indica que una detección más sensible beneficia el rendimiento
|
||||
- A diferencia de CPU, no se observaron fallos catastróficos con valores bajos
|
||||
|
||||
**Valor óptimo encontrado**: 0.4690
|
||||
**Valor óptimo encontrado**: 0.0462
|
||||
|
||||
#### Parámetros sin Impacto Significativo
|
||||
#### Análisis de Parámetros de Preprocesamiento
|
||||
|
||||
**`use_doc_orientation_classify` y `use_doc_unwarping`:**
|
||||
**`use_doc_orientation_classify`:**
|
||||
|
||||
Estos módulos están diseñados para:
|
||||
En la configuración óptima GPU, este parámetro está **activado** (True), a diferencia de lo observado en experimentos anteriores. Esto sugiere que la clasificación de orientación del documento puede beneficiar incluso documentos digitales cuando se combina con `textline_orientation=True`.
|
||||
|
||||
**`use_doc_unwarping`:**
|
||||
|
||||
Este módulo permanece desactivado en la configuración óptima. Está diseñado para:
|
||||
- Documentos escaneados con rotación
|
||||
- Fotografías de documentos con perspectiva
|
||||
- Documentos curvados o deformados
|
||||
|
||||
Para documentos PDF digitales como los evaluados, estos módulos son innecesarios e incluso pueden introducir artefactos. Su desactivación reduce el tiempo de procesamiento sin pérdida de precisión.
|
||||
Para documentos PDF digitales como los evaluados, este módulo es innecesario y puede introducir artefactos.
|
||||
|
||||
### Análisis de Casos de Fallo
|
||||
|
||||
#### Clasificación de Errores
|
||||
|
||||
**Tabla 33.** *Tipología de errores observados.*
|
||||
**Tabla 37.** *Tipología de errores observados.*
|
||||
|
||||
| Tipo de error | Frecuencia | Ejemplo | Causa probable |
|
||||
|---------------|------------|---------|----------------|
|
||||
@@ -777,7 +1017,7 @@ Para documentos PDF digitales como los evaluados, estos módulos son innecesario
|
||||
|
||||
#### Patrones de Fallo por Tipo de Contenido
|
||||
|
||||
**Tabla 34.** *Tasa de error por tipo de contenido.*
|
||||
**Tabla 38.** *Tasa de error por tipo de contenido.*
|
||||
|
||||
| Tipo de contenido | CER estimado | Factor de riesgo |
|
||||
|-------------------|--------------|------------------|
|
||||
@@ -792,18 +1032,20 @@ Para documentos PDF digitales como los evaluados, estos módulos son innecesario
|
||||
|
||||
### Comparación con Objetivos Específicos
|
||||
|
||||
**Tabla 35.** *Cumplimiento de objetivos específicos.*
|
||||
**Tabla 39.** *Cumplimiento de objetivos específicos.*
|
||||
|
||||
| Objetivo | Descripción | Resultado | Estado |
|
||||
|----------|-------------|-----------|--------|
|
||||
| OE1 | Comparar soluciones OCR | EasyOCR, PaddleOCR, DocTR evaluados; PaddleOCR seleccionado | ✓ Cumplido |
|
||||
| OE2 | Preparar dataset de evaluación | 24 páginas con ground truth | ✓ Cumplido |
|
||||
| OE3 | Identificar hiperparámetros críticos | `textline_orientation` y `text_det_thresh` identificados | ✓ Cumplido |
|
||||
| OE4 | Optimizar con Ray Tune (≥50 trials) | 64 trials ejecutados | ✓ Cumplido |
|
||||
| OE5 | Validar configuración optimizada | CER: 7.78% → 1.49% documentado | ✓ Cumplido |
|
||||
| OE2 | Preparar dataset de evaluación | 45 páginas con ground truth | ✓ Cumplido |
|
||||
| OE3 | Identificar hiperparámetros críticos | `textline_orientation`, `use_doc_orientation_classify`, `text_det_thresh` identificados | ✓ Cumplido |
|
||||
| OE4 | Optimizar con Ray Tune (≥50 trials) | 64 trials ejecutados con GPU | ✓ Cumplido |
|
||||
| OE5 | Validar configuración optimizada | CER: 8.85% → 7.72% (dataset), 0.79% (mejor trial) | ✓ Parcial |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
|
||||
> **Nota sobre OE5:** El objetivo de CER < 2% se cumple en el mejor trial individual (0.79%). La validación sobre el dataset completo (7.72%) muestra que la generalización requiere mayor trabajo, identificándose como línea de trabajo futuro.
|
||||
|
||||
### Limitaciones del Estudio
|
||||
|
||||
#### Limitaciones de Generalización
|
||||
@@ -818,11 +1060,11 @@ Para documentos PDF digitales como los evaluados, estos módulos son innecesario
|
||||
|
||||
1. **Ground truth automático**: El texto de referencia se extrajo programáticamente del PDF, lo cual puede introducir errores en layouts complejos donde el orden de lectura no es evidente.
|
||||
|
||||
2. **Tamaño del dataset**: 24 páginas es un dataset pequeño. Un dataset más amplio proporcionaría estimaciones más robustas.
|
||||
2. **Tamaño del dataset**: 45 páginas es un dataset limitado. Un dataset más amplio proporcionaría estimaciones más robustas.
|
||||
|
||||
3. **Parámetro fijo**: `text_det_unclip_ratio` se mantuvo en 0.0 durante todo el experimento. Explorar este parámetro podría revelar mejoras adicionales.
|
||||
|
||||
4. **Ejecución en CPU**: Los tiempos reportados corresponden a ejecución en CPU. El comportamiento con GPU podría diferir.
|
||||
4. **Subconjunto de ajuste limitado**: El ajuste de hiperparámetros se realizó sobre 5 páginas (páginas 5-10), lo que contribuyó al sobreajuste observado en la validación del dataset completo.
|
||||
|
||||
#### Limitaciones de Validación
|
||||
|
||||
@@ -836,31 +1078,33 @@ Para documentos PDF digitales como los evaluados, estos módulos son innecesario
|
||||
|
||||
Para documentos académicos en español similares a los evaluados:
|
||||
|
||||
**Tabla 31.** *Configuración recomendada para PaddleOCR.*
|
||||
**Tabla 40.** *Configuración recomendada para PaddleOCR con GPU.*
|
||||
|
||||
| Parámetro | Valor | Prioridad | Justificación |
|
||||
|-----------|-------|-----------|---------------|
|
||||
| `textline_orientation` | True | Obligatorio | Reduce CER en 69.7% |
|
||||
| `text_det_thresh` | 0.45 (rango: 0.4-0.5) | Recomendado | Correlación fuerte con CER |
|
||||
| `text_rec_score_thresh` | 0.6 (rango: 0.5-0.7) | Recomendado | Filtra reconocimientos poco confiables |
|
||||
| `text_det_box_thresh` | 0.55 (rango: 0.5-0.6) | Opcional | Impacto moderado |
|
||||
| `use_doc_orientation_classify` | False | No recomendado | Innecesario para PDFs digitales |
|
||||
| `textline_orientation` | True | Obligatorio | Crítico para layouts complejos |
|
||||
| `use_doc_orientation_classify` | True | Recomendado | Mejora orientación de documento |
|
||||
| `text_det_thresh` | 0.05 (rango: 0.04-0.10) | Recomendado | Detección sensible beneficia resultados |
|
||||
| `text_det_box_thresh` | 0.49 (rango: 0.4-0.6) | Recomendado | Balance de confianza |
|
||||
| `text_rec_score_thresh` | 0.57 (rango: 0.5-0.7) | Opcional | Filtra reconocimientos poco confiables |
|
||||
| `use_doc_unwarping` | False | No recomendado | Innecesario para PDFs digitales |
|
||||
|
||||
*Fuente: Análisis de resultados de optimización.*
|
||||
*Fuente: Análisis de [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv).*
|
||||
|
||||
#### Cuándo Aplicar Esta Metodología
|
||||
|
||||
La optimización de hiperparámetros es recomendable cuando:
|
||||
|
||||
1. **Sin GPU disponible**: El fine-tuning requiere GPU; la optimización de hiperparámetros no.
|
||||
1. **GPU disponible**: Acelera significativamente la exploración del espacio de hiperparámetros (82× más rápido que CPU).
|
||||
|
||||
2. **Modelo preentrenado adecuado**: El modelo ya soporta el idioma objetivo.
|
||||
2. **Modelo preentrenado adecuado**: El modelo ya soporta el idioma objetivo (como PaddleOCR para español).
|
||||
|
||||
3. **Dominio específico**: Se busca optimizar para un tipo de documento particular.
|
||||
|
||||
4. **Mejora incremental**: El rendimiento baseline es aceptable pero mejorable.
|
||||
|
||||
5. **Sin datos de entrenamiento**: No se dispone de datasets etiquetados para fine-tuning.
|
||||
|
||||
#### Cuándo NO Aplicar Esta Metodología
|
||||
|
||||
La optimización de hiperparámetros puede ser insuficiente cuando:
|
||||
@@ -882,33 +1126,38 @@ Este capítulo ha presentado el desarrollo completo de la contribución:
|
||||
- Selección de PaddleOCR por su configurabilidad
|
||||
|
||||
**Desarrollo de la comparativa:**
|
||||
- 64 trials de Ray Tune con Optuna
|
||||
- Identificación de `textline_orientation` y `text_det_thresh` como críticos
|
||||
- CER mínimo alcanzado: 1.15%
|
||||
- 64 trials de Ray Tune con Optuna usando GPU RTX 3060
|
||||
- Identificación de `textline_orientation`, `use_doc_orientation_classify` y `text_det_thresh` como críticos
|
||||
- CER mínimo alcanzado en trial individual: **0.79%**
|
||||
|
||||
**Discusión y análisis:**
|
||||
- Mejora del CER de 7.78% a 1.49% (reducción del 80.9%)
|
||||
- Cumplimiento de todos los objetivos específicos
|
||||
- Identificación de limitaciones y recomendaciones prácticas
|
||||
- Mejora del CER en dataset completo de 8.85% a 7.72% (reducción del **12.8%**)
|
||||
- Mejor trial: 0.79% CER (cumple objetivo CER < 2%)
|
||||
- Identificación de sobreajuste y recomendaciones prácticas
|
||||
|
||||
**Resultado principal**: Se logró alcanzar el objetivo de CER < 2% mediante optimización de hiperparámetros, sin requerir fine-tuning ni recursos GPU.
|
||||
**Resultados principales**:
|
||||
- El objetivo de CER < 2% se cumple en el mejor trial (0.79%)
|
||||
- La generalización al dataset completo (7.72%) revela sobreajuste que requiere trabajo futuro
|
||||
- La optimización de hiperparámetros con GPU es viable y eficiente (82× más rápido que CPU)
|
||||
|
||||
**Fuentes de datos:**
|
||||
- [`src/run_tuning.py`](https://github.com/seryus/MastersThesis/blob/main/src/run_tuning.py): Script principal de optimización
|
||||
- [`src/results/`](https://github.com/seryus/MastersThesis/tree/main/src/results): Resultados CSV de los trials
|
||||
- [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv): Resultados CSV de PaddleOCR
|
||||
- [`src/results/raytune_easyocr_results_20260119_120204.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_easyocr_results_20260119_120204.csv): Resultados CSV de EasyOCR
|
||||
- [`src/results/raytune_doctr_results_20260119_121445.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_doctr_results_20260119_121445.csv): Resultados CSV de DocTR
|
||||
|
||||
**Imágenes Docker:**
|
||||
- `seryus.ddns.net/unir/paddle-ocr-gpu`: PaddleOCR con soporte GPU
|
||||
- `seryus.ddns.net/unir/easyocr-gpu`: EasyOCR con soporte GPU
|
||||
- `seryus.ddns.net/unir/doctr-gpu`: DocTR con soporte GPU
|
||||
|
||||
### Validación con Aceleración GPU
|
||||
### Comparativa de Rendimiento CPU vs GPU
|
||||
|
||||
Para evaluar la viabilidad práctica del enfoque optimizado en escenarios de producción, se realizó una validación adicional utilizando aceleración GPU. Esta fase complementa los experimentos en CPU presentados anteriormente y demuestra la aplicabilidad del método cuando se dispone de hardware con capacidad de procesamiento paralelo.
|
||||
Esta sección presenta la comparación de rendimiento entre ejecución en CPU y GPU, justificando la elección de GPU para el experimento principal y demostrando el impacto práctico de la aceleración por hardware.
|
||||
|
||||
#### Configuración del Entorno GPU
|
||||
|
||||
**Tabla 36.** *Especificaciones del entorno de validación GPU.*
|
||||
**Tabla 41.** *Especificaciones del entorno GPU utilizado.*
|
||||
|
||||
| Componente | Especificación |
|
||||
|------------|----------------|
|
||||
@@ -920,28 +1169,32 @@ Para evaluar la viabilidad práctica del enfoque optimizado en escenarios de pro
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
|
||||
El entorno de validación representa hardware de consumo típico para desarrollo de aplicaciones de machine learning, permitiendo evaluar el rendimiento en condiciones realistas de despliegue.
|
||||
Este hardware representa configuración típica de desarrollo, permitiendo evaluar el rendimiento en condiciones realistas de despliegue.
|
||||
|
||||
#### Comparación CPU vs GPU
|
||||
|
||||
Se evaluó el tiempo de procesamiento utilizando la configuración optimizada identificada en la fase anterior, comparando el rendimiento entre CPU y GPU.
|
||||
Se comparó el tiempo de procesamiento entre CPU y GPU utilizando los datos de [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://github.com/seryus/MastersThesis/blob/main/src/raytune_paddle_subproc_results_20251207_192320.csv) (CPU) y [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv) (GPU).
|
||||
|
||||
**Tabla 37.** *Rendimiento comparativo CPU vs GPU.*
|
||||
**Tabla 42.** *Rendimiento comparativo CPU vs GPU.*
|
||||
|
||||
| Métrica | CPU | GPU (RTX 3060) | Factor de Aceleración |
|
||||
|---------|-----|----------------|----------------------|
|
||||
| Tiempo/Página | 69.4s | 0.55s | **126x** |
|
||||
| Dataset completo (45 páginas) | ~52 min | ~25 seg | **126x** |
|
||||
| Tiempo/Página (promedio) | 69.4s | 0.84s | **82x** |
|
||||
| Dataset completo (45 páginas) | ~52 min | ~38 seg | **82x** |
|
||||
| 64 trials × 5 páginas | ~6.4 horas | ~1.5 horas | **4.3x** |
|
||||
|
||||
*Fuente: Elaboración propia a partir de experimentos.*
|
||||
*Fuente: Elaboración propia a partir de [`src/raytune_paddle_subproc_results_20251207_192320.csv`](https://github.com/seryus/MastersThesis/blob/main/src/raytune_paddle_subproc_results_20251207_192320.csv) y [`src/results/raytune_paddle_results_20260119_122609.csv`](https://github.com/seryus/MastersThesis/blob/main/src/results/raytune_paddle_results_20260119_122609.csv).*
|
||||
|
||||
La aceleración de 126x obtenida con GPU transforma la aplicabilidad práctica del sistema. Mientras que el procesamiento en CPU limita el uso a escenarios de procesamiento por lotes sin restricciones de tiempo, la velocidad con GPU habilita casos de uso interactivos y de tiempo real.
|
||||
La aceleración de 82× obtenida con GPU transforma la viabilidad del enfoque:
|
||||
- **Optimización en CPU (6.4 horas)**: Viable pero lento para iteraciones rápidas
|
||||
- **Optimización en GPU (1.5 horas)**: Permite explorar más configuraciones y realizar múltiples experimentos
|
||||
- **Producción con GPU (0.84s/página)**: Habilita procesamiento en tiempo real
|
||||
|
||||
#### Comparación de Modelos PaddleOCR
|
||||
|
||||
PaddleOCR ofrece dos variantes de modelos: Mobile (optimizados para dispositivos con recursos limitados) y Server (mayor precisión a costa de mayor consumo de memoria). Se evaluó la viabilidad de ambas variantes en el hardware disponible.
|
||||
|
||||
**Tabla 38.** *Comparación de modelos Mobile vs Server en RTX 3060.*
|
||||
**Tabla 43.** *Comparación de modelos Mobile vs Server en RTX 3060.*
|
||||
|
||||
| Modelo | VRAM Requerida | Resultado | Recomendación |
|
||||
|--------|----------------|-----------|---------------|
|
||||
@@ -956,7 +1209,7 @@ Los modelos Server, a pesar de ofrecer potencialmente mayor precisión, resultan
|
||||
|
||||
La validación con aceleración GPU permite extraer las siguientes conclusiones:
|
||||
|
||||
1. **Aceleración significativa**: La GPU proporciona una aceleración de 126x sobre CPU, haciendo viable el procesamiento en tiempo real para aplicaciones interactivas.
|
||||
1. **Aceleración significativa**: La GPU proporciona una aceleración de 82× sobre CPU, haciendo viable el procesamiento en tiempo real para aplicaciones interactivas.
|
||||
|
||||
2. **Modelos Mobile recomendados**: Para hardware con VRAM limitada (≤6 GB), los modelos Mobile de PP-OCRv5 ofrecen el mejor balance entre precisión y recursos, funcionando de manera estable sin errores de memoria.
|
||||
|
||||
@@ -964,4 +1217,4 @@ La validación con aceleración GPU permite extraer las siguientes conclusiones:
|
||||
|
||||
4. **Escalabilidad**: La arquitectura de microservicios dockerizados utilizada para la validación GPU facilita el despliegue horizontal, permitiendo escalar el procesamiento según demanda.
|
||||
|
||||
Esta validación demuestra que la configuración optimizada mediante Ray Tune no solo mejora la precisión (CER: 7.78% → 1.49%) sino que, combinada con aceleración GPU, resulta prácticamente aplicable en escenarios de producción real.
|
||||
Esta validación demuestra que la configuración optimizada mediante Ray Tune mejora la precisión (CER: 8.85% → 7.72% en dataset completo, 0.79% en mejor trial individual) y, combinada con aceleración GPU, resulta prácticamente aplicable en escenarios de producción real.
|
||||
|
||||
Reference in New Issue
Block a user