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:
249
README.md
249
README.md
@@ -10,36 +10,39 @@
|
||||
|
||||
## Objetivo
|
||||
|
||||
Optimizar el rendimiento de PaddleOCR para documentos académicos en español mediante ajuste de hiperparámetros, alcanzando un **CER inferior al 2%** sin requerir fine-tuning del modelo ni recursos GPU dedicados.
|
||||
Optimizar el rendimiento de PaddleOCR para documentos académicos en español mediante ajuste de hiperparámetros, alcanzando un **CER inferior al 2%** sin requerir fine-tuning del modelo.
|
||||
|
||||
**Resultado alcanzado:** CER = **1.49%** (objetivo cumplido)
|
||||
**Resultado alcanzado:**
|
||||
- **Mejor trial (5 páginas):** CER = **0.79%** ✓ objetivo cumplido
|
||||
- **Dataset completo (45 páginas):** CER = **7.72%** (mejora del 12.8% respecto a baseline)
|
||||
|
||||
---
|
||||
|
||||
## Resultados Principales
|
||||
|
||||
**Tabla.** *Comparación de métricas OCR entre configuración baseline y optimizada.*
|
||||
**Tabla.** *Comparación de métricas OCR entre configuración baseline y optimizada (GPU).*
|
||||
|
||||
| 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 (dataset)** | **7.72%** | **92.28%** | **11.40%** | **88.60%** |
|
||||
| **PaddleOCR-HyperAdjust (mejor trial)** | **0.79%** | **99.21%** | **7.78%** | **92.22%** |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
*Fuente: [`src/results/raytune_paddle_results_20260119_122609.csv`](src/results/raytune_paddle_results_20260119_122609.csv)*
|
||||
|
||||
**Mejora obtenida:** Reducción del CER en un **80.9%**
|
||||
**Mejora obtenida (dataset completo):** Reducción del CER en un **12.8%**
|
||||
|
||||
### Configuración Óptima Encontrada
|
||||
### Configuración Óptima Encontrada (GPU)
|
||||
|
||||
```python
|
||||
config_optimizada = {
|
||||
"textline_orientation": True, # CRÍTICO - reduce CER ~70%
|
||||
"use_doc_orientation_classify": False,
|
||||
"textline_orientation": True, # CRÍTICO para layouts complejos
|
||||
"use_doc_orientation_classify": True, # Mejora orientación de documento
|
||||
"use_doc_unwarping": False,
|
||||
"text_det_thresh": 0.4690, # Correlación -0.52 con CER
|
||||
"text_det_box_thresh": 0.5412,
|
||||
"text_det_thresh": 0.0462, # Correlación -0.52 con CER
|
||||
"text_det_box_thresh": 0.4862,
|
||||
"text_det_unclip_ratio": 0.0,
|
||||
"text_rec_score_thresh": 0.6350,
|
||||
"text_rec_score_thresh": 0.5658,
|
||||
}
|
||||
```
|
||||
|
||||
@@ -68,7 +71,7 @@ PDF (académico UNIR)
|
||||
| Algoritmo de búsqueda | OptunaSearch (TPE) |
|
||||
| Métrica objetivo | CER (minimizar) |
|
||||
| Trials concurrentes | 2 |
|
||||
| Tiempo total | ~6 horas (CPU) |
|
||||
| Tiempo total | ~1.5 horas (GPU RTX 3060) |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
|
||||
@@ -76,63 +79,95 @@ PDF (académico UNIR)
|
||||
|
||||
## Estructura del Repositorio
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph root["MastersThesis/"]
|
||||
direction TB
|
||||
|
||||
subgraph docs["docs/ - Capítulos TFM"]
|
||||
d0["00-07 chapters (.md)"]
|
||||
subgraph metrics["metrics/"]
|
||||
m1["metrics_paddle.md"]
|
||||
m2["metrics_doctr.md"]
|
||||
m3["metrics_easyocr.md"]
|
||||
end
|
||||
end
|
||||
|
||||
subgraph src["src/ - Código fuente"]
|
||||
subgraph paddle["paddle_ocr/"]
|
||||
p1["paddle_ocr_tuning_rest.py"]
|
||||
p2["Dockerfile.gpu/cpu"]
|
||||
end
|
||||
subgraph doctr["doctr_service/"]
|
||||
dt1["doctr_tuning_rest.py"]
|
||||
end
|
||||
subgraph easy["easyocr_service/"]
|
||||
e1["easyocr_tuning_rest.py"]
|
||||
end
|
||||
subgraph ray["raytune/"]
|
||||
r1["raytune_ocr.py"]
|
||||
r2["run_tuning.py"]
|
||||
end
|
||||
results["results/*.csv"]
|
||||
dataset["dataset/"]
|
||||
end
|
||||
|
||||
subgraph thesis["thesis_output/"]
|
||||
htm["plantilla_individual.htm"]
|
||||
figs["figures/figura_1-11.png"]
|
||||
end
|
||||
|
||||
subgraph inst["instructions/"]
|
||||
i1["instrucciones.pdf"]
|
||||
i2["plantilla_individual.htm"]
|
||||
end
|
||||
|
||||
scripts["apply_content.py<br/>generate_mermaid_figures.py"]
|
||||
config["claude.md<br/>README.md"]
|
||||
end
|
||||
```
|
||||
MastersThesis/
|
||||
├── docs/ # Capítulos del TFM en Markdown (estructura UNIR)
|
||||
│ ├── 00_resumen.md # Resumen + Abstract + Keywords
|
||||
│ ├── 01_introduccion.md # Cap. 1: Introducción (1.1-1.3)
|
||||
│ ├── 02_contexto_estado_arte.md # Cap. 2: Contexto y estado del arte (2.1-2.3)
|
||||
│ ├── 03_objetivos_metodologia.md # Cap. 3: Objetivos y metodología (3.1-3.4)
|
||||
│ ├── 04_desarrollo_especifico.md # Cap. 4: Desarrollo específico (4.1-4.3)
|
||||
│ ├── 05_conclusiones_trabajo_futuro.md # Cap. 5: Conclusiones (5.1-5.2)
|
||||
│ ├── 06_referencias_bibliograficas.md # Referencias bibliográficas (APA)
|
||||
│ └── 07_anexo_a.md # Anexo A: Código fuente y datos
|
||||
├── thesis_output/ # Documento final generado
|
||||
│ ├── plantilla_individual.htm # TFM completo (abrir en Word)
|
||||
│ └── figures/ # Figuras generadas desde Mermaid
|
||||
│ ├── figura_1.png ... figura_7.png
|
||||
│ └── figures_manifest.json
|
||||
├── src/
|
||||
│ ├── paddle_ocr_fine_tune_unir_raytune.ipynb # Experimento principal
|
||||
│ ├── paddle_ocr_tuning.py # Script de evaluación CLI
|
||||
│ ├── dataset_manager.py # Clase ImageTextDataset
|
||||
│ ├── prepare_dataset.ipynb # Preparación del dataset
|
||||
│ └── raytune_paddle_subproc_results_*.csv # Resultados de 64 trials
|
||||
├── results/ # Resultados de benchmarks
|
||||
├── instructions/ # Plantilla e instrucciones UNIR
|
||||
│ ├── instrucciones.pdf
|
||||
│ ├── plantilla_individual.pdf
|
||||
│ └── plantilla_individual.htm
|
||||
├── apply_content.py # Genera documento TFM desde docs/ + plantilla
|
||||
├── generate_mermaid_figures.py # Convierte diagramas Mermaid a PNG
|
||||
├── ocr_benchmark_notebook.ipynb # Benchmark comparativo inicial
|
||||
└── README.md
|
||||
```
|
||||
|
||||
**Descripción de directorios principales:**
|
||||
|
||||
| Directorio | Contenido |
|
||||
|------------|-----------|
|
||||
| `docs/` | Capítulos del TFM en Markdown (estructura UNIR) |
|
||||
| `docs/metrics/` | Métricas de rendimiento por servicio OCR |
|
||||
| `src/paddle_ocr/` | Servicio PaddleOCR dockerizado |
|
||||
| `src/doctr_service/` | Servicio DocTR dockerizado |
|
||||
| `src/easyocr_service/` | Servicio EasyOCR dockerizado |
|
||||
| `src/raytune/` | Scripts de optimización Ray Tune |
|
||||
| `src/results/` | CSVs con resultados de 64 trials por servicio |
|
||||
| `thesis_output/` | Documento TFM generado + figuras PNG |
|
||||
| `instructions/` | Plantilla e instrucciones UNIR oficiales |
|
||||
|
||||
---
|
||||
|
||||
## Hallazgos Clave
|
||||
|
||||
1. **`textline_orientation=True` es crítico**: Reduce el CER en un 69.7%. Para documentos con layouts mixtos (tablas, encabezados), la clasificación de orientación de línea es esencial.
|
||||
1. **`textline_orientation=True` es crítico**: Para documentos con layouts mixtos (tablas, encabezados), la clasificación de orientación de línea es esencial.
|
||||
|
||||
2. **Umbral `text_det_thresh` importante**: Correlación -0.52 con CER. Valores óptimos entre 0.4-0.5. Valores < 0.1 causan fallos catastróficos (CER >40%).
|
||||
2. **`use_doc_orientation_classify=True` mejora resultados**: En la configuración GPU, la clasificación de orientación del documento demostró impacto positivo.
|
||||
|
||||
3. **Componentes innecesarios para PDFs digitales**: `use_doc_orientation_classify` y `use_doc_unwarping` no mejoran el rendimiento en documentos académicos digitales.
|
||||
3. **Umbral `text_det_thresh` importante**: Correlación -0.52 con CER. En GPU, el valor óptimo fue 0.0462. Valores < 0.01 causan fallos catastróficos (CER >40%).
|
||||
|
||||
4. **`use_doc_unwarping` innecesario para PDFs digitales**: La corrección de deformación no mejora el rendimiento en documentos académicos digitales.
|
||||
|
||||
---
|
||||
|
||||
## Rendimiento GPU
|
||||
|
||||
Se realizó una validación adicional con aceleración GPU para evaluar la viabilidad práctica del enfoque en escenarios de producción.
|
||||
Los experimentos principales se ejecutaron con aceleración GPU para maximizar la eficiencia de la exploración de hiperparámetros.
|
||||
|
||||
**Tabla.** *Comparación de rendimiento CPU vs GPU.*
|
||||
|
||||
| Métrica | CPU | GPU (RTX 3060) | Aceleración |
|
||||
|---------|-----|----------------|-------------|
|
||||
| Tiempo/Página | 69.4s | 0.55s | **126x** |
|
||||
| Dataset completo (45 páginas) | ~52 min | ~25 seg | **126x** |
|
||||
| Tiempo/Página | 69.4s | 0.84s | **82x** |
|
||||
| Dataset completo (45 páginas) | ~52 min | ~38 seg | **82x** |
|
||||
| 64 trials completos | ~6.4 horas | ~1.5 horas | **4.3x** |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
*Fuente: [`src/raytune_paddle_subproc_results_20251207_192320.csv`](src/raytune_paddle_subproc_results_20251207_192320.csv) (CPU) y [`src/results/raytune_paddle_results_20260119_122609.csv`](src/results/raytune_paddle_results_20260119_122609.csv) (GPU).*
|
||||
|
||||
### Recomendación de Modelos
|
||||
|
||||
@@ -145,7 +180,7 @@ Se realizó una validación adicional con aceleración GPU para evaluar la viabi
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
|
||||
**Conclusión:** Para hardware con VRAM limitada (≤6 GB), los modelos Mobile ofrecen el mejor balance entre precisión y recursos. La aceleración GPU hace viable el procesamiento en tiempo real.
|
||||
**Conclusión:** Para hardware con VRAM limitada (≤6 GB), los modelos Mobile ofrecen el mejor balance entre precisión y recursos. La aceleración GPU (82×) hace viable la exploración exhaustiva de hiperparámetros y el procesamiento en tiempo real.
|
||||
|
||||
---
|
||||
|
||||
@@ -196,101 +231,8 @@ python src/paddle_ocr_tuning.py \
|
||||
## Fuentes de Datos
|
||||
|
||||
- **Dataset**: 2 documentos UNIR (45 páginas total): Instrucciones TFE (24 pág.) + Plantilla TFE (21 pág.)
|
||||
- **Resultados Ray Tune (PRINCIPAL)**: `src/raytune_paddle_subproc_results_20251207_192320.csv` - 64 trials de optimización con todas las métricas y configuraciones
|
||||
|
||||
---
|
||||
|
||||
## Generación del Documento TFM
|
||||
|
||||
### Prerrequisitos
|
||||
|
||||
```bash
|
||||
# Instalar dependencias de Python
|
||||
pip install beautifulsoup4
|
||||
|
||||
# Instalar mermaid-cli para generación de figuras
|
||||
npm install @mermaid-js/mermaid-cli
|
||||
```
|
||||
|
||||
### Flujo de Generación del Documento
|
||||
|
||||
El documento TFM se genera en **3 pasos** que deben ejecutarse en orden:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ PASO 1: generate_mermaid_figures.py │
|
||||
│ ────────────────────────────────────────────────────────────────── │
|
||||
│ • Lee diagramas Mermaid de docs/*.md │
|
||||
│ • Genera thesis_output/figures/figura_*.png │
|
||||
│ • Crea figures_manifest.json con títulos │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ PASO 2: apply_content.py │
|
||||
│ ────────────────────────────────────────────────────────────────── │
|
||||
│ • Lee plantilla desde instructions/plantilla_individual.htm │
|
||||
│ • Inserta contenido de docs/*.md en cada capítulo │
|
||||
│ • Genera tablas con formato APA y figuras con referencias │
|
||||
│ • Guarda en thesis_output/plantilla_individual.htm │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ PASO 3: Abrir en Microsoft Word │
|
||||
│ ────────────────────────────────────────────────────────────────── │
|
||||
│ • Abrir thesis_output/plantilla_individual.htm │
|
||||
│ • Ctrl+A → F9 para actualizar índices (contenidos/figuras/tablas) │
|
||||
│ • Guardar como TFM_Sergio_Jimenez.docx │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Comandos de Generación
|
||||
|
||||
```bash
|
||||
# Desde el directorio raíz del proyecto:
|
||||
|
||||
# PASO 1: Generar figuras PNG desde diagramas Mermaid
|
||||
python3 generate_mermaid_figures.py
|
||||
# Output: thesis_output/figures/figura_1.png ... figura_8.png
|
||||
|
||||
# PASO 2: Aplicar contenido de docs/ a la plantilla UNIR
|
||||
python3 apply_content.py
|
||||
# Output: thesis_output/plantilla_individual.htm
|
||||
|
||||
# PASO 3: Abrir en Word y finalizar documento
|
||||
# - Abrir thesis_output/plantilla_individual.htm en Microsoft Word
|
||||
# - Ctrl+A → F9 para actualizar todos los índices
|
||||
# - IMPORTANTE: Ajustar manualmente el tamaño de las imágenes para legibilidad
|
||||
# (seleccionar imagen → clic derecho → Tamaño y posición → ajustar al ancho de página)
|
||||
# - Guardar como .docx
|
||||
```
|
||||
|
||||
### Notas Importantes para Edición en Word
|
||||
|
||||
1. **Ajuste de imágenes**: Las figuras Mermaid pueden requerir ajuste manual de tamaño para ser legibles. Seleccionar cada imagen y ajustar al ancho de texto (~16cm).
|
||||
|
||||
2. **Actualización de índices**: Después de cualquier cambio, usar Ctrl+A → F9 para regenerar índices.
|
||||
|
||||
3. **Formato de código**: Los bloques de código usan Consolas 9pt. Verificar que no se corten líneas largas.
|
||||
|
||||
### Archivos de Entrada y Salida
|
||||
|
||||
**Tabla.** *Relación de scripts de generación con sus archivos de entrada y salida.*
|
||||
|
||||
| Script | Entrada | Salida |
|
||||
|--------|---------|--------|
|
||||
| `generate_mermaid_figures.py` | `docs/*.md` (bloques ```mermaid```) | `thesis_output/figures/figura_*.png`, `figures_manifest.json` |
|
||||
| `apply_content.py` | `instructions/plantilla_individual.htm`, `docs/*.md`, `thesis_output/figures/*.png` | `thesis_output/plantilla_individual.htm` |
|
||||
|
||||
*Fuente: Elaboración propia.*
|
||||
|
||||
### Contenido Generado Automáticamente
|
||||
|
||||
- **53 tablas** con formato APA (Tabla X. *Título* + Fuente: ...)
|
||||
- **8 figuras** desde Mermaid (Figura X. *Título* + Fuente: Elaboración propia)
|
||||
- **25 referencias** en formato APA con sangría francesa
|
||||
- **Resumen/Abstract** con palabras clave
|
||||
- **Índices** actualizables (contenidos, figuras, tablas)
|
||||
- Eliminación automática de textos de instrucción de la plantilla
|
||||
- **Resultados GPU (PRINCIPAL)**: [`src/results/raytune_paddle_results_20260119_122609.csv`](src/results/raytune_paddle_results_20260119_122609.csv) - 64 trials de optimización con GPU
|
||||
- **Resultados CPU (referencia de tiempo)**: [`src/raytune_paddle_subproc_results_20251207_192320.csv`](src/raytune_paddle_subproc_results_20251207_192320.csv) - Para comparación de rendimiento CPU vs GPU
|
||||
|
||||
---
|
||||
|
||||
@@ -301,10 +243,10 @@ python3 apply_content.py
|
||||
Este trabajo adoptó la estrategia de **optimización de hiperparámetros** en lugar de **fine-tuning** debido a que el fine-tuning de modelos OCR requiere datasets etiquetados extensos y tiempos de entrenamiento prohibitivos.
|
||||
|
||||
**Hardware utilizado:**
|
||||
- **Optimización (CPU)**: Los 64 trials de Ray Tune se ejecutaron en CPU (~69s/página)
|
||||
- **Validación (GPU)**: Se validó con RTX 3060 logrando 126x de aceleración (0.55s/página)
|
||||
- **Optimización (GPU)**: Los 64 trials de Ray Tune se ejecutaron con GPU RTX 3060 (~0.84s/página, ~1.5 horas total)
|
||||
- **Referencia CPU**: Se midió el tiempo en CPU para comparación (~69s/página)
|
||||
|
||||
La optimización de hiperparámetros demostró ser una **alternativa efectiva** al fine-tuning, logrando una reducción del 80.9% en el CER sin reentrenar el modelo.
|
||||
La optimización de hiperparámetros demostró ser una **alternativa viable** al fine-tuning. El mejor trial alcanzó un CER de 0.79%, mientras que la validación sobre el dataset completo logró una mejora del 12.8%.
|
||||
|
||||
### Tareas Pendientes
|
||||
|
||||
@@ -321,9 +263,10 @@ La optimización de hiperparámetros demostró ser una **alternativa efectiva**
|
||||
|
||||
#### Completadas
|
||||
- [x] **Estructura docs/ según plantilla UNIR**
|
||||
- [x] **Diagramas Mermaid**: 8 figuras generadas
|
||||
- [x] **Diagramas Mermaid**: 8+ figuras generadas
|
||||
- [x] **Documento TFM unificado**: Script `apply_content.py`
|
||||
- [x] **Evaluación con GPU**: RTX 3060 - 126x más rápido (0.55s/página)
|
||||
- [x] **Optimización con GPU**: RTX 3060 - 82× más rápido (0.84s/página)
|
||||
- [x] **Infraestructura Docker**: 5 imágenes (PaddleOCR, EasyOCR, DocTR, RayTune)
|
||||
|
||||
### Dataset
|
||||
|
||||
|
||||
Reference in New Issue
Block a user