'
+ list_html += ''
+ return list_html
+ html = re.sub(r'(^\d+\.\s+.+\n?)+', num_list_replace, html, flags=re.MULTILINE)
+
+ # Paragraphs (lines not already in tags)
+ lines = html.split('\n')
+ result = []
+ for line in lines:
+ line = line.strip()
+ if not line:
+ continue
+ if line.startswith('<') or line.startswith('{'):
+ result.append(line)
+ else:
+ result.append(f'
{line}
')
+
+ return '\n'.join(result)
+
+def main():
+ print("Reading template...")
+ with open(TEMPLATE_HTM, 'r', encoding='utf-8', errors='ignore') as f:
+ html = f.read()
+
+ soup = BeautifulSoup(html, 'html.parser')
+
+ # Read markdown files
+ print("Reading markdown content...")
+ md_files = {
+ 'resumen': read_md('00_resumen.md'),
+ 'intro': read_md('01_introduccion.md'),
+ 'contexto': read_md('02_contexto_estado_arte.md'),
+ 'objetivos': read_md('03_objetivos_metodologia.md'),
+ 'desarrollo': read_md('04_desarrollo_especifico.md'),
+ 'conclusiones': read_md('05_conclusiones_trabajo_futuro.md'),
+ 'referencias': read_md('06_referencias_bibliograficas.md'),
+ 'anexo': read_md('07_anexo_a.md'),
+ }
+
+ # Convert markdown to HTML
+ print("Converting markdown to HTML...")
+ html_content = {}
+ for key, md in md_files.items():
+ html_content[key] = md_to_html(md)
+
+ # Find and replace content sections
+ print("Replacing template content...")
+
+ # Find all WordSection divs and main content areas
+ sections = soup.find_all('div', class_=lambda x: x and 'WordSection' in x)
+
+ # Strategy: Find chapter headings and replace following content
+ # The template has placeholders we need to replace
+
+ # Simple approach: Create new HTML with template structure but our content
+ new_html = '''
+
+
+
+TFM - Optimización de Hiperparámetros OCR
+
+
+
+'''
+
+ # Title page
+ new_html += '''
+
+
+
Universidad Internacional de La Rioja Escuela Superior de Ingeniería y Tecnología
+
Máster Universitario en Inteligencia Artificial
+
Optimización de Hiperparámetros OCR con Ray Tune para Documentos Académicos en Español
+
Trabajo Fin de Estudio presentado por: Sergio Jiménez Jiménez
+
Tipo de trabajo: Comparativa de soluciones / Piloto experimental
\n'
+
+ new_html += ''
+
+ # Save HTML
+ print(f"Saving HTML to {OUTPUT_HTM}...")
+ with open(OUTPUT_HTM, 'w', encoding='utf-8') as f:
+ f.write(new_html)
+
+ # Copy template files folder
+ if os.path.exists(OUTPUT_FILES):
+ shutil.rmtree(OUTPUT_FILES)
+ if os.path.exists(TEMPLATE_FILES):
+ shutil.copytree(TEMPLATE_FILES, OUTPUT_FILES)
+
+ # Create UNIR logo placeholder if not exists
+ os.makedirs(OUTPUT_FILES, exist_ok=True)
+
+ # Convert to DOCX using pandoc
+ print(f"Converting to DOCX with pandoc...")
+ result = subprocess.run([
+ 'pandoc',
+ OUTPUT_HTM,
+ '-o', OUTPUT_DOCX,
+ '--reference-doc', os.path.join(BASE_DIR, 'instructions/plantilla_individual.docx'),
+ '--toc',
+ '--toc-depth=3'
+ ], capture_output=True, text=True)
+
+ if result.returncode != 0:
+ print(f"Pandoc error: {result.stderr}")
+ # Try without reference doc
+ print("Retrying without reference doc...")
+ result = subprocess.run([
+ 'pandoc',
+ OUTPUT_HTM,
+ '-o', OUTPUT_DOCX,
+ '--toc',
+ '--toc-depth=3'
+ ], capture_output=True, text=True)
+
+ if result.returncode == 0:
+ print(f"✓ Document saved to {OUTPUT_DOCX}")
+ print(f"✓ HTML version saved to {OUTPUT_HTM}")
+ else:
+ print(f"Error: {result.stderr}")
+
+if __name__ == '__main__':
+ main()
diff --git a/generate_thesis_docx.py b/generate_thesis_docx.py
new file mode 100644
index 0000000..32194f0
--- /dev/null
+++ b/generate_thesis_docx.py
@@ -0,0 +1,438 @@
+#!/usr/bin/env python3
+"""
+Generate thesis.docx from markdown files using UNIR template.
+"""
+
+import re
+import os
+from docx import Document
+from docx.shared import Pt, Cm, RGBColor, Inches
+from docx.enum.text import WD_ALIGN_PARAGRAPH
+from docx.enum.style import WD_STYLE_TYPE
+from docx.oxml.ns import qn
+from docx.oxml import OxmlElement
+
+# Paths
+TEMPLATE_PATH = 'instructions/plantilla_individual.docx'
+OUTPUT_PATH = 'TFM_Sergio_Jimenez_OCR_Optimization.docx'
+DOCS_PATH = 'docs'
+
+# Thesis metadata
+THESIS_TITLE = "Optimización de Hiperparámetros OCR con Ray Tune para Documentos Académicos en Español"
+AUTHOR = "Sergio Jiménez Jiménez"
+DIRECTOR = "[Nombre del Director]"
+DATE = "2025"
+
+
+def read_markdown_file(filepath):
+ """Read markdown file and return content."""
+ with open(filepath, 'r', encoding='utf-8') as f:
+ return f.read()
+
+
+def parse_markdown_blocks(md_content):
+ """Parse markdown content into blocks (headers, paragraphs, code, tables, lists)."""
+ blocks = []
+ lines = md_content.split('\n')
+ i = 0
+
+ while i < len(lines):
+ line = lines[i]
+
+ # Skip empty lines
+ if not line.strip():
+ i += 1
+ continue
+
+ # Code block
+ if line.strip().startswith('```'):
+ lang = line.strip()[3:]
+ code_lines = []
+ i += 1
+ while i < len(lines) and not lines[i].strip().startswith('```'):
+ code_lines.append(lines[i])
+ i += 1
+ blocks.append({'type': 'code', 'lang': lang, 'content': '\n'.join(code_lines)})
+ i += 1
+ continue
+
+ # Headers
+ if line.startswith('#'):
+ level = len(line) - len(line.lstrip('#'))
+ text = line.lstrip('#').strip()
+ # Remove {.unnumbered} suffix
+ text = re.sub(r'\s*\{\.unnumbered\}\s*$', '', text)
+ blocks.append({'type': 'header', 'level': level, 'content': text})
+ i += 1
+ continue
+
+ # Table
+ if '|' in line and i + 1 < len(lines) and '---' in lines[i + 1]:
+ table_lines = [line]
+ i += 1
+ while i < len(lines) and '|' in lines[i]:
+ table_lines.append(lines[i])
+ i += 1
+ blocks.append({'type': 'table', 'content': table_lines})
+ continue
+
+ # Blockquote
+ if line.startswith('>'):
+ quote_text = line[1:].strip()
+ i += 1
+ while i < len(lines) and lines[i].startswith('>'):
+ quote_text += ' ' + lines[i][1:].strip()
+ i += 1
+ blocks.append({'type': 'quote', 'content': quote_text})
+ continue
+
+ # List item (bullet or numbered)
+ if re.match(r'^[\-\*\+]\s', line) or re.match(r'^\d+\.\s', line):
+ list_items = []
+ list_type = 'numbered' if re.match(r'^\d+\.', line) else 'bullet'
+ while i < len(lines):
+ current = lines[i]
+ if re.match(r'^[\-\*\+]\s', current):
+ list_items.append(current[2:].strip())
+ i += 1
+ elif re.match(r'^\d+\.\s', current):
+ list_items.append(re.sub(r'^\d+\.\s*', '', current).strip())
+ i += 1
+ elif current.strip() == '':
+ break
+ else:
+ break
+ blocks.append({'type': 'list', 'list_type': list_type, 'items': list_items})
+ continue
+
+ # Figure caption (italic text starting with *Figura or Figura)
+ if line.strip().startswith('*Figura') or line.strip().startswith('Figura'):
+ blocks.append({'type': 'caption', 'content': line.strip().strip('*')})
+ i += 1
+ continue
+
+ # Regular paragraph
+ para_lines = [line]
+ i += 1
+ while i < len(lines) and lines[i].strip() and not lines[i].startswith('#') and not lines[i].startswith('```') and not lines[i].startswith('>') and not re.match(r'^[\-\*\+]\s', lines[i]) and not re.match(r'^\d+\.\s', lines[i]) and '|' not in lines[i]:
+ para_lines.append(lines[i])
+ i += 1
+
+ para_text = ' '.join(para_lines)
+ blocks.append({'type': 'paragraph', 'content': para_text})
+
+ return blocks
+
+
+def add_formatted_text(paragraph, text):
+ """Add text with inline formatting (bold, italic, code) to a paragraph."""
+ # Pattern for inline formatting
+ parts = re.split(r'(\*\*[^*]+\*\*|\*[^*]+\*|`[^`]+`)', text)
+
+ for part in parts:
+ if not part:
+ continue
+ if part.startswith('**') and part.endswith('**'):
+ run = paragraph.add_run(part[2:-2])
+ run.bold = True
+ elif part.startswith('*') and part.endswith('*'):
+ run = paragraph.add_run(part[1:-1])
+ run.italic = True
+ elif part.startswith('`') and part.endswith('`'):
+ run = paragraph.add_run(part[1:-1])
+ run.font.name = 'Consolas'
+ run.font.size = Pt(10)
+ else:
+ paragraph.add_run(part)
+
+
+def add_table_to_doc(doc, table_lines):
+ """Add a markdown table to the document."""
+ # Parse table
+ rows = []
+ for line in table_lines:
+ if '---' in line:
+ continue
+ cells = [c.strip() for c in line.split('|')[1:-1]]
+ if cells:
+ rows.append(cells)
+
+ if not rows:
+ return
+
+ # Create table
+ num_cols = len(rows[0])
+ table = doc.add_table(rows=len(rows), cols=num_cols)
+ table.style = 'Table Grid'
+
+ for i, row_data in enumerate(rows):
+ row = table.rows[i]
+ for j, cell_text in enumerate(row_data):
+ if j < len(row.cells):
+ cell = row.cells[j]
+ cell.text = ''
+ para = cell.paragraphs[0]
+ add_formatted_text(para, cell_text)
+ if i == 0: # Header row
+ for run in para.runs:
+ run.bold = True
+
+ # Add spacing after table
+ doc.add_paragraph()
+
+
+def add_code_block(doc, code, lang=''):
+ """Add a code block to the document."""
+ para = doc.add_paragraph()
+ para.paragraph_format.left_indent = Cm(0.5)
+ para.paragraph_format.space_before = Pt(6)
+ para.paragraph_format.space_after = Pt(6)
+
+ run = para.add_run(code)
+ run.font.name = 'Consolas'
+ run.font.size = Pt(9)
+
+ # Add background shading
+ shading = OxmlElement('w:shd')
+ shading.set(qn('w:fill'), 'F5F5F5')
+ para._p.get_or_add_pPr().append(shading)
+
+
+def get_header_style(level, is_numbered=True):
+ """Get the appropriate style for a header level."""
+ if level == 1:
+ return 'Heading 1'
+ elif level == 2:
+ return 'Heading 2'
+ elif level == 3:
+ return 'Heading 3'
+ elif level == 4:
+ return 'Heading 4'
+ else:
+ return 'Normal'
+
+
+def add_section_content(doc, md_content, start_numbered=True):
+ """Add markdown content to the document with proper formatting."""
+ blocks = parse_markdown_blocks(md_content)
+
+ for block in blocks:
+ if block['type'] == 'header':
+ level = block['level']
+ text = block['content']
+
+ # Map markdown header levels to document styles
+ # ## (level 2) -> Heading 2 (subsection like 1.1. Motivación)
+ # ### (level 3) -> Heading 3 (sub-subsection like 1.1.1. xxx)
+ # #### (level 4) -> Heading 4
+
+ if level == 1:
+ # Skip level 1 headers - they're added separately as chapter titles
+ continue
+ elif level == 2:
+ para = doc.add_paragraph(text, style='Heading 2')
+ elif level == 3:
+ para = doc.add_paragraph(text, style='Heading 3')
+ elif level == 4:
+ para = doc.add_paragraph(text, style='Heading 4')
+ else:
+ para = doc.add_paragraph(text)
+ if para.runs:
+ para.runs[0].bold = True
+
+ elif block['type'] == 'paragraph':
+ para = doc.add_paragraph()
+ add_formatted_text(para, block['content'])
+
+ elif block['type'] == 'code':
+ add_code_block(doc, block['content'], block.get('lang', ''))
+
+ elif block['type'] == 'table':
+ add_table_to_doc(doc, block['content'])
+
+ elif block['type'] == 'quote':
+ para = doc.add_paragraph()
+ para.paragraph_format.left_indent = Cm(1)
+ para.paragraph_format.right_indent = Cm(1)
+ add_formatted_text(para, block['content'])
+ for run in para.runs:
+ run.italic = True
+
+ elif block['type'] == 'list':
+ for item in block['items']:
+ if block['list_type'] == 'bullet':
+ para = doc.add_paragraph(style='List Paragraph')
+ para.paragraph_format.left_indent = Cm(1)
+ add_formatted_text(para, '• ' + item)
+ else:
+ para = doc.add_paragraph(style='List Paragraph')
+ para.paragraph_format.left_indent = Cm(1)
+ add_formatted_text(para, item)
+
+ elif block['type'] == 'caption':
+ para = doc.add_paragraph()
+ para.alignment = WD_ALIGN_PARAGRAPH.CENTER
+ run = para.add_run(block['content'])
+ run.italic = True
+ run.font.size = Pt(10)
+
+
+def create_thesis_document():
+ """Create the thesis document from template and markdown files."""
+ print("Loading template...")
+ doc = Document(TEMPLATE_PATH)
+
+ # Find and update title on cover page
+ for para in doc.paragraphs[:20]:
+ if 'Título del TFE' in para.text or 'titulo del TFE' in para.text.lower():
+ para.clear()
+ run = para.add_run(THESIS_TITLE)
+ run.bold = True
+
+ # Clear template content after indices (keep cover, resumen structure)
+ # We'll find where actual content starts and replace it
+
+ # Read all markdown files
+ print("Reading markdown files...")
+ md_files = {
+ 'resumen': read_markdown_file(os.path.join(DOCS_PATH, '00_resumen.md')),
+ 'introduccion': read_markdown_file(os.path.join(DOCS_PATH, '01_introduccion.md')),
+ 'contexto': read_markdown_file(os.path.join(DOCS_PATH, '02_contexto_estado_arte.md')),
+ 'objetivos': read_markdown_file(os.path.join(DOCS_PATH, '03_objetivos_metodologia.md')),
+ 'desarrollo': read_markdown_file(os.path.join(DOCS_PATH, '04_desarrollo_especifico.md')),
+ 'conclusiones': read_markdown_file(os.path.join(DOCS_PATH, '05_conclusiones_trabajo_futuro.md')),
+ 'referencias': read_markdown_file(os.path.join(DOCS_PATH, '06_referencias_bibliograficas.md')),
+ 'anexo': read_markdown_file(os.path.join(DOCS_PATH, '07_anexo_a.md')),
+ }
+
+ # Create new document based on template but with our content
+ print("Creating new document with thesis content...")
+
+ # Start fresh document with template styles
+ new_doc = Document(TEMPLATE_PATH)
+
+ # Clear all content after a certain point
+ # Keep first ~70 paragraphs (cover + resumen structure + indices)
+ paras_to_remove = []
+ found_intro = False
+ for i, para in enumerate(new_doc.paragraphs):
+ if 'Introducción' in para.text and para.style and 'Heading 1' in para.style.name:
+ found_intro = True
+ if found_intro:
+ paras_to_remove.append(para)
+
+ # Remove old content
+ for para in paras_to_remove:
+ p = para._element
+ p.getparent().remove(p)
+
+ # Now add our content
+ print("Adding thesis content...")
+
+ # Add each chapter
+ chapters = [
+ ('introduccion', '1. Introducción'),
+ ('contexto', '2. Contexto y estado del arte'),
+ ('objetivos', '3. Objetivos concretos y metodología de trabajo'),
+ ('desarrollo', '4. Desarrollo específico de la contribución'),
+ ('conclusiones', '5. Conclusiones y trabajo futuro'),
+ ]
+
+ for key, title in chapters:
+ print(f" Adding chapter: {title}")
+ # Add chapter heading with Heading 1 style
+ new_doc.add_paragraph(title, style='Heading 1')
+
+ # Remove the top-level header from content (we added it separately with proper style)
+ content = md_files[key]
+ # Remove the first # header line and intro paragraph that follows
+ content = re.sub(r'^#\s+\d+\.\s+[^\n]+\n+', '', content)
+ add_section_content(new_doc, content)
+ new_doc.add_page_break()
+
+ # Add Referencias
+ print(" Adding Referencias bibliográficas")
+ para = new_doc.add_paragraph('Referencias bibliográficas', style='Título 1 sin numerar')
+ refs_content = md_files['referencias']
+ refs_content = re.sub(r'^#[^\n]+\n+', '', refs_content) # Remove header
+
+ # Parse references (each reference is a paragraph)
+ for line in refs_content.split('\n\n'):
+ if line.strip():
+ para = new_doc.add_paragraph()
+ para.paragraph_format.left_indent = Cm(1.27)
+ para.paragraph_format.first_line_indent = Cm(-1.27)
+ add_formatted_text(para, line.strip())
+
+ new_doc.add_page_break()
+
+ # Add Anexo
+ print(" Adding Anexo A")
+ para = new_doc.add_paragraph('Anexo A. Código fuente y datos analizados', style='Título 1 sin numerar')
+ anexo_content = md_files['anexo']
+ anexo_content = re.sub(r'^#[^\n]+\n+', '', anexo_content)
+ add_section_content(new_doc, anexo_content)
+
+ # Update Resumen/Abstract sections (find them in the document and update)
+ print("Updating Resumen and Abstract...")
+ resumen_content = md_files['resumen']
+
+ # Parse resumen file to extract Spanish and English parts
+ resumen_blocks = parse_markdown_blocks(resumen_content)
+ spanish_paragraphs = []
+ english_paragraphs = []
+ keywords_es = ""
+ keywords_en = ""
+ current_section = None
+
+ for block in resumen_blocks:
+ if block['type'] == 'header':
+ if 'Resumen' in block['content']:
+ current_section = 'es'
+ elif 'Abstract' in block['content']:
+ current_section = 'en'
+ elif block['type'] == 'paragraph':
+ text = block['content']
+ if 'Palabras clave:' in text:
+ keywords_es = text
+ elif 'Keywords:' in text:
+ keywords_en = text
+ elif current_section == 'es' and text.strip():
+ spanish_paragraphs.append(text)
+ elif current_section == 'en' and text.strip():
+ english_paragraphs.append(text)
+
+ # Find and update Resumen section in doc
+ found_resumen = False
+ found_abstract = False
+ for i, para in enumerate(new_doc.paragraphs):
+ text = para.text.strip()
+
+ if 'Resumen' in text and para.style and 'Título' in para.style.name:
+ found_resumen = True
+ # Update following paragraphs
+ for j, sp in enumerate(spanish_paragraphs[:3]): # Limit to first 3 paragraphs
+ if i + j + 1 < len(new_doc.paragraphs):
+ target_para = new_doc.paragraphs[i + j + 1]
+ if target_para.style and target_para.style.name == 'Normal':
+ target_para.clear()
+ add_formatted_text(target_para, sp)
+
+ elif 'Abstract' in text and para.style and 'Título' in para.style.name:
+ found_abstract = True
+ for j, ep in enumerate(english_paragraphs[:3]):
+ if i + j + 1 < len(new_doc.paragraphs):
+ target_para = new_doc.paragraphs[i + j + 1]
+ if target_para.style and target_para.style.name == 'Normal':
+ target_para.clear()
+ add_formatted_text(target_para, ep)
+
+ # Save document
+ print(f"Saving document to {OUTPUT_PATH}...")
+ new_doc.save(OUTPUT_PATH)
+ print(f"Done! Document saved as {OUTPUT_PATH}")
+
+
+if __name__ == '__main__':
+ os.chdir('/Users/sergio/Desktop/MastersThesis')
+ create_thesis_document()
diff --git a/instructions/plantilla_individual.xml b/instructions/plantilla_individual.xml
deleted file mode 100644
index b3d19a5..0000000
--- a/instructions/plantilla_individual.xml
+++ /dev/null
@@ -1,1100 +0,0 @@
-
-
-Universidad Internacional de La RiojaEscuela Superior de Ingeniería yTecnologíaMáster Universitario en Inteligencia artificialOptimización de Hiperparámetros OCR con Ray Tune para Documentos Académicos en EspañolTrabajo fin de estudio presentado por:Sergio Jiménez JiménezTipo de trabajo:Desarrollo SoftwareDirector/a:Javier Rodrigo Villazón TerrazasFecha:06.10.2025Resumen En este apartado se introducirá un breve resumen en español del trabajo realizado (extensión entre 150 y 300 palabras). Este resumen debe incluir el objetivo o propósito de la investigación, la metodología, los resultados y las conclusiones.El resumen debe contener lo qué se ha pretendido realizar (objetivo o propósito de la investigación), cómo se ha realizado (método o proceso desarrollado) y para qué se ha realizado (resultados y conclusiones).Importante: La extensión mínima en un TFE individual es de 50 páginas, sin contar portada, resumen, abstract, índices y anexos.Palabras clave: (De 3 a 5 palabras)Descriptores del trabajo que lo enmarcan en unas temáticas determinadas. Serán los utilizados para localizar tu trabajo si llega a ser publicado.AbstractEn este apartado se introducirá un breve resumen en inglés del trabajo realizado (extensión entre 150 y 300 palabras). Este resumen debe incluir el objetivo o propósito de la investigación, la metodología, los resultados y las conclusiones.Keywords: (De 3 a 5 palabras en inglés)Índice de contenidos TOC \o "1-3" \h \z \u 1.Introducción PAGEREF _Toc160619805 \h 11.1.Motivación PAGEREF _Toc160619806 \h 11.2.Planteamiento del trabajo PAGEREF _Toc160619807 \h 31.3.Estructura del trabajo PAGEREF _Toc160619808 \h 32.Contexto y estado del arte PAGEREF _Toc160619809 \h 42.1.Contexto del problema PAGEREF _Toc160619810 \h 42.2.Estado del arte PAGEREF _Toc160619811 \h 42.3.Conclusiones PAGEREF _Toc160619812 \h 53.Objetivos concretos y metodología de trabajo PAGEREF _Toc160619813 \h 63.1.Objetivo general PAGEREF _Toc160619814 \h 63.2.Objetivos específicos PAGEREF _Toc160619815 \h 73.3.Metodología del trabajo PAGEREF _Toc160619816 \h 84.Desarrollo específico de la contribución PAGEREF _Toc160619817 \h 95.Conclusiones y trabajo futuro PAGEREF _Toc160619818 \h 135.1.Conclusiones PAGEREF _Toc160619819 \h 135.2.Líneas de trabajo futuro PAGEREF _Toc160619820 \h 13Referencias bibliográficas PAGEREF _Toc160619821 \h 14Anexo A.Código fuente y datos analizados PAGEREF _Toc160619822 \h 15Índice de figuras TOC \f c \h \z \t "Título 9;1;Figuras;1" \c "Figura" Figura 1. Ejemplo de figura realizada para nuestro trabajo. PAGEREF _Toc155946760 \h 2Índice de tablas TOC \h \z \t "Tablas;1" \c "Tabla" Tabla 1. Ejemplo de tabla con sus principales elementos. PAGEREF _Toc158282432 \h 2IntroducciónEl primer capítulo es siempre una introducción. En ella debes resumir de forma esquemática pero suficientemente clara lo esencial de cada una de las partes del trabajo. La lectura de este primer capítulo ha de dar una primera idea clara de lo que se pretendía, las conclusiones a las que se ha llegado y del procedimiento seguido.Como tal, es uno de los capítulos más importantes de la memoria. Las ideas principales a transmitir son la identificación del problema a tratar, la justificación de su importancia, los objetivos generales (a grandes rasgos) y un adelanto de la contribución que esperas hacer.Típicamente una introducción tiene tres apartados: Motivación, Planteamiento del trabajo, Estructura del trabajo. (Texto Normal del menú de estilos.)Ejemplo de nota al pie.MotivaciónEn este apartado se deberá presentar el problema de estudio al que se quiere dar solución y justificar su importancia para la comunidad educativa y científica. La lectura de este apartado debe dar una idea clara de las razones, motivos e intereses que han llevado a la elección de este tema. Recuerda que para poder justificar este trabajo debe haber referencias a la investigación previa sobre el tema objeto de estudio, independientemente de que luego se profundice en otros apartados.Las siguientes preguntas puedan ayudar a la redacción de este apartado:¿Cuál es el problema que quieres tratar?¿Cuáles crees que son las causas?¿Por qué es relevante el problema?A continuación, se indica con un ejemplo cómo deben introducirse los títulos y las fuentes en Tablas y Figuras.Tabla SEQ Tabla \* ARABIC 1. Ejemplo de tabla con sus principales elementos.Fuente: American Psychological Association, 2020a. Figura SEQ Figura \* ARABIC 1. Ejemplo de figura realizada para nuestro trabajo.Fuente: American Psychological Association, 2020b.Planteamiento del trabajoSe debe plantear, de forma breve, el problema / necesidad detectada de la que se parte para proponer la propuesta y la finalidad del TFE. Los objetivos se van a plantear posteriormente, pero en este apartado debe quedar claro qué te planteas con la intervención.Es necesario que los temas escogidos tengan una vinculación directa con la ingeniería de software, el desarrollo web y/o la ciberseguridad y, por tanto, el tema trabajado debe estar en consonancia con la titulación.Las siguientes preguntas puedan ayudar a la redacción de este apartado:¿Cómo se podría solucionar el problema?¿Qué es lo que se propone? Aquí describes tus objetivos en términos generales.Estructura del trabajoAquí describes brevemente lo que vas a contar en cada uno de los capítulos siguientes.Contexto y estado del arteDespués de la introducción, se suele describir el contexto de aplicación. Suele ser un capítulo (o dos en ciertos casos) en el que se estudia a fondo el dominio de aplicación, citando numerosas referencias. Debe aportar un buen resumen del conocimiento que ya existe en el campo de los problemas habituales identificados.Es conveniente que revises los estudios actuales publicados en la línea elegida, y deberás consultar diferentes fuentes. No es suficiente con la consulta on-line, esnecesario acudir a la biblioteca y consultar manuales técnicos.Hay que tener presente los autores de referencia en la temática del trabajo de investigación. Si se ha excluido a alguno de los relevantes hay que justificar adecuadamente su exclusión. Si por la extensión del trabajo no se puede señalar a todos los autores, habrá que justificar por qué se han elegido unos y se ha prescindido de otros. La organización específica en secciones dependerá estrechamente el trabajo concreto que vayas a realizar. En este punto será fundamental la colaboración con tu DIRECTOR, él podrá asesorarte y guiarte, aunque siempre debes tener claro que el trabajo fundamental es tuyo.El capítulo debería concluir con una última sección de resumen de conclusiones, resumiendo las principales averiguaciones del estudio del dominio y cómo van a afectar al desarrollo específico del trabajo.Recuerda que para citar trabajos de diferentes autores es fundamental e imprescindible seguir el formato APA, según se describe en el documento Normativa_APA.pdf disponible en el apartado de Documentación del Aula de información general del Máster Universitario en Inteligencia Artificial (MIA). No se debe mencionar, ni utilizar ninguna fuente, sin citarla apropiadamente.Contexto del problemaEstado del arteEstado del arte (base teórica): antecedentes, estudios actuales, comparativa de herramientas existentes, etc.ConclusionesConclusiones (nexo de unión de lo investigado con el trabajo a realizar).Objetivos concretos y metodología de trabajoEste tercer capítulo es el puente entre el estudio del dominio y la contribución a realizar. Según el trabajo concreto, el bloque se puede organizar de distintas formas, pero hay tres elementos que deben estar presentes con mayor o menor detalle: (1) objetivo general, (2) objetivos específicos y (3) metodología de trabajo.Es muy importante, por no decir imprescindible, que los objetivos (general y específicos) sean SMART (Doran, 1981) según la idea de George T. Doran que utilizó la palabra smart (inteligente en inglés) para definir las características de un objetivo: •S: Specific / Específico: que exprese claramente qué es exactamente lo que se quiere conseguir.•M: Measurable / Medible: que se puedan establecer medidas que determinen el éxito o fracaso y también el progreso en la consecución del objetivo. •A: Attainable / Alcanzable: que sea viable su consecución en base al esfuerzo, tiempo y recursos disponibles para conseguirlo. •R: Relevant / Relevante: que tenga un impacto demostrable, es decir que sea útil para un propósito concreto.•T: Time-Related / Con un tiempo determinado: que se pueda llevar a cabo en una fecha determinada.Objetivo generalLos trabajos aplicados se centran en conseguir un impacto concreto, demostrando la efectividad de una tecnología, proponiendo una nueva metodología o aportando nuevas herramientas tecnológicas. El objetivo por tanto no debe ser sin más “crear una herramienta” o “proponer una metodología”, sino que debe centrarse en conseguir un efecto observable. Además, como se ha dicho antes el objetivo general debe ser SMARTEjemplo de objetivo general SMART: Mejorar el servicio de audio guía de un museo convirtiéndolo en una guía interactiva controlada por voz y valorada positivamente, un mínimo 4 sobre 5, por los visitantes del museo.Este objetivo descrito anteriormente podría dar lugar a un trabajo de tipo 2 (desarrollo de software) que plantease el desarrollo de un bot conversacional que procesara la señal de voz recogida a través del micrófono y a través de técnicas de procesamiento del lenguaje natural fuera capaz de mantener una conversación con el visitante para determinar el contenido en el que está interesado o resolver las posibles dudas o preguntas que pudiera tener a lo largo de su visita.Objetivos específicosIndependientemente del tipo de trabajo, la hipótesis o el objetivo general típicamente se dividirán en un conjunto de objetivos más específicos analizables por separado. Estos objetivos específicos suelen ser explicaciones de los diferentes pasos o tareas a seguir en la consecución del objetivo general.Con los objetivos específicos has de concretar qué pretendes conseguir. Estos objetivos que deben ser SMART se formulan con un verbo en infinitivo más el contenido del objeto de estudio. Se suelen usar viñetas para cada uno de los objetivos. Se pueden utilizar fórmulas verbales, como las siguientes:AnalizarCalcularClasificarCompararConocerCuantificarDesarrollarDescribirDescubrirDeterminarEstablecerExplorarIdentificarIndagarMedirSintetizarVerificarLos objetivos específicos suelen ser alrededor de 5. Normalmente uno o dos sobre el marco teórico o estado del arte y dos o tres sobre el desarrollo específico de la contribución.En un trabajo como el anterior se incluirían objetivos específicos tales como: Identificar las tecnologías disponibles para crear un chatbotExplorar recursos lingüísticos online que describan el dominio de los muesos en españolDiseñar e implementar el módulo de gestión del dialogoEvaluar el agente conversacional con 10 visitantes del museo.Metodología del trabajoDe cara a alcanzar los objetivos específicos (y con ellos el objetivo general o lavalidación/refutación de la hipótesis), será necesario realizar una serie de pasos. Lametodología del trabajo debe describir qué pasos se van a dar, el porqué de cada paso,qué instrumentos se van a utilizar, cómo se van a analizar los resultados, etc.Desarrollo específico de la contribuciónEn este apartado debes desarrollar la descripción de tu contribución. Es muy dependiente del tipo de trabajo concreto, y puedes contar con la ayuda de tu director para estudiar cómo comunicar los detalles de tu contribución. A continuación, te presentamos la estructura habitual para cada uno de los tipos de trabajo, aunque suele ser común desarrollar los apartados en función de las fases o actividades que se hayan establecido en la metodología de trabajo.Tipo 1. Piloto experimentalEste tipo de trabajos suelen seguir la estructura típica al describir experimentos científicos, dividida en descripción del experimento, presentación de los resultados y discusión de los resultados. Capítulo 4 - Descripción detallada del experimentoEn el capítulo de Objetivos y Metodología del Trabajo ya habrás descrito a grandes rasgos la metodología experimental que vas a seguir. Pero si tu trabajo se centra en describir un piloto, deberás dedicar un capítulo a describir con todo detalle las características del piloto. Como mínimo querrás mencionar:Qué tecnologías se utilizaron (incluyendo justificación de por qué se emplearon y descripciones detalladas de las mismas).Cómo se organizó el pilotoQué personas participaron (con datos demográficos) Qué técnicas de evaluación automática se emplearon.Cómo transcurrió el experimento.Qué instrumentos de seguimiento y evaluación se utilizaron.Qué tipo de análisis estadísticos se ha empleado (si procede).Capítulo 5 - Descripción de los resultadosEn el siguiente capítulo deberás detallar los resultados obtenidos, con tablas de resumen, gráficas de resultados, identificación de datos relevantes, etc. Es una exposición objetiva, sin valorar los resultados ni justificarlos.Capítulo 6 - DiscusiónTras la presentación objetiva de los resultados, querrás aportar una discusión de los mismos. En este capítulo puedes discutir la relevancia de los resultados, presentar posibles explicaciones para los datos anómalos y resaltar aquellos datos que sean particularmente relevantes para el análisis del experimento.Tipo 2. Desarrollo de softwareEn un trabajo de desarrollo de software es importante justificar los criterios de diseño seguidos para desarrollar el programa, seguido de la descripción detallada del producto resultante y finalmente una evaluación de la calidad y aplicabilidad del producto. Esto suele verse reflejado en la siguiente estructura de capítulos:Capítulo 4 - Identificación de requisitosEn este capítulo se debe indicar el trabajo previo realizado para guiar el desarrollo del software. Esto debería incluir la identificación adecuada del problema a tratar, así como del contexto habitual de uso o funcionamiento de la aplicación. Idealmente, la identificación de requisitos se debería hacer contando con expertos en la materia a tratar.Capítulo 5 - Descripción de la herramienta software desarrolladaEn el caso de desarrollos de software, deberían aportarse detalles del proceso de desarrollo, incluyendo las fases e hitos del proceso. También deben presentarse diagramas explicativos de la arquitectura o funcionamiento, así como capturas de pantalla que permitan al lector entender el funcionamiento del programa.Capítulo 6 - EvaluaciónLa evaluación debería cubrir por lo menos una mínima evaluación de la usabilidad de la herramienta, así como de su aplicabilidad para resolver el problema propuesto. Estas evaluaciones suelen realizarse con usuarios expertos.Tipo 3. Comparativa de solucionesEste tipo de trabajos suelen seguir la estructura típica de un estudio comparativo, parten de plantear la comparativa a realizar, describen el desarrollo de la misma y analizan los resultados. Capítulo 4 - Planteamiento de la comparativaEn este capítulo se debe indicar el trabajo previo realizado para identificar el problema concreto a tratar, así como las posibles soluciones alternativas que se van a evaluar. También se deben identificar los criterios de éxito para la comparativa, las medidas que se van a tomar, etc. Capítulo 5 - Desarrollo de la comparativaEn este capítulo se debería desarrollar con todo detalle la comparativa realizada, con todos los resultados y mediciones obtenidos. Puede ser útil acompañar las descripciones con gráficas, tablas y otros instrumentos para plasmar los datos obtenidos.Capítulo 6 - Discusión y análisis de resultadosMientras que el capítulo anterior se centraría en informar de los resultados y comparaciones obtenidos, en este capítulo se abordará la discusión sobre su posible significado, así como el análisis de las ventajas y desventajas de las distintas soluciones evaluadas.En el capítulo de Objetivos y Metodología del Trabajo ya habrás descrito a grandes rasgos la metodología experimental que vas a seguir. Pero si tu trabajo se centra en describir un piloto, deberás dedicar un capítulo a describir con todo detalle las características del piloto. Como mínimo querrás mencionar:Qué tecnologías se utilizaron (incluyendo justificación de por qué se emplearon y descripciones detalladas de las mismas).Cómo se organizó el pilotoQué personas participaron (con datos demográficos)Qué técnicas de evaluación automática se emplearon.Cómo transcurrió́ el experimento.Qué instrumentos de seguimiento y evaluación se utilizaron. Qué tipo de análisis estadísticos se ha empleado (si procede).. Conclusiones y trabajo futuroConclusionesEste último capítulo (en ocasiones, dos capítulos complementarios) es habitual entodos los tipos de trabajos y presenta el resumen final de tu trabajo y debe servir para informar del alcance y relevancia de tu aportación.Suele estructurarse empezando con un resumen del problema tratado, de cómo se ha abordado y de por qué la solución sería válida. Es recomendable que incluya también un resumen de las contribuciones del trabajo, en el que relaciones las contribuciones y los resultados obtenidos con los objetivos que habías planteado para el trabajo, discutiendo hasta qué punto has conseguido resolver los objetivos planteados.Líneas de trabajo futuroFinalmente, se suele dedicar una última sección a hablar de líneas de trabajo futuro que podrían aportar valor añadido al TFE realizado. La sección debería señalar las perspectivas de futuro que abre el trabajo desarrollado para el campo de estudio definido. En el fondo, debes justificar de qué modo puede emplearse la aportación que has desarrollado y en qué campos.Referencias bibliográficasSegún la normativa APAdebe ponerse con sangría francesa y debe estar ordenado por orden alfabético según el apellido del primer autor.Toda la bibliografía que aparezca en este apartado debe estar citada en el trabajo. La mayor parte de las citas deben aparecer en el capítulo 2, que es donde se realiza el estudio del estado del arte. Además, se recomienda evitar citas que hagan referencia a Wikipedia y que no todas las referencias sean solo enlaces de internet, es decir, que se vea alguna variabilidad entre libros, congresos, artículos y enlaces puntuales de internet.Se recomienda encarecidamente utilizar el gestor de bibliografía de Word para gestionar la bibliografía.Ejemplo: BIBLIOGRAPHY \l 3082 Doran, G. T. (1981). There's a S.M.A.R.T. way to write management's goals and objectives. Management Review (AMA FORUM), 70, 35-36.Código fuente y datos analizadosEs recomendable que el estudiante incluya en su memoria la URL del repositorio donde tiene alojado el código fuente desarrollado durante el TFE. El estudiante debe ser el único autor del código y único propietario del repositorio. En el repositorio no debe haber commit de ningún otro usuario del repositorio.De igual forma, los datos que hayan utilizado para el análisis, siempre que así se considere oportuno, también deberían están alojamos en el mismo repositorio.Si el TFE está asociado a una actividad o proyecto de Empresa, se debe justificar en la memoria que, por temas de confidencialidad, no se deja disponible ni el código fuente ni los datos utilizados. Ejemplo de nota al pie. PAGE \* MERGEFORMAT13Sergio Jiménez JiménezOptimización de Hiperparámetros OCR con Ray Tune para Documentos Académicos en Españ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
-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
-BRreft1YTfH6oXBZ6Vx5j5QfnZKmNb/6j4IZSIh2iwfC5a/rbk3TykeBsKh+UjvxGuEGrc3Yp/3a
-3AgE2ahr2w613w3bLzTtrZ+6vU9uBj/5L9vc0bXnrYH/UIbL6DuqOD7+SF64bPbDrYT2j1DedU/r
-mlbq/PAfBvaA2387/Twe91olVMW5Cn/8y7bYsY0v/u8DO3bO6wAAgCcl83ApI9Ek/M0gcmQw9IzZ
-nRfj7mm3L55ROY7E1FFCt7j3wOf1Jvt/tUS49Npcx+2UgmrLHDfBnht6Qmuc/LSxT5gq+O5Jn9x7
-F9345j0IbciY2vxxdo9uTqLQNob+ZPBeZfdwNk2XumOXfB0AAPCYPVjLZXK6EhHm3Tj9hFPR2J8L
-l3K06MZ0hKXckMkoTPU65fpBqxX6z6htpSfpm6H5tqzGIWr6s6pxavfnhkv1eaqfvKckhku1Cbrh
-tW4mhkvna6s6Xv6p/Loz+J4aLn/dWMaWeKa+/t9G+7g3+BlqbXQvzcZL/+Ov/9foXfVTd+zM1wEA
-AE/Kg425TE5XIv08YLgMtJtGpvKo1ykUX5RK8f8Ox/3YIaPujq6t1drntiNcDboHVTlx5w+HS/eb
-UdT00rvucCTeVY6VFAFRvG1yuFScy7552PCm4xR2u37D7c9uVRcP29aV/Pj2Rbf1X/nx03askPw6
-AADgick8XC46W1ylt5RucS873ne3uDSe1hOayiOoTvxlJqmoV56MUPRMc3NauPztbnH5kxfTjy1d
-hbYx/idTavqU947q40WuEKzmzHA5FXgdAADw1PyBcDlZ5/I0Fi/UOpe1I7WGt5rQo0cmgqgJPeP2
-Qqf3WteeN0MTepx+bEJPluHSn9bzpi4z5njejKQ+bWgmu+SORuEfTIy6VU2rn84Ol+GpSMkTekLT
-dRIm9ISTohz++CK8Rnp6uHQvB3ZgYSP5Af7SNj7I9x99kh+/F9zz6eFyxusAAICn5k+ESyHxDj2y
-X1h/1RqMI4uISuJJ4aWI9NL7mUsRvaxWX9w9XA4+bGh61bwcDc/VjSjj4dLv1hfqk/v6eLxP6y8M
-JD7MqWlsF7St1mR1njCVjPWycSI3377omXtl+brhcFndLc9eiqi0Uy3PXoooHC69ZuPJLrVO2rVN
-uTFJ4dI2t3W1WJL8ALLj/r14+aKf7K97dfllGf6SRqdm85X8+Ek7dubrAACAJ+YPhUspem/x7Xr7
-NLy6jRBcRP1VvT1jEXV9vfzWHDoiytw9XP762fMmqRRetmSDaEK49Kb1JCyoLk0XUdf0Z+X6Yc8O
-te2F3do9laflR9+S91XvBbKg/8FuR/0Db/n3tEXUbee72XilXiZlEfXILnO+dereRJy1YuV12/qW
-3i0eXCZdfkHhD3DVM9Q4S/HR5Lrol73UHTv7dQAAwFPyB8PlnyG7XCfhcnUlxeKIUEoGAABYCfkO
-lzfDYWhUolwjvaxp9c8r3zBGuAQAAI9SrsPl6N+Kppeb3mC+pEGHq4twCQAAHqWcd4u7wxOjtuWN
-ctQKm5X6YWjQ4eoiXAIAgEdp5cZcAgAAIL8IlwAAAMgM4RIAAACZIVwCAAAgM4RLAAAAZIZwCQAA
-gMwQLgEAAJAZwiUAAAAyQ7gEAABAZgiXAAAAyAzhEgAAAJkhXAIAACAzhEsAAABkhnAJAACAzBAu
-AQAAkBnCJQAAADJDuAQAAEBmCJcAAADIDOESAAAAmSFcAgAAIDOESwAAAGSGcAkAAIDMEC4BAACQ
-GcIlAABYMda+Yfn/VH6axvHI/7cyOjbMn/6/cc8IlwAAYGVY+5q2b4lwaR5XtG1z9NOsaBXzXIRL
-09A041zESvlzS4TLY/mDUAbFvSBcAgCAlXIuUqNWmTZVjsxt8YNAjpSJU2ZQ/yHu1z2HS0sWh1Re
-sZDPCZSYe2J/brWOLMd/BDxqzrB7UK9sFtRxVyhu19tnaUecV2Unqky7nEb9zttacU39WF8v7Rrd
-7ytwMLmXXWO3qPaCvv6qYc79zLM2c0bllv+GE7v3phj6QqNc+7RV21rX5eaoAvM1tq+uB523FW/n
-6M9Ktf3u8Mb/Te451mG9/Ext3FqxdtAf3fq/SKYOH//5KYfP6KzT8IvWeG+s6NlFZbgE22Zkm53v
-k6NJK2xW6oczdqNjn7br24H987bTD77cvDd9Ii2XqhSVvKMutRTdDLv7fqWkPys3jvNS0O675dJ1
-JoadvzTtr87Qfyi46ikPEy5lYY0dLcDj4160yrqmb9XaJ9Zw5DhXg+5BpaDppYOBdwRGBI7ZCav1
-f5r2vDXwnnBuiGCibzU6pwPbceyLbmtbnDX06rGtfp9T6mPrpX86/cvReCcUap9SP/PczUzYUT+7
-dVHl73bznSu8ZCmkhUvX2hdPKFQOuoOraYEJfb9XZlUWqkbnTJSp0VCcFLd0bdOwViBf2uaOrq1V
-Wifia/U/ub6V/snVlqrny8NndNnv/FMSPyjuW+PDx9tdsmj1LmRJGZy0KuLcr1fNK/8Zq0TlvOap
-X6IDQrWF/akmDobibrsrNnk0tNQmF972E6qUm0HrlSgrpdph1xKHnnxyuyZKi15qX/hPWfBNH/WY
-S++oLFT2TVWKxsfUWq0b3KIby9icHHd+SSvsdvNQ8z5gt7hqEUnIc4RL4E+6sVp7vUjtY38sa1q5
-88N/OJt71hRn0/FBOuruiKDZDJ+MbXl06zluMLjpN3Rt490kEEhqJ6QFrLtspn0kXnDDOE84w+aG
-098TGbtqvKukbbv6uqOXCva/wefbnZdaNEreWM3n2sY0cuWU/6UHY59XNlI++eC9LPvhmOha7zam
-e2PUrYpvPVy0RCQV+0tfxS5alfOMc/9Rsh8dsRMD8VpxbPva/2eYax22+pFf3fTkZdhk/yzypo+d
-fdxsXYTLoCqZ+t4ksrv9t3q0UlLfxf0nqLj8hkv3qtfy2tj19fJbM9DD4j3BHp21apuFwIgKZ3hi
-yJ8Ia8V4p4xqtPdbmAubNeNk6H9DkRZ4hmjgCVqiNne6u+KobI5rOBUs3kWPGhU+qt28Xq7JXrN4
-lnL7DRELPngNshF32MxB67mmvezkoRUhjfvVKKoWteQdoqg41YxVi5YhEpi3r1Scqvwb3VD1mvVe
-rptt5VbEM5/9sZT2yft7mvaXGd3Ur015kfFN/Vud3Ztf1b+nbPMvTdvJ7QGRboGawdoXJaTWTY6S
-C5IHi/5+fOgRLpOFU5MaVBrLkSJxTruVHlBOw+XGq3J52zDPhqPRsH9UL4qfHEz2lXrCZnF9u9W9
-sEfX3ilOtSH7XRvjHqvAlbR72tBVO7zfrfNedgxWP6k3v5XdWT1ZZag++nAkBZ4C94uIVYvV5hct
-cTwWAwls8KEYq8vc3htNz++p1Om91rQX8diX9nNp2c10PtdFJVP/nO8ucfE5VVfjjHApe3USwqU6
-h3kVuHeSi4VLEbNERst1RLhobWha48u4JWgi7ef+1xoNUsP/lcTpZjysZNDaDJ6wFNkyNz7jrJb5
-OU9dRCX2gC/GvR72xBl5rdadtAcTLpPZnRfT1CSKoqaV4t1NaT+/Z3kNl+/6wSrZehes8ROeoA74
-SFeF7LEKnAJtO9yRIc4KwbMI3eJ4wrzu3Ulj5Axufy/eSuFYB5X1V83uhcwp7lW/vVta/7uT4/kc
-qafDlCDlWWozVUtnDtoPFjQjXDonNVHjNr+G95Y39NCfKqH253akPc9RQw9z0UOXJvU0nBaXJXd4
-3Cht1dpntnsrgtGgu1def2mE+nmvrdb2enmvO7h2f9269lm7trVeOxr3la0WL+edjfrjOU/6s3L9
-MDD51ZE92nJf3Y76B/7MEq9vcM51lXplT/ld3w7O/pn7pk+S+7UprnnKR36xHHyQV0AJtZjae7G2
-8/u2GmMuVcU3GdgUf4J8qXjXhmyMSR8OFX5NwiWeLvtYTsZYaP6NOukmDEdzxWmgKqOEJE6rHSvX
-x5KsQxIHwKhRkskZS1p4M91zQ47Cy3GuipgRLn/9GnbGMzD8np/DWnm71RLX5+Mq1DlriN1S8Lqb
-5OQD09gu1z805YvmeCekbvVtvyk2Lm2I1K0zOG6W/6NKgaYVd9q9H9HY4/7st3fGJeU/5eaRNWcG
-em6ppKI/qxrHvcm3LzZM3xlfS3hB/H+msVVqHMnnjC4tNeVrXt+F6jOcTOgJTUOZ+6ZPkJq7E+yP
-VVfCSQnnKhfDLh9HuJQ/2dhptg5aof/eVtanFYdjHVS9AZfaWrl+NBjKwVKESzx1KlkuWmsPDuSV
-c7Sl56pbW5PzZ+WZ4HI891MrNr/ktqHhTi2XS2xmZFjqCpgZLkUOSGhDipzbAivRFIq7RvfSTRkT
-liN3abkU53g1tVlNdh4OTkWMljmq+nHaMOlNnZZR+3QwFEnrsCbnk282o7NYVoM7Ou9HmufdL3Ji
-SfNMbbEacatt1nuhvkFvOLK+aNe2mqoS6Gmc96ZPjZcstWJwdiAtl2kyDpf6s1LpRfy/Rk8+0R28
-l6uONE/k0iviUql/1CivicOdcImnzB1+XCJZ+nMVX0fmOQzb4etpRS3votd7OT2b3mHM5TKb6U2e
-TZ4YlFNzwmWCBWaoBKe55NPSYy6d3hvxjUcWFfLWHiq2vJV0vrflg0jrvrdUU/TYWV2W/Gr9+TcD
-Q9fWI2NMhSUvLcKD3xIF3/Qpue43Y8lSYMxlmgzDpRzlOnOVB/knpY+hcquuqwiXeKpu7a5a3bC4
-Fxq+PIO3sI5/Bp1Ia+ORwSK/Q/JVlRJrgp0xW3yJzUwclpp3S4dLFaAnw7+SqP2Q9+ZbNVt8uraL
-L322uDyVxBcN8FYa8s5K/p4MN+MJMjwFzjgrLpjz1BcdXxUhsE8WoOaHES5jnG9yWWJxPdO5jB1I
-qlKKHYPMFs8yXKonxJeovR6NKwd5aVX639B/pBAu8XSJS2HZpVtIn2TgxpZNUF3JCQvrqNNzrIt5
-qYUzH8Bi61y600WbF97M625NnAtieSXnouHyJrxc9dUw3EcZb7J1huH7G3lrzue/+XahdS6ne0Od
-tmJHQajH9lyWlFirp5rgle91qZJdmY1/YsviqlHa0x5quYJEdMqX2rHF9nf/4XQf3gw7/xjRuTnX
-vbrY55Pmz0Xe9BGK1Lru8EiOr9C30gZUsM5lsizDpSh43V15k5HpgGI5zEWvnfhFWC4johXrR311
-TwX5W9loEwiXcviCiKeXo+H5qt6mC1iEd4cecTg0T205oD7Ir7e9trfAiUF1taTV7KNTuVhYYbvV
-PZfDTuyLnrpnSeotf3Ji7h16vLXii4f+RemCm6mqmhyn6hShcKnOT/qbScudrKtjtyYKd9KdG2Lv
-VQ78e670jxpy16zG9It5d+gJ7w33oq1ucOXvjcnklcLuZITAyL+3irc3HHtwqu6topda3/J8QCQT
-h4n8KqM39Ir0+6uBAfL8651h++ae3Eml9+PnBPehExy0qvaPdwej4NKBC73pIxOpdf37Zq3/tz0Q
-eyAksA+4Q0+SbMOlEFhEXY0oN78FU6IzOKqX/VUSKvVDaxBuufz1s9d4Kf+28LIVHlYFPCpqHkay
-yWE1OCzJZeembXhzFtZxr3rt1/59pb2bbpvn8SM0d+bcW/yiXdILtZPphszfTNXolfv7PSYIhcvr
-Xn0tHJodef/iknc3bX29/LoduhO0Mjqb3i16oZVocmTmvcXje+N6YE72hndvcXGd5v/O40bvnb1v
-5nv9hJlGVmB7xZGScC91tcnhu88HnxPZh7fOQJysX0z2T7l+2LMjp92F3vRRCdW6qss7RSC3CNxb
-HAAAAI8e4RIAAACZIVwCAAAgM4RLAAAAZIZwCQAAgMwQLgEAAJAZwiUAAAAyQ7gEAABAZgiXAAAA
-yAzhEgAAAJkhXAIAACAzhEsAAABkhnAJAACAzBAuAQAAkBnCJQAAADJDuAQAAEBmCJcAAADIDOES
-AAAAmSFcAgAAIDOESwAAAGSGcAkAAIDMEC4BAACQGcIlAAAAMkO4BAAAQGYIlwAAAMgM4RIAAACZ
-IVwCAAAgM4RLAACQW5axb/n/9Pw0jeOR/2/F2jfCz8ADI1wCAIAcsgxNM85FuDTNba0iAuVPs6JV
-zHMRLk31KxErNW3fEuHSPK5o22YocuLhEC4BAEBOyfgoAuVP/+GvXyMRNEWwnDZVnoucqaIncuPh
-wqVj944ata11XRQKTStslmr73aHj/9K7XvmdsjISFzHTwve7rwY8Js73but1pbimjr21YuV1u7/g
-wXFjNZ/LP4oeTc6we1AvP/OP5uJ2vX2W/8PNsQ7Hn3mtWDvoj279XyRbYBtHZ53GbrGgnqE/i9Rp
-ebR0SZi7E0aWuV8rBZ7QOsn5Phi7GbReiY+d2ru64L5yvrbrr7zzWqG421r0yFohKskli3ReT4z6
-nbc1f9fp66Vdo/t9Uijk2TmF+C6eesule9k1/CpFX3/VMKf7zePYp+36dqDOedvJSZF7mHDpfGmW
-dLEjqsZxb3DlOKNh/9ioiJKnl4yv3r4jXAJ/gjv4UBYHX+nvdvd8OHIc+6Lb2i6IH7S+uf5TUrnW
-uw1ViYWPpiuzKs6la5XWiSVecXTZ7/wjjm+tuG/NfcWHY5s7uvrMA1tUQCIUbun6lmHd+L+Omr+N
-rrVflFXYP53ehS326+Ckpeq0qnnlPyNnli8J83aC/bkudkFh2zBPxV4VL9gz9yvitFd408t7vvST
-pZAYLhfdV/ax2EOFykFXnNf8/SNOauc5Pg7u4NZ1Ykaf6mLf1U4Svmf33JAHxlaj45cKtevEgXFs
-+0/wXyPgZ1e+3G53/HJPdMyl2nWySulfjpyrQfdAHE2F2id/v/mFVi/VDruWeMJoaJ20a1vyJ+0L
-/ykP6AHCpVfUinv9aDG8FdV9Yf2/naE8EgmXwB/hfm01P4+rJ5/dealpLzuRn0Z4NV31vSEOreDR
-NHgvzsqVcITyYmiwJytf7I/l6Ge+6Td0bSMlEM/fxlG3qmkb78J/fmWKfaWnNec8tGVLwvydcNVt
-Han6O2D4v9L0Cfl0M+yIK41Nw3iTFi4X21c/OrJU/Rt8mtt/q2vPjTxfZmVB7YrkzRx1d8SvmuHL
-Nlv2a+upcdA+Ejty47GF8mV5NVK4SvErLv9ocq3DVv/a+/fYTU/m8hzUOfcfLgetzfmnsUkcdK96
-La9NWF8vvzWHwQJ6O+of1iubfoNx+XXbCuzleeHSGZ4YNe9v14qy9yrwyv7fOsPuvt+SX9istb+F
-w7AzNN+WVeeHvv6q3v7qyMb5cJu8833SoF0o7hrdy6d9qCDH1KimmZf+N5axqWo62S0VOpr6e5r2
-lxk9or825dnjm/8oZyxDXN7H6l/7o4hB9cRGtvnbqIJF86v695Rt/qVpO90Vuq6dURLu9kU7JzVN
-q+Z5F9j/VvRNUeEvcBSERZ5v7YtSFfvzHx1Zqj4nlapH46IlrjDKR4lndZU738WOtX9FLZJWKgat
-54uEhEdO5ZDYVZnbb4jc/WHgP0wg957+fsYT7sl9h0v3rCnyWOPL3Jgl4+DGq3J52zDPhqPRsH8k
-O1w2Dia7bNjeUv0v4reqV6suMuumMRi/8MxwaffeFMc9YuNWelG5jPOl+ttC4ZlsbR5cyScYsvG5
-3puEV3WiDfepFXSxYYFwqXqI/P6RcYN28alfiiGn3P7b2adV1efrHSOxcOl8rutarRu+gJbtVYHj
-MV/UuTChFkr7+ULbKC+bAxWUIlsR9OqnHAerqFklYekv+ta1z0XNrJfe57zlznVU9lsyXEb2lYpE
-b/uxLU37+aPh9F6Hz49hgw9F7XkrfGC4vTeannLRpYqZ/sjj+Hxir2rai3jCTvu55F4Pe+/L+lqt
-m4OhOPcdLgcfRO29yFWsCpfvQl3n1rvQPnWu7FDpu2yLC8TJiWFGuFRlN9K5I1vpi+OrAe+KoRN8
-grr6nDRLDA9l92D8Fabh8ron3yPUP6Ku1TYjxxiQA17v7V7q+c/9ZhS1YssbxxMLl+L3w+NGaavW
-PrPdW1HBDbp75fWXRrS/JjdEDaBppc4P/+GUt2nhw3ZsgW28tlrb6+W97uDalbnqrF3bWq/Fuolz
-bU5JWPCL9ibzKv+pdS5WJiUsFy4j+8qR3ZGlj/HCo/ZGvMX30VBt9tHLqhDHOqisv2p2Lxyxr9yr
-fnu3tP53J9QPOeX1sHOiTL0mUaW0GSqlgSlW5Xd9e/bExPty3+Fy4aM33pEdyYtxoT9JD5fyUI/3
-iLlfGpMejaQ3Cr6C3XmR8Apy08bhUr5CvH9ENmjrxrn/CMgHNbVlxrwTd2BsTkffJ4XLX79uncFx
-s/wfr37Tijvt3o/8Rgrv6jFhFOBtvyk+fdpwpQW20f3Zb+8U/Wf8p9w8subMQM+XeSVBWOyL9qZo
-+BN6VmdGyzLhMravEo8LRQ4nWPRlV45r7QcG3aZxR/3D6vjAEBdgHSthP0nuuSFfLmk3PjEyciTW
-RWpAaniHe1OsxhN6CrvdPFzJ5LrlMlLCIpnPvTQbL9WARk1f/6/Ru+ovFi7lvzd2mq2DVui/t5X1
-8Rc2L1wmfDYhGC7lv59Xm5G3OGhU/pPwh8DDUedIcZKcZMcod/C+qO8E2l3iJ9Eby1BTFNWkxeHg
-1DS82aAfc9pod5eWywW20f5UEz/y5koPL63uYU1Opd5s5rYFN2xuSbjjFy2nIKT3mebKwuEyaV89
-zZbL625N7Ij0Tg/pqltbk6PI5OIwl+MZzVqx+SV+WeJ0d8XLNWe+3BOxTMtlkJoGNOmGfUC5HnMZ
-yWGhzPezK5d82G1bV94lcrf1Xzm7ZvIns8Ol/qxUehH/r9FTT8kmXOrrsdeX/zU+R/8QeBjeJNnZ
-eeJ7u6hVO5fyKPN978gE9nEo/y2PY6f3Jt7c5a3LM+5Jz5ulx1wusI1yR8VWX1Jr9+iv878QzwIl
-4c5ftOo+XqDOf3gLhcvUffUUx1yqycuzD/NhW02HiM4WF/swfsmhetjzEIxy4C5jLj2RAYQP5b7D
-pTzSlpkt7j9SgplP/bsRPl6tZuBP0sNlcqd20LxwOb9bXE47TV9nAXh4V105By65/SBgxoLJ/hEh
-D434bFAvUkQO4dxQs8VjzS3ps8Xnb6OqNCIjuSVZ0c/NKw9rwZJw5y9aDVh/JOFy5r5Ss8VjrW6P
-eLa425dtRdPVKJOk9QbIRQbkEugBbn9PvFx0xtiTpaqUcrSDZf5scTXP7EmGy8k6l73oaCRvncvd
-zlD+PBjmfMHMN/pUlaeB0MXQguFS/So+ruh6NDlCwn/rCb2CnP4WOZHc2p3ghB55RMUvbZ0Rhw1y
-wLuLgbZW66Qtj3WjGiUTRbvFVa9f7HLR/dKQZ9qznEaKhda5nO6EBbbxXObVWISatWxkHixTEubv
-BPFqjViMULXlaiSGaLgMHwXz99UTW+dSLTKVfIy70z2nLuRiDbfqAAwnp0V62B+9YJGbu87lzbDz
-j1xCK0RNJp45v+qePEC4FBLv0FN9Jn5Ubl14e3JOuPT2oP7K6Ho3wzg1m+r+CouES/EFdXflzRUa
-R/LdR/7oKH1yd4G54TJhKaKXtWowXIr3kAOwxrfrGI+01f+eeZEH/HHevUbkWMDeD9XNHeDXYuoc
-qafdVSU25tK9aMu7l4zvwCEPKLnwllbYzfXihrJjLrSaWPgOPeGdsMA2juQCZ2r1MXm3DFkpydcU
-dcACtz56EEuXhLk7wT6ejjpVT/Bu4TO7tz1HQuEytO0L7CvlSdyhx5faCekNfiseDr2Ho1Pvvk2t
-8c2Nel6pKB2EFrBSFyGxhronJVbxzrlDjxMcA63qHO+uYNFBCA/jYcKlFL23eKV+2AusLTQvXApX
-PUONs5SjG+US5b3gn8wMl0JgEXW1wrkZWCN9frgUpouo+zeQDXaLewKLqMtl2I3jwfQ9gIchS3KK
-8QWxuHJbi1b9U7FwKV0PIneUbp+GVwrLo5n3Fo/vhPnb6Ebv87tvps2KzYE7lYR5O0HOl39dmT4h
-XLXmXChchrZ9gX019vjvLa6oFuvk+z3+umiX9ELtZLrl7lVPlIrgvcXN8/B+Ua10c3rYH72kinfO
-vcVvnYFIMi8mdU5Z5qgcJEvh4cLloyMHV4XDJQAAwFNDuLwbexgZduMNj2CaGwAAeNoIl3fhfjUK
-WjEw0KFd28zLQAcAAIAHRLi8IzmwJjS4qjt80qNFAAAAJMIlAAAAMkO4BAAAQGYIlwAAAMgM4RIA
-AACZIVwCAAAgM4RLAAAAZIZwCQAAgMwQLgEAAJAZwiUAAAAyQ7gEAABAZgiXAAAAyAzhEgAAAJkh
-XAIAACAzhEsAAABkhnAJAACAzBAuAQAAkBnCJQAAADJDuAQAAEBmCJcAAADIDOESAAAAmSFcAgAA
-IDOESwAAAGSGcAkAAIDMEC4BAMCKsfYNy/+n8tM0jkf+v5XRsWH+9P+Ne0a4BAAAK8Pa17R9S4RL
-87iibZujn2ZFq5jnIlyahqYZ5yJWyp9bIlweyx+EMijuBeESAACslHORGrXKtKlyZG6LHwRypEyc
-MoP6D3G/HiRcOsMTo7a1rosvXtP0Z6Xa207/p+v/cgHyoiR0LeIMDmvFNfFiheqx7f9sWVfdxiv5
-kfRnhqU+i/OtXdssyBf9r2lftEt6oXHqqKcCq+x21D9qjA9AfX2rZpwM55Zs53vX2C3K40EcEZuV
-+mF/dOv/6tcvS1bzCSo575NyLycbpa+/apjf03aDd95KFNjG60HnbUVVRKpa2+8Ob/zf5JVjn7br
-2/7X6lfFoX7FEFXxJgmcv50fvfZrfyeInVrabXTO0l8xJ26G3X3vDCJ2QrlxPO9wuLF7B7XSM3UA
-rRUrr9vWtf8b350OsZxSGS7Bthn5XmdWERHzCt68N31qLZf253oxlKSVUb/9uuwXMq/CyVMhu/9w
-aZs7uqaXGkf94chxrgb9k3ZtS+yeJXJhJFw6p3VdKzZPhqPR0I4c5Isatjc1fadtXTn2j5HMlk5P
-vuheV77olfOLcInH4apX3xRnxIpx3BtcOc5oKM6CJV0r7HZnRAD7U02cBoq77e6FLf7EOmlV1rTC
-2/74ilCFy72eE7PEJeO9c8+NoqiJ/un0L0eiIuoeVApaofYpuRZy/Q0Kslr/p2nPWwPvGVdmVVRs
-WyJLiYptNDzrNES1tmlYuc2XN4PWK1kV1w67ltgD8mtVVbFeal/4T4lQFW+l893f/il/G93Bh7L8
-+7/b3XO1E8677b9F4dJLh/5OyqMbyxCVv//F2QOvbO92U89G6vniCGqdDGzHsS+6re2CplfNK//3
-dzvE8kvlvOap/1UHhA7ueVVEwCIFb7E3fSJjLr1kKQTDpai+5KH1qml65fZUVTgvO3dtXcvefYdL
-96wpdkjjS6TIOYOjzuK1cCRcDt7r2l/mb+3TUbcqivJX/5H0zdDFldCkvgAeCdvcaw3Cx5r7pSGO
-yuZZShT80SmL08a+16A/5tiBCzkVLler++mmL7Z5411oo+yPYkMXbW1VVdmkurc7L7VolLyxms+1
-jch+yxHXOmz1I1fjN716+lfphcsZ+8c9b7e+RK7A3d4b8Yq5bTpy+2917Xkz9MWpAh9tJfK5/T1x
-rASipGTLhu1pS97yh1ieqZxnnPuPks2vIoIWKHiLvOnT4Hxpimvg6n5THnuTMqmqL30nHHtubTtP
-ieW+w6WqnkqdH/7DVLej/mG9rPod9Gfl+qEVrLGm4dIbVDERa6gPUH3xqptbWysGe6xkA3uAcR7p
-AlOVqXqjUFkPfMLIC3q/qnjvpa+X450mwQ8zfcKw/ULT96KXeuocttFKaUsAMqCKd8rZVBwgopDX
-usnnCc/qhcvknOT2G5q28WGRZjanuysO3qZ/uKqr08q/0Stc9S713ip1eAxazzX9ffIemBsuEw0O
-NjTdyGnTZXLJF4kz0CYdMjDE0fAuVtTPxY9n1tIzD7FcWyDnLVBFzBUueIRLj2wm16uiYgmXH3Uk
-5j0V3Hu3uLrE0V8ZswZZqmbzSAdTMKRPw6XqrertadpfnWGszTzA7r0pRjsyJs0MN47zvSNe0WuE
-d2/Vi542xVfpdQDJF42ES/GVyz6vWlu+4LgLzI+2w/aWVtg2VGO1/JXsItk0BtOPZnd3C5pebh7L
-gQH+h1mTAz3tI7FvIoeoOoflqa0bj9CPTin1zCcrfS2xe2tq5cKl03utaS/ih1Xaz2MuWkVNK05i
-qFf1x8Klt2NX5RzpXg9778v6Wq2b0v6xdLh0neGpUdZTBxs8OOdzPbGxI+3nflGPh0t1WTIrO846
-xPJtfs5bpIqYJaHgES4nAglkXH4WrqYe1ANM6HG+tauTJsl3ne6FLfJc0OBDMdpPITuY9PpnvwUg
-EC4l2fQ4q81S1hSxPm7ZkRE5N4SKsizcgWo09ATX2t+IfcJpF4BzZYeaKi7bolqZjATwK+jQh3Hs
-K/Xb625N08pHgTKjflI7WaWmD6wa13q3Icpdcn+CI7urZGy6HfUP/EkPhc3IBAUvXPZHZ+26mhWX
-0mCfH6mnQ9WP0ZwXk1XfaOg6UL3gdmRwjmPty7FSeY8U6kTuKb/r26mTMMZ11/fp9BevJMR2oyoP
-nlfNfp666iIGH0TJbySUA7VPQgOlfOpqP1L5i9PJv1VZ7FOvr2YeYjnn5byz9L7EhaqIJDMK3tw3
-fWpC4VLVNvIKxxkeNwL7Z8YMqgfwAOHSIy5W+sfthje5TC81jic1lCVHO8aqY/tjaZIglwyXsptb
-jx327peGpo9fZKlw6fabejgCziGr2vEWybFZ8b7vMXXSCrRTyrbMSdcb8AeoeS2x8VITXqX2P9PY
-KjWO5ASF0aWl5r5o+s5kgoIKE/p6dd/sXci+gcFJu7YpfhIZmpYfXhpOiAKq92Be45zaJ5HBlM5Z
-Q+zGQJeFaWyX6x/CI6Xy6VbNVhrPq5gxl0VVvHrhZa19YsmNvOybe2VxZosXHv8VvQk96U2hD05d
-S0xPJVNX6cMuLzty1tKW120lu57af5crH1qhIYNhcw6xnFM5T39W9ecnXQ26hzWxOdO+xIWqiCQz
-Ct7cN31qvJ3sF0hVfb0zzZ31yoGaFHU16KlJY+E+0gf2YOFyyh313sndUv6oio3aieXXrdZB6D/j
-b9m/5B27s8KlV17HVJuo/CY2dpqRF2y9raxPziLqTRcNl/Enh7mXZuOlGk8pzrf/NXpXfflagWIx
-62QTGrsjL1DSkyjwu7zT3qxJzWo0obZZ74Xzgf2vOAj0yVHg/rT6l+Fy6g05z2np/a2WSzmIMKkV
-KrAUS6G4a3TFDgmdElaB+tamXToRt87wbBA5u6tZUDPa5NSMmc3E8YsPb/mWS2W6BIy+/qre/ur4
-5/ukcDn/EMs7d3TejyyqFZqftFgVMUe04M1706cmVJOogb96uXUR2hXu16YozfmpbXIQLiU1h8Yb
-QK12YmGzVHoR/6/tFb1Z4VJVChOqZMvDXn8WeSnvv0bP+7N4XrxzuPzZrcpVJ+SqRoIcUvlfWQst
-Gi4DgZKpPPij1DzEuac9WZGtH8SyQaiyS2a9kyeXXKaK3xhz6YXm14vN0vnalLvgm/9oJchvbanh
-XFeyJFQ/pZcEuRMWmMT5EJYfc5kiZScsdoitIkuWbH/+zd2riKAFCl7wTZ+Y0M4cdXc0bbcbq4JS
-r3AeRE7CpSpYXl6cOzJ6drhMYHdeJHSLh8Tz4oxwqbrFS147a4z6bJFLYXlIjLdILVkyc+zzeFoP
-U3nw5zhqSUJN3+nMW+g7OlTDp86mKxsuveM01t62wGxxdXgueMnnLVuzWsNa1ETpTMOlHICU13Dp
-VeyxMU4zZosnU6UiUpwWP8RWUTDn3b2KCFik4BEu/Z2ZMl5O7p+nGy5Hn6qlvV502KlaEG6cxNV0
-mdilnjtSa5srS4ZL9fz48K/r0TT4LxUuEyf0XA+HanS/2EC5+EjowwfDpffho7OLhsEuRW9az5u6
-zJhM5UHmboadXTkgqvSun1K83PGy2IqcGb3R/BqqyVRnaLH93X9k/tOIdIqJU4tcVDy3gzpUA+S8
-dS7D+0FS/enJl3zOMHyDH3+k3cyo+pBEMfjHiE6RuJY3j9iYtkKF9oDYotqHyJguURmKrfRylTv8
-2DBkH3GQ03utLxXU7pfqtZ+3zqUbWTD8e3gOk1fUg43Z8w+x1XFlNv7pRQq8fSy3eNpDPb+KEPtk
-vBMXKXiLvOkjdhspcdFw6e2uyPIU3rCBem5u9XLP4dK1/5Xr+Ht3L5ADUScrywfDn7fQj1w5SA4b
-ty965n6loJUmIwyWDZeiWKrVfwLDjQ9rJV2fRrflwuX4EyYuRaS+df2VIW9UILfObL6SY3MCVVXq
-UkRjqs1SYCoPMufdPkRbr/5vIA6/EP/86k2FDpwVvAAxvqvWeBqHXno/LrPe4TC55cb4Nic57w1U
-4W/GHXri+8FbdyLl9HZuiD/3x9ePb8qS6/kHztxvLboHvLuwyElLp3IuiygJnX/kVo5vruZY7+XD
-8R16xpWbVjTOc1yRyaUEZ92hx1stv3g49B/Lc4EsNuO5a7GiPv8QWyXiMJFfqpzAJE/H4yMlMj9p
-XhXhLUH4RuXv+QVvwTd9rFT3ph5eHzcSLv2oLSuc4ISnWXeWuncP0S0+ssyD8RrjYh/Ke2Kag8iq
-JcElytWyJj1vsR5l+XApBNYtV8PtzW+Br27ZcCnMWET9qmeocZbik5fkuP6efK1AsQh9mKRFW7zq
-jKk8yJw6dlKM+1MGh2qG77QBT3Dt09b4XsmF4na9Hblh9O3IOjbGT8jjuhiJZt9bPLYfVKWf3ggn
-V2Ia3y55oaVYHtytMxAV0YvJLZ7Ft9azAwEoXhJCtw735i2Fd5pzIXZpyX9CrOrOqdn3Flf3/q2d
-TAu8mrlV8sp6vKgvcoitGHHK3h/fS10eKbHDX5pZRVz36mt66WDc7D2v4EkLvemj5PTeFPStVqiP
-IBYuBedbp+FXOHm8f31exlwiRK64y1QeAACwegiXeSTXOmEqDwAAWEGEy1xxRleOfWaUtentiAAA
-AFYI4TJPvNVo1+SgH0ZbAgCAVUS4BAAAQGYIlwAAAMgM4RIAAACZIVwCAAAgM4RLAAAAZIZwCQAA
-gMwQLgEAAJAZwiUAAAAyQ7gEAABAZgiXAAAAyAzhEgAAAJkhXAIAACAzhEsAAABkhnAJAACAzBAu
-AQAAkBnCJQAAADJDuAQAAEBmCJcAAADIDOESAAAAmSFcAgAAIDOESwAAAGSGcAkAAIDMEC4BAACQ
-GcIlAAAAMkO4BAAAQGYIlwAAAMgM4RIAAACZIVwCAAAgM4RLAAAAZIZwCQAAgMwQLgEAAJAZwiUA
-AAAyQ7gEAABAZgiXAAAAyAzhEgAAAJkhXAIAACAzhEsAAABkZolwqQEAAOCR8gPfb6PlEgAAAJkh
-XAIAACAzhEsAAABkhnAJAACAzBAuAQAAkBnCJQAAADJDuAQAAEBmCJcAAADIDOESAAAAmSFcAgAA
-IDOESwAAAGSGcAkAAIDMEC4BAACQGcIlAAAAMkO4BAAAQGYIlwAAAMgM4RIAAACZIVwCAAAgM4RL
-AAAAZIZwCQAAgMwQLgEAAJAZwiUAAAAyQ7gEAABAZgiXAAAAyAzhEgAAAJkhXAIAACAzhEsAAABk
-hnAJAACAzBAuAQAAkBnCJQAAADJDuAQAAEBGfv36/9qInqnAO+k5AAAAAElFTkSuQmCCiVBORw0KGgoAAAANSUhEUgAAAtkAAADiCAMAAACssSvrAAAAAXNSR0IArs4c6QAAAARnQU1BAACx
-jwv8YQUAAAL9UExURf////7+/vDw8MzMzLW1tbKysry8vN7e3vn5+c/Pz3p6enl5eYKCgoGBgX5+
-fnJycpycnO7u7sDAwG5ubq6ursPDw4qKioiIiOjo6Hx8fNjY2PPz86ioqI6Ojvj4+Ovr6+Xl5fT0
-9P39/ff398LCwouLi3h4eMvLy/b29ufn57u7u3BwcEJCQlZWVpeXl+Hh4e3t7bCwsExMTBwcHK2t
-raenpzc3NxAQED4+Puzs7PLy8mNjY1RUVBsbGwMDAxcXFzg4OFFRUWBgYHFxcZWVlb29vdXV1YaG
-hri4uDExMTY2NpGRkYyMjHV1dVdXV4WFhaOjo9nZ2fHx8ePj49/f36GhoVhYWFpaWp6entbW1uLi
-4tDQ0G1tbV5eXpSUlNra2sfHx/r6+vz8/L+/v29vb8HBwZqamnd3d7q6umJiYtPT0/v7+9zc3EhI
-SIODg+Dg4GhoaEpKSk1NTXR0dKurq0VFRXt7e9fX16KiosjIyI+Pj1xcXNTU1KqqqkNDQ3Nzc2lp
-adHR0eTk5Gpqak9PT2VlZZiYmMnJyQYGBg0NDUdHR+np6WZmZpaWlmRkZGtra39/f1JSUlVVVdLS
-0rOzs7S0tIeHh05OTl1dXRISEh4eHs7Oztvb21lZWa+vr5mZmc3Nzebm5h0dHampqcrKyn19fcbG
-xltbW6ysrJKSkktLSzw8PFNTU52dnS0tLYCAgI2NjSMjI/X19TAwMEBAQO/v75CQkKampp+fnzo6
-OjQ0NL6+vicnJ7m5uZubm7Gxsba2tj8/P8TExImJiXZ2djMzM6WlpWxsbD09PSEhIUZGRmdnZ6Sk
-pMXFxerq6pOTk2FhYd3d3aCgoFBQUCIiIkFBQSsrKzU1Nbe3t4SEhDs7OxQUFBkZGS8vLy4uLiYm
-JgcHB19fX0RERDIyMiQkJAAAAAICAjk5OQQEBBMTEw8PDwEBASkpKSgoKAgICBYWFh8fH0lJSSoq
-KiUlJQsLCxgYGBoaGiwsLCAgIAwMDBUVFQUFBQoKCgkJCQAAAD25/CoAAAD/dFJOU///////////
-////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////
-////////////////////////AGb8ilkAAAAJcEhZcwAAFxEAABcRAcom8z8AADAzSURBVHhe7V3Z
-kesgEHQVEfBFDiTgkIiCDPgiAaJRAFQpAlVtHq97QD5lWT72WfLS67V1n80wMwzDrqGhoaGhoaGh
-oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYYPQ
-yttP/+V6LQ0N74Nyznz4zyVdL6ah4W2wzqsPw5jG7Ia3w7pP6wLaj8zWuVG84V1Qa2A2L0Fra5wq
-ixoaXsZKZDZ4HbqYmi3Z8C58ntk7yGxth/3gmy7S8D6sQWYH1/2A17oxu+F9WIOeHWL/s++GEIxV
-ufG74S1YhZ5tXdeZZFyI0Zlkm4uk4XXYj/sj6BvRPsaktLLJhBBD8o3cDU8i1zbttfhGrBPPiNbZ
-JhdB7ia5G56Cj84rcOfzevautNRkMxwuRaUwDKEJ7oYnoEwcKBgfl9nvppvIbPkNJ4qRMmEoZa+h
-4TGAScPgwimdrpHzpbdC29MdslLYoM48B+rZdar8VPD6UPaar6ThIUCf9WnY/+yHOWbnFII7bxlU
-wdQpQGO1S3XmSYqPMvsaVL6j+bSFuw4ovxK8Leb4/RKreCDiMAwxdPt9nGW2i+B/iTKtV6LiKbN7
-56ky8G83RqOefstPnbyFm8wGVIrDKNL/Mkqw8Qo+Lry1qfj1Y8kRskrGDUPXFbexUq4PZlbPzhDQ
-OjgN6RkoPBVuDVIUFM4Jszr3Ui4g2lNOPUxAbEgZr71zXmvvDXRlTsrRpnFbZgNaKzPUovWXYZ3P
-68Bbouk1KKLeIv2hergISg8DlAsP1ZiKg3a9gwV5R2bbFP3ORudDzFA+TOiMGiyWeKynzLZZp2h9
-tkNMWQ3JB5N9TB4bxMGZLhoz2JmncdSzp6GV6+JfjylZQXhPhXn1VcA0y96p7J5uSdEADECfHFWP
-CFIabwunZbUKA6Tr/CPLoUOJ8NoFSONOgdLaY69ouITr98EZlU1UOFk0OZshQ65DP1YqOg0hbmPQ
-apaYszJbgIIS/3iAq1rN/ZsXZDb4qKX6ScHq5B8vrGR0VrAQoRVFkALqADgN8tX1AtCR13iP2UFZ
-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Dor81JournalArticle{D7C468B5-5E32-4254-9330-6DB2DDB01037}There's a S.M.A.R.T. way to write management's goals and objectives1981DoranG.T.Management Review (AMA FORUM)35-36701
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- This value indicates the number of saves or revisions. The application is responsible for updating this value after each revision.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-DocumentLibraryFormDocumentLibraryFormDocumentLibraryForm<_Flow_SignoffStatus xmlns="27c1adeb-3674-457c-b08c-8a73f31b6e23" xsi:nil="true"/>Conchi de MiguelSergio Jimenez22019-08-05T13:11:00Z2025-12-15T20:35:00Z2025-12-15T20:35:00ZNormal.dotm121303717313Microsoft Office Word014440falseTítulo1Universidad Internacional de La Rioja Facultad de Educaciónfalse20310false14418423805_Toc43752334914418422905_Toc43752334313107702005_Toc43752336213107701405_Toc4375233611310770805_Toc4375233601507378205_Toc437523359false16.00000x010100DF3D7C797EA12745A270EF30E38719B9true2025-12-15T20:34:56ZStandarddefa4170-0d19-0005-0004-bc88714345d2d9ff98f8-1670-401f-bf78-0b33bbd90cfe7e5380b3-cad0-4ca2-b0ac-f3b167232e81010, 3, 0, 1
\ No newline at end of file
diff --git a/thesis_output.htm b/thesis_output.htm
new file mode 100644
index 0000000..0845de9
--- /dev/null
+++ b/thesis_output.htm
@@ -0,0 +1,751 @@
+
+
+
+
+TFM - Optimización de Hiperparámetros OCR
+
+
+
+
+
+
+
Universidad Internacional de La Rioja Escuela Superior de Ingeniería y Tecnología
+
Máster Universitario en Inteligencia Artificial
+
Optimización de Hiperparámetros OCR con Ray Tune para Documentos Académicos en Español
+
Trabajo Fin de Estudio presentado por: Sergio Jiménez Jiménez
+
Tipo de trabajo: Comparativa de soluciones / Piloto experimental
+
Director: [Nombre del Director]
+
Fecha: 2025
+
+
+
Resumen
+
El presente Trabajo Fin de Máster aborda la optimización de sistemas de Reconocimiento Óptico de Caracteres (OCR) basados en inteligencia artificial para documentos en español, específicamente en un entorno con recursos computacionales limitados donde el fine-tuning de modelos no es viable. El objetivo principal es identificar la configuración óptima de hiperparámetros que maximice la precisión del reconocimiento de texto sin requerir entrenamiento adicional de los modelos.
+
Se realizó un estudio comparativo de tres soluciones OCR de código abierto: EasyOCR, PaddleOCR (PP-OCRv5) y DocTR, evaluando su rendimiento mediante las métricas estándar CER (Character Error Rate) y WER (Word Error Rate) sobre un corpus de documentos académicos en español. Tras identificar PaddleOCR como la solución más prometedora, se procedió a una optimización sistemática de hiperparámetros utilizando Ray Tune con el algoritmo de búsqueda Optuna, ejecutando 64 configuraciones diferentes.
+
Los resultados demuestran que la optimización de hiperparámetros logró una mejora significativa del rendimiento: el CER se redujo de 7.78% a 1.49% (mejora del 80.9% en reducción de errores), alcanzando una precisión de caracteres del 98.51%. El hallazgo más relevante fue que el parámetro textline_orientation (clasificación de orientación de línea de texto) tiene un impacto crítico, reduciendo el CER en un 69.7% cuando está habilitado. Adicionalmente, se identificó que el umbral de detección de píxeles (text_det_thresh) presenta una correlación negativa fuerte (-0.52) con el error, siendo el parámetro continuo más influyente.
+
Este trabajo demuestra que es posible obtener mejoras sustanciales en sistemas OCR mediante optimización de hiperparámetros, ofreciendo una alternativa práctica al fine-tuning cuando los recursos computacionales son limitados.
+Palabras clave: OCR, Reconocimiento Óptico de Caracteres, PaddleOCR, Optimización de Hiperparámetros, Ray Tune, Procesamiento de Documentos, Inteligencia Artificial
+
---
+
Abstract
+
This Master's Thesis addresses the optimization of Artificial Intelligence-based Optical Character Recognition (OCR) systems for Spanish documents, specifically in a resource-constrained environment where model fine-tuning is not feasible. The main objective is to identify the optimal hyperparameter configuration that maximizes text recognition accuracy without requiring additional model training.
+
A comparative study of three open-source OCR solutions was conducted: EasyOCR, PaddleOCR (PP-OCRv5), and DocTR, evaluating their performance using standard CER (Character Error Rate) and WER (Word Error Rate) metrics on a corpus of academic documents in Spanish. After identifying PaddleOCR as the most promising solution, systematic hyperparameter optimization was performed using Ray Tune with the Optuna search algorithm, executing 64 different configurations.
+
Results demonstrate that hyperparameter optimization achieved significant performance improvement: CER was reduced from 7.78% to 1.49% (80.9% error reduction), achieving 98.51% character accuracy. The most relevant finding was that the textline_orientation parameter (text line orientation classification) has a critical impact, reducing CER by 69.7% when enabled. Additionally, the pixel detection threshold (text_det_thresh) was found to have a strong negative correlation (-0.52) with error, being the most influential continuous parameter.
+
This work demonstrates that substantial improvements in OCR systems can be obtained through hyperparameter optimization, offering a practical alternative to fine-tuning when computational resources are limited.
+Keywords: OCR, Optical Character Recognition, PaddleOCR, Hyperparameter Optimization, Ray Tune, Document Processing, Artificial Intelligence
+
+
+
Índice de contenidos
+
[El índice se generará automáticamente en Word]
+
+
+
1. Introducción
+
Este capítulo presenta la motivación del trabajo, identificando el problema a resolver y justificando su relevancia. Se plantea la pregunta de investigación central y se describe la estructura del documento.
+
1.1. Motivación
+
El Reconocimiento Óptico de Caracteres (OCR) es una tecnología fundamental en la era de la digitalización documental. Su capacidad para convertir imágenes de texto en datos editables y procesables ha transformado sectores como la administración pública, el ámbito legal, la banca y la educación. Sin embargo, a pesar de los avances significativos impulsados por el aprendizaje profundo, la implementación práctica de sistemas OCR de alta precisión sigue presentando desafíos considerables.
+
El procesamiento de documentos en español presenta particularidades que complican el reconocimiento automático de texto. Los caracteres especiales (ñ, acentos), las variaciones tipográficas en documentos académicos y administrativos, y la presencia de elementos gráficos como tablas, encabezados y marcas de agua generan errores que pueden propagarse en aplicaciones downstream como la extracción de entidades nombradas o el análisis semántico.
+
Los modelos OCR basados en redes neuronales profundas, como los empleados en PaddleOCR, EasyOCR o DocTR, ofrecen un rendimiento impresionante en benchmarks estándar. No obstante, su adaptación a dominios específicos típicamente requiere fine-tuning con datos etiquetados del dominio objetivo y recursos computacionales significativos (GPUs de alta capacidad). Esta barrera técnica y económica excluye a muchos investigadores y organizaciones de beneficiarse plenamente de estas tecnologías.
+
La presente investigación surge de una necesidad práctica: optimizar un sistema OCR para documentos académicos en español sin disponer de recursos GPU para realizar fine-tuning. Esta restricción, lejos de ser una limitación excepcional, representa la realidad de muchos entornos académicos y empresariales donde el acceso a infraestructura de cómputo avanzada es limitado.
+
1.2. Planteamiento del trabajo
+
El problema central que aborda este trabajo puede formularse de la siguiente manera:
+
¿Es posible mejorar significativamente el rendimiento de modelos OCR preentrenados para documentos en español mediante la optimización sistemática de hiperparámetros, sin requerir fine-tuning ni recursos GPU?
+
Este planteamiento se descompone en las siguientes cuestiones específicas:
+
Selección de modelo base: ¿Cuál de las soluciones OCR de código abierto disponibles (EasyOCR, PaddleOCR, DocTR) ofrece el mejor rendimiento base para documentos en español?
+
Impacto de hiperparámetros: ¿Qué hiperparámetros del pipeline OCR tienen mayor influencia en las métricas de error (CER, WER)?
+
Optimización automatizada: ¿Puede un proceso de búsqueda automatizada de hiperparámetros (mediante Ray Tune/Optuna) encontrar configuraciones que superen significativamente los valores por defecto?
+
Viabilidad práctica: ¿Son los tiempos de inferencia y los recursos requeridos compatibles con un despliegue en entornos con recursos limitados?
+
La relevancia de este problema radica en su aplicabilidad inmediata. Una metodología reproducible para optimizar OCR sin fine-tuning beneficiaría a:
+
Investigadores que procesan grandes volúmenes de documentos académicos
Instituciones educativas que digitalizan archivos históricos
Pequeñas y medianas empresas que automatizan flujos documentales
Desarrolladores que integran OCR en aplicaciones con restricciones de recursos
+
1.3. Estructura del trabajo
+
El presente documento se organiza en los siguientes capítulos:
+Capítulo 2 - Contexto y Estado del Arte: Se presenta una revisión de las tecnologías OCR basadas en aprendizaje profundo, incluyendo las arquitecturas de detección y reconocimiento de texto, así como los trabajos previos en optimización de estos sistemas.
+Capítulo 3 - Objetivos y Metodología: Se definen los objetivos SMART del trabajo y se describe la metodología experimental seguida, incluyendo la preparación del dataset, las métricas de evaluación y el proceso de optimización con Ray Tune.
+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, estructurado en tres secciones: (4.1) planteamiento de la comparativa con la evaluación de EasyOCR, PaddleOCR y DocTR; (4.2) desarrollo de la comparativa con la optimización de hiperparámetros mediante Ray Tune; y (4.3) discusión y análisis de resultados.
+Capítulo 5 - Conclusiones y Trabajo Futuro: Se resumen las contribuciones del trabajo, se discute el grado de cumplimiento de los objetivos y se proponen líneas de trabajo futuro.
+Anexos: Se incluye el enlace al repositorio de código fuente y datos, así como tablas completas de resultados experimentales.
+
+
2. Contexto y estado del arte
+
Este capítulo presenta el marco teórico y tecnológico en el que se desarrolla el presente trabajo. Se revisan los fundamentos del Reconocimiento Óptico de Caracteres (OCR), la evolución de las técnicas basadas en aprendizaje profundo, las principales soluciones de código abierto disponibles y los trabajos previos relacionados con la optimización de sistemas OCR.
+
2.1. Contexto del problema
+
Definición y Evolución Histórica del OCR
+
El Reconocimiento Óptico de Caracteres (OCR) es el proceso de conversión de imágenes de texto manuscrito, mecanografiado o impreso en texto codificado digitalmente. La tecnología OCR ha evolucionado significativamente desde sus orígenes en la década de 1950:
+
Primera generación (1950-1970): Sistemas basados en plantillas que requerían fuentes específicas.
Segunda generación (1970-1990): Introducción de técnicas de extracción de características y clasificadores estadísticos.
Tercera generación (1990-2010): Modelos basados en Redes Neuronales Artificiales y Modelos Ocultos de Markov (HMM).
Cuarta generación (2010-presente): Arquitecturas de aprendizaje profundo que dominan el estado del arte.
+
Pipeline Moderno de OCR
+
Los sistemas OCR modernos siguen típicamente un pipeline de dos etapas:
+
``mermaid
+
flowchart LR
+
subgraph Input
+
A["Imagen de documento"]
+
end
+
subgraph "Etapa 1: Detección"
+
B["Text Detection (DB, EAST, CRAFT)"]
+
end
+
subgraph "Etapa 2: Reconocimiento"
+
C["Text Recognition (CRNN, SVTR, Transformer)"]
+
end
+
subgraph Output
+
D["Texto extraído"]
+
end
+
A --> B
+
B -->|"Regiones de texto (bounding boxes)"| C
+
C --> D
+
style A fill:#e1f5fe
+
style D fill:#c8e6c9
+`
+Figura 1. Pipeline típico de un sistema OCR moderno con etapas de detección y reconocimiento.
+
Detección de texto (Text Detection): Localización de regiones que contienen texto en la imagen. Las arquitecturas más utilizadas incluyen:
- EAST (Efficient and Accurate Scene Text Detector)
+
- CRAFT (Character Region Awareness for Text Detection)
+
- DB (Differentiable Binarization)
+
Reconocimiento de texto (Text Recognition): Transcripción del contenido textual de las regiones detectadas. Las arquitecturas predominantes son:
- CRNN (Convolutional Recurrent Neural Network) con CTC loss
+
- Arquitecturas encoder-decoder con atención
+
- Transformers (ViTSTR, TrOCR)
+
Métricas de Evaluación
+
Las métricas estándar para evaluar sistemas OCR son:
+Character Error Rate (CER): Se calcula como CER = (S + D + I) / N, donde S = sustituciones, D = eliminaciones, I = inserciones, N = caracteres de referencia.
+Word Error Rate (WER): Se calcula de forma análoga pero a nivel de palabras en lugar de caracteres.
+
Un CER del 1% significa que 1 de cada 100 caracteres es erróneo. Para aplicaciones críticas como extracción de datos financieros o médicos, se requieren CER inferiores al 1%.
+
Particularidades del OCR para el Idioma Español
+
El español presenta características específicas que impactan el OCR:
+
Caracteres especiales: ñ, á, é, í, ó, ú, ü, ¿, ¡
Diacríticos: Los acentos pueden confundirse con ruido o artefactos
Longitud de palabras: Palabras generalmente más largas que en inglés
Puntuación: Signos de interrogación y exclamación invertidos
+
2.2. Estado del arte
+
Soluciones OCR de Código Abierto
+
EasyOCR
+
EasyOCR es una biblioteca de OCR desarrollada por Jaided AI (2020) que soporta más de 80 idiomas. Sus características principales incluyen:
Fortalezas: Facilidad de uso, soporte multilingüe amplio, bajo consumo de memoria
Limitaciones: Menor precisión en documentos complejos, opciones de configuración limitadas
Caso de uso ideal: Prototipado rápido y aplicaciones con restricciones de memoria
+
PaddleOCR
+
PaddleOCR es el sistema OCR desarrollado por Baidu como parte del ecosistema PaddlePaddle (2024). La versión PP-OCRv5, utilizada en este trabajo, representa el estado del arte en OCR industrial:
+
Arquitectura:
- Detector: DB (Differentiable Binarization) con backbone ResNet (Liao et al., 2020)
+
+Tabla 1.Hiperparámetros configurables de PaddleOCR.
+
Parámetro
Descripción
Valor por defecto
text_det_thresh
Umbral de detección de píxeles
0.3
text_det_box_thresh
Umbral de caja de detección
0.6
text_det_unclip_ratio
Coeficiente de expansión
1.5
text_rec_score_thresh
Umbral de confianza de reconocimiento
0.5
use_textline_orientation
Clasificación de orientación
False
use_doc_orientation_classify
Clasificación de orientación de documento
False
use_doc_unwarping
Corrección de deformación
False
+Fuente: Documentación oficial de PaddleOCR (PaddlePaddle, 2024).
+
Fortalezas: Alta precisión, pipeline altamente configurable, modelos específicos para servidor
Limitaciones: Mayor complejidad de configuración, dependencia del framework PaddlePaddle
+
DocTR
+
DocTR (Document Text Recognition) es una biblioteca desarrollada por Mindee (2021) orientada a la investigación:
+
Arquitectura:
- Detectores: DB, LinkNet
+
- Reconocedores: CRNN, SAR, ViTSTR
+
Fortalezas: API limpia, orientación académica, salida estructurada de alto nivel
Limitaciones: Menor rendimiento en español comparado con PaddleOCR
+
Comparativa de Arquitecturas
+Tabla 2.Comparativa de soluciones OCR de código abierto.
+
Modelo
Tipo
Componentes
Fortalezas Clave
EasyOCR
End-to-end (det + rec)
CRAFT + CRNN/Transformer
Ligero, fácil de usar, multilingüe
PaddleOCR
End-to-end (det + rec + cls)
DB + SVTR/CRNN
Soporte multilingüe robusto, configurable
DocTR
End-to-end (det + rec)
DB/LinkNet + CRNN/SAR/ViTSTR
Orientado a investigación, API limpia
+Fuente: Documentación oficial de cada herramienta (JaidedAI, 2020; PaddlePaddle, 2024; Mindee, 2021).
+
Optimización de Hiperparámetros
+
Fundamentos
+
La optimización de hiperparámetros (HPO) busca encontrar la configuración de parámetros que maximiza (o minimiza) una métrica objetivo (Feurer & Hutter, 2019). A diferencia de los parámetros del modelo (pesos), los hiperparámetros no se aprenden durante el entrenamiento.
+
Los métodos de HPO incluyen:
+
Grid Search: Búsqueda exhaustiva en una rejilla predefinida
Random Search: Muestreo aleatorio del espacio de búsqueda (Bergstra & Bengio, 2012)
Bayesian Optimization: Modelado probabilístico de la función objetivo (Bergstra et al., 2011)
Algoritmos evolutivos: Optimización inspirada en evolución biológica
+
Ray Tune y Optuna
+Ray Tune es un framework de optimización de hiperparámetros escalable (Liaw et al., 2018) que permite:
+
Ejecución paralela de experimentos
Early stopping de configuraciones poco prometedoras
Integración con múltiples algoritmos de búsqueda
+Optuna es una biblioteca de optimización bayesiana (Akiba et al., 2019) que implementa:
+
Tree-structured Parzen Estimator (TPE)
Pruning de trials no prometedores
Visualización de resultados
+
La combinación Ray Tune + Optuna permite búsquedas eficientes en espacios de alta dimensionalidad.
+`mermaid
+
flowchart TD
+
subgraph "Ray Tune"
+
A["Espacio de búsqueda"]
+
B["Scheduler (gestión de trials)"]
+
C["Trial 1"]
+
D["Trial 2"]
+
E["Trial N"]
+
end
+
subgraph "Optuna (TPE)"
+
F["Modelo probabilístico de la función objetivo"]
+
G["Sugiere nueva configuración"]
+
end
+
subgraph "Evaluación"
+
H["Ejecuta modelo OCR con config"]
+
I["Calcula métricas (CER, WER)"]
+
end
+
A --> B
+
B --> C & D & E
+
C & D & E --> H
+
H --> I
+
I -->|"Resultados"| F
+
F --> G
+
G -->|"Nueva config"| B
+
style A fill:#fff3e0
+
style I fill:#e8f5e9
+``
+Figura 2. Arquitectura de optimización de hiperparámetros con Ray Tune y Optuna.
+
HPO en Sistemas OCR
+
La aplicación de HPO a sistemas OCR ha sido explorada principalmente en el contexto de:
+
Preprocesamiento de imagen: Optimización de parámetros de binarización, filtrado y escalado (Liang et al., 2005)
+
Arquitecturas de detección: Ajuste de umbrales de confianza y NMS (Non-Maximum Suppression)
+
Post-procesamiento: Optimización de corrección ortográfica y modelos de lenguaje
+
Sin embargo, existe un vacío en la literatura respecto a la optimización sistemática de los hiperparámetros de inferencia en pipelines OCR modernos como PaddleOCR, especialmente para idiomas diferentes del inglés y chino.
+
Datasets y Benchmarks para Español
+
Los principales recursos para evaluación de OCR en español incluyen:
+
FUNSD-ES: Versión en español del dataset de formularios
MLT (ICDAR): Multi-Language Text dataset con muestras en español
Documentos académicos: Utilizados en este trabajo (instrucciones TFE de UNIR)
+
Los trabajos previos en OCR para español se han centrado principalmente en:
+
Digitalización de archivos históricos (manuscritos coloniales)
Procesamiento de documentos de identidad
Reconocimiento de texto en escenas naturales
+
La optimización de hiperparámetros para documentos académicos en español representa una contribución original de este trabajo.
+
2.3. Conclusiones
+
Este capítulo ha presentado:
+
Los fundamentos del OCR moderno y su pipeline de detección-reconocimiento
Las tres principales soluciones de código abierto: EasyOCR, PaddleOCR y DocTR
Los métodos de optimización de hiperparámetros, con énfasis en Ray Tune y Optuna
Las particularidades del OCR para el idioma español
+
El estado del arte revela que, si bien existen soluciones OCR de alta calidad, su optimización para dominios específicos mediante ajuste de hiperparámetros (sin fine-tuning) ha recibido poca atención. Este trabajo contribuye a llenar ese vacío proponiendo una metodología reproducible para la optimización de PaddleOCR en documentos académicos en español.
+
+
3. Objetivos concretos y metodología de trabajo
+
Este capítulo establece los objetivos del trabajo siguiendo la metodología SMART (Doran, 1981) y describe la metodología experimental empleada para alcanzarlos. Se define un objetivo general y cinco objetivos específicos, todos ellos medibles y verificables.
+
3.1. Objetivo general
+
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.
+
Justificación SMART del Objetivo General
+
Criterio
Cumplimiento
Específico (S)
Se define claramente qué se quiere lograr: optimizar PaddleOCR mediante ajuste de hiperparámetros para documentos en español
Medible (M)
Se establece una métrica cuantificable: CER < 2%
Alcanzable (A)
Es viable dado que: (1) PaddleOCR permite configuración de hiperparámetros, (2) Ray Tune posibilita búsqueda automatizada, (3) No se requiere GPU
Relevante (R)
El impacto es demostrable: mejora la extracción de texto en documentos académicos sin costes adicionales de infraestructura
Temporal (T)
El plazo es un cuatrimestre, correspondiente al TFM
+
3.2. Objetivos específicos
+
OE1: Comparar soluciones OCR de código abierto
+
Evaluar el rendimiento base de EasyOCR, PaddleOCR y DocTR en documentos académicos en español, utilizando CER y WER como métricas, para seleccionar el modelo más prometedor.
+
OE2: Preparar un dataset de evaluación
+
Construir un dataset estructurado de imágenes de documentos académicos en español con su texto de referencia (ground truth) extraído del PDF original.
+
OE3: Identificar hiperparámetros críticos
+
Analizar la correlación entre los hiperparámetros de PaddleOCR y las métricas de error para identificar los parámetros con mayor impacto en el rendimiento.
+
OE4: Optimizar hiperparámetros con Ray Tune
+
Ejecutar una búsqueda automatizada de hiperparámetros utilizando Ray Tune con Optuna, evaluando al menos 50 configuraciones diferentes.
+
OE5: Validar la configuración optimizada
+
Comparar el rendimiento de la configuración baseline versus la configuración optimizada sobre el dataset completo, documentando la mejora obtenida.
+
3.3. Metodología del trabajo
+
3.3.1. Visión General
+
``mermaid
+
flowchart TD
+
A["Fase 1: Preparación del Dataset
+
• Conversión PDF → Imágenes (300 DPI)
+
• Extracción de texto de referencia (PyMuPDF)
+
• Estructura: carpetas img/ y txt/ pareadas"]
+
B["Fase 2: Benchmark Comparativo
+
• Evaluación de EasyOCR, PaddleOCR, DocTR
+
• Métricas: CER, WER
+
• Selección del modelo base"]
+
C["Fase 3: Definición del Espacio de Búsqueda
+
• Identificación de hiperparámetros configurables
+
• Definición de rangos y distribuciones
+
• Configuración de Ray Tune + Optuna"]
+
D["Fase 4: Optimización de Hiperparámetros
+
• Ejecución de 64 trials con Ray Tune
+
• Paralelización (2 trials concurrentes)
+
• Registro de métricas y configuraciones"]
+
E["Fase 5: Validación y Análisis
+
• Comparación baseline vs optimizado
+
• Análisis de correlaciones
+
• Documentación de resultados"]
+
A --> B --> C --> D --> E
+`
+
3.3.2. Fase 1: Preparación del Dataset
+
Fuente de Datos
+
Se utilizaron documentos PDF académicos de UNIR (Universidad Internacional de La Rioja), específicamente las instrucciones para la elaboración del TFE del Máster en Inteligencia Artificial.
+
Proceso de Conversión
+
El script
prepare_dataset.ipynb implementa:
+
Conversión PDF a imágenes:
- Biblioteca: PyMuPDF (fitz)
+
- Resolución: 300 DPI
+
- Formato de salida: PNG
+
Extracción de texto de referencia:
- Método: page.get_text("dict") de PyMuPDF
+
- Preservación de estructura de líneas
+
- Tratamiento de texto vertical/marginal
+
- Normalización de espacios y saltos de línea
+
Estructura del Dataset
+`mermaid
+
flowchart LR
+
dataset["dataset/"] --> d0["0/"]
+
d0 --> pdf["instrucciones.pdf"]
+
d0 --> img["img/"]
+
img --> img1["page_0001.png"]
+
img --> img2["page_0002.png"]
+
img --> imgN["..."]
+
d0 --> txt["txt/"]
+
txt --> txt1["page_0001.txt"]
+
txt --> txt2["page_0002.txt"]
+
txt --> txtN["..."]
+
dataset --> dots["..."]
+`
+
Clase ImageTextDataset
+
Se implementó una clase Python para cargar pares imagen-texto:
+`python
+
class ImageTextDataset:
+
def __init__(self, root):
+
# Carga pares (imagen, texto) de carpetas pareadas
Debido a incompatibilidades entre Ray y PaddleOCR en el mismo proceso, se implementó una arquitectura basada en subprocesos:
+`mermaid
+
flowchart LR
+
A["Ray Tune (proceso principal)"]
+
A --> B["Subprocess 1: paddle_ocr_tuning.py --config"]
+
B --> B_out["Retorna JSON con métricas"]
+
A --> C["Subprocess 2: paddle_ocr_tuning.py --config"]
+
C --> C_out["Retorna JSON con métricas"]
+`
+
Script de Evaluación (paddle_ocr_tuning.py)
+
El script recibe hiperparámetros por línea de comandos:
+`bash
+
python paddle_ocr_tuning.py \
+
--pdf-folder ./dataset \
+
--textline-orientation True \
+
--text-det-box-thresh 0.5 \
+
--text-det-thresh 0.4 \
+
--text-rec-score-thresh 0.6
+`
+
Y retorna métricas en formato JSON:
+`json
+{
+
"CER": 0.0125,
+
"WER": 0.1040,
+
"TIME": 331.09,
+
"PAGES": 5,
+
"TIME_PER_PAGE": 66.12
+
}
+`
+
3.3.6. Fase 5: Validación
+
Protocolo de Validación
+
Baseline: Ejecución con configuración por defecto de PaddleOCR
Optimizado: Ejecución con mejor configuración encontrada
Comparación: Evaluación sobre las 24 páginas del dataset completo
Métricas reportadas: CER, WER, tiempo de procesamiento
+
3.3.7. Entorno de Ejecución
+
Hardware
+
Componente
Especificación
CPU
Intel Core (especificar modelo)
RAM
16 GB
GPU
No disponible (ejecución en CPU)
Almacenamiento
SSD
+
Software
+
Componente
Versión
Sistema Operativo
Windows 10/11
Python
3.11.9
PaddleOCR
3.3.2
PaddlePaddle
3.2.2
Ray
2.52.1
Optuna
4.6.0
+
3.3.8. Limitaciones Metodológicas
+
Tamaño del dataset: El dataset contiene 24 páginas de un único tipo de documento. Resultados pueden no generalizar a otros formatos.
+
Ejecución en CPU: Los tiempos de procesamiento (~70s/página) serían significativamente menores con GPU.
+
Ground truth imperfecto: El texto de referencia extraído de PDF puede contener errores en documentos con layouts complejos.
+
Parámetro fijo:
text_det_unclip_ratio` quedó fijado en 0.0 durante todo el experimento por decisión de diseño inicial.
+
3.4. Resumen del capítulo
+
Este capítulo ha establecido:
+
Un objetivo general SMART: alcanzar CER < 2% mediante optimización de hiperparámetros
Cinco objetivos específicos medibles y alcanzables
Una metodología experimental en cinco fases claramente definidas
El espacio de búsqueda de hiperparámetros y la configuración de Ray Tune
Las limitaciones reconocidas del enfoque
+
El siguiente capítulo presenta el desarrollo específico de la contribución, incluyendo el benchmark comparativo de soluciones OCR, la optimización de hiperparámetros y el análisis de resultados.
+
+
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, desarrollo de la comparativa, y discusión y análisis de resultados.
+
4.1. Planteamiento de la comparativa
+
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/.
+Tabla 3.Características del dataset de evaluación.
+
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
+Fuente: Elaboración propia.
+
Configuración de los Modelos
+
Según el código en ocr_benchmark_notebook.ipynb:
+EasyOCR:
+
``python
+
easyocr_reader = easyocr.Reader(['es', 'en']) # Spanish and English
results/ai_ocr_benchmark_finetune_results_20251206_113206.csv, se obtienen los siguientes resultados de PaddleOCR para las páginas 5-9 del documento:
+Tabla 4.Resultados de PaddleOCR por página (benchmark inicial).
+
ocr_benchmark_notebook.ipynb, los tres modelos evaluados representan diferentes paradigmas de OCR:
+Tabla 5.Comparativa de arquitecturas OCR evaluadas.
+
+Fuente: Documentación oficial de cada herramienta (JaidedAI, 2020; PaddlePaddle, 2024; Mindee, 2021).
+
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óon en lugar de titulación (carácter duplicado)Apa en lugar de APA (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
+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:
+Tabla 6.Entorno de ejecución del experimento.
+
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)
+Fuente: Outputs del notebook src/paddle_ocr_fine_tune_unir_raytune.ipynb.
+
Dataset
+
Se utilizó un dataset estructurado en
src/dataset/ creado mediante el notebook src/prepare_dataset.ipynb:
+
Estructura: Carpetas con subcarpetas
img/ y txt/ pareadas
Páginas evaluadas por trial: 5 (páginas 5-10 del documento)
Gestión de datos: Clase
ImageTextDataset en src/dataset_manager.py
+
Espacio de Búsqueda
+
Según el código del notebook, se definió el siguiente espacio de búsqueda:
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:
+Tabla 8.Impacto del parámetro textline_orientation en las métricas de error.
+
textline_orientation
CER Medio
WER Medio
True
~3.76%
~12.73%
False
~12.40%
~21.71%
+Fuente: Análisis del notebook src/paddle_ocr_fine_tune_unir_raytune.ipynb.
+Interpretación:
+
El CER medio es ~3.3x menor con
textline_orientation=True (3.76% vs 12.40%). Además, la varianza es mucho menor, lo que indica resultados más consistentes. Para documentos en español con layouts mixtos (tablas, encabezados, direcciones), la clasificación de orientación ayuda a PaddleOCR a ordenar correctamente las líneas de texto.
+`mermaid
+
Del análisis final del notebook ejecutando sobre las 24 páginas:
+Tabla 9.Comparación baseline vs configuración optimizada (24 páginas).
+
Modelo
CER
WER
PaddleOCR (Baseline)
7.78%
14.94%
PaddleOCR-HyperAdjust
1.49%
7.62%
+Fuente: Ejecución final en notebook src/paddle_ocr_fine_tune_unir_raytune.ipynb.
+
Métricas de Mejora
+Tabla 10.Análisis de la mejora obtenida.
+
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%
+Fuente: Elaboración propia a partir de los resultados experimentales.
+
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%."
+`mermaid
+
%%{init: {'theme': 'base'}}%%
+
xychart-beta
+
title "Comparación Baseline vs Optimizado (24 páginas)"
+
x-axis ["CER", "WER"]
+
y-axis "Tasa de error (%)" 0 --> 16
+
bar "Baseline" [7.78, 14.94]
+
bar "Optimizado" [1.49, 7.62]
+`
+Figura 4. Comparación de métricas de error entre configuración baseline y optimizada.
+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=True es crítico (reduce CER ~70%)
+
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:
+
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
+`python
+
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=True es 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_thresh presenta 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_ratio permaneció 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:
use_doc_orientation_classify o use_doc_unwarping para 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:
+
Este capítulo resume las principales conclusiones del trabajo, evalúa el grado de cumplimiento de los objetivos planteados y propone líneas de trabajo futuro que permitirían ampliar y profundizar los resultados obtenidos.
+
5.1. Conclusiones
+
5.1.1. Conclusiones Generales
+
Este Trabajo Fin de Máster ha demostrado que es posible mejorar significativamente el rendimiento de sistemas OCR preentrenados mediante optimización sistemática de hiperparámetros, sin requerir fine-tuning ni recursos GPU dedicados.
+
El objetivo principal del trabajo era alcanzar un CER inferior al 2% en documentos académicos en español. Los resultados obtenidos confirman el cumplimiento de este objetivo:
+
Métrica
Objetivo
Resultado
CER
< 2%
1.49%
+
5.1.2. Conclusiones Específicas
+Respecto a OE1 (Comparativa de soluciones OCR):
+
Se evaluaron tres soluciones OCR de código abierto: EasyOCR, PaddleOCR (PP-OCRv5) y DocTR
PaddleOCR demostró el mejor rendimiento base para documentos en español
La configurabilidad del pipeline de PaddleOCR lo hace idóneo para optimización
+Respecto a OE2 (Preparación del dataset):
+
Se construyó un dataset estructurado con 24 páginas de documentos académicos
La clase ImageTextDataset facilita la carga de pares imagen-texto
El ground truth se extrajo automáticamente del PDF mediante PyMuPDF
+Respecto a OE3 (Identificación de hiperparámetros críticos):
+
El parámetro textline_orientation es el más influyente: reduce el CER en un 69.7% cuando está habilitado
El umbral text_det_thresh presenta la correlación más fuerte (-0.52) con el CER
Los parámetros de corrección de documento (use_doc_orientation_classify, use_doc_unwarping) no aportan mejora en documentos digitales
+Respecto a OE4 (Optimización con Ray Tune):
+
Se ejecutaron 64 trials con el algoritmo OptunaSearch
El tiempo total del experimento fue aproximadamente 6 horas (en CPU)
La arquitectura basada en subprocesos permitió superar incompatibilidades entre Ray y PaddleOCR
+Respecto a OE5 (Validación de la configuración):
+
Se validó la configuración óptima sobre el dataset completo de 24 páginas
La mejora obtenida fue del 80.9% en reducción del CER (7.78% → 1.49%)
La precisión de caracteres alcanzó el 98.51%
+
5.1.3. Hallazgos Clave
+
Arquitectura sobre umbrales: Un único parámetro booleano (textline_orientation) tiene más impacto que todos los umbrales continuos combinados.
Simplicidad para documentos digitales: Para documentos PDF digitales (no escaneados), los módulos de corrección de orientación y deformación son innecesarios.
+
Optimización sin fine-tuning: Se puede mejorar significativamente el rendimiento de modelos preentrenados mediante ajuste de hiperparámetros de inferencia.
+
5.1.4. Contribuciones del Trabajo
+
Metodología reproducible: Se documenta un proceso completo de optimización de hiperparámetros OCR con Ray Tune + Optuna.
+
Análisis de hiperparámetros de PaddleOCR: Se cuantifica el impacto de cada parámetro configurable mediante correlaciones y análisis comparativo.
+
Configuración óptima para español: Se proporciona una configuración validada para documentos académicos en español.
+
Código fuente: Todo el código está disponible en el repositorio GitHub para reproducción y extensión.
+
5.1.5. Limitaciones del Trabajo
+
Tipo de documento único: Los experimentos se realizaron únicamente sobre documentos académicos de UNIR. La generalización a otros tipos de documentos requiere validación adicional.
+
Tamaño del dataset: 24 páginas es un corpus limitado para conclusiones estadísticamente robustas.
+
Ground truth automático: La extracción automática del texto de referencia puede introducir errores en layouts complejos.
+
Ejecución en CPU: Los tiempos de procesamiento (~69s/página) limitan la aplicabilidad en escenarios de alto volumen.
+
Parámetro no explorado: text_det_unclip_ratio permaneció fijo en 0.0 durante todo el experimento.
+
5.2. Líneas de trabajo futuro
+
5.2.1. Extensiones Inmediatas
+
Validación cruzada: Evaluar la configuración óptima en otros tipos de documentos en español (facturas, formularios, textos manuscritos).
+
Exploración de text_det_unclip_ratio: Incluir este parámetro en el espacio de búsqueda.
+
Dataset ampliado: Construir un corpus más amplio y diverso de documentos en español.
+
Evaluación con GPU: Medir tiempos de inferencia con aceleración GPU.
+
5.2.2. Líneas de Investigación
+
Transfer learning de hiperparámetros: Investigar si las configuraciones óptimas para un tipo de documento transfieren a otros dominios.
+
Optimización multi-objetivo: Considerar simultáneamente CER, WER y tiempo de inferencia como objetivos.
+
AutoML para OCR: Aplicar técnicas de AutoML más avanzadas (Neural Architecture Search, meta-learning).
+
Comparación con fine-tuning: Cuantificar la brecha de rendimiento entre optimización de hiperparámetros y fine-tuning real.
+
5.2.3. Aplicaciones Prácticas
+
Herramienta de configuración automática: Desarrollar una herramienta que determine automáticamente la configuración óptima para un nuevo tipo de documento.
+
Integración en pipelines de producción: Implementar la configuración optimizada en sistemas reales de procesamiento documental.
+
Benchmark público: Publicar un benchmark de OCR para documentos en español que facilite la comparación de soluciones.
+
5.2.4. Reflexión Final
+
Este trabajo demuestra que, en un contexto de recursos limitados donde el fine-tuning de modelos de deep learning no es viable, la optimización de hiperparámetros representa una alternativa práctica y efectiva para mejorar sistemas OCR.
+
La metodología propuesta es reproducible, los resultados son cuantificables, y las conclusiones son aplicables a escenarios reales de procesamiento documental. La reducción del CER del 7.78% al 1.49% representa una mejora sustancial que puede tener impacto directo en aplicaciones downstream como extracción de información, análisis semántico y búsqueda de documentos.
+
El código fuente y los datos experimentales están disponibles públicamente para facilitar la reproducción y extensión de este trabajo.
+
+
Referencias bibliográficas {.unnumbered}
+
Akiba, T., Sano, S., Yanase, T., Ohta, T., & Koyama, M. (2019). Optuna: A next-generation hyperparameter optimization framework. Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining, 2623-2631. https://doi.org/10.1145/3292500.3330701
+
Baek, Y., Lee, B., Han, D., Yun, S., & Lee, H. (2019). Character region awareness for text detection. Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition, 9365-9374. https://doi.org/10.1109/CVPR.2019.00959
+
Bergstra, J., & Bengio, Y. (2012). Random search for hyper-parameter optimization. Journal of Machine Learning Research, 13(1), 281-305. https://jmlr.org/papers/v13/bergstra12a.html
+
Bergstra, J., Bardenet, R., Bengio, Y., & Kégl, B. (2011). Algorithms for hyper-parameter optimization. Advances in Neural Information Processing Systems, 24, 2546-2554. https://papers.nips.cc/paper/2011/hash/86e8f7ab32cfd12577bc2619bc635690-Abstract.html
+
Cohen, J. (1988). Statistical power analysis for the behavioral sciences (2nd ed.). Lawrence Erlbaum Associates.
+
Doran, G. T. (1981). There's a S.M.A.R.T. way to write management's goals and objectives. Management Review, 70(11), 35-36.
+
Du, Y., Li, C., Guo, R., Yin, X., Liu, W., Zhou, J., Bai, Y., Yu, Z., Yang, Y., Dang, Q., & Wang, H. (2020). PP-OCR: A practical ultra lightweight OCR system. arXiv preprint arXiv:2009.09941. https://arxiv.org/abs/2009.09941
+
Du, Y., Li, C., Guo, R., Cui, C., Liu, W., Zhou, J., Lu, B., Yang, Y., Liu, Q., Hu, X., Yu, D., & Wang, H. (2023). PP-OCRv4: Mobile scene text detection and recognition. arXiv preprint arXiv:2310.05930. https://arxiv.org/abs/2310.05930
+
Feurer, M., & Hutter, F. (2019). Hyperparameter optimization. In F. Hutter, L. Kotthoff, & J. Vanschoren (Eds.), Automated machine learning: Methods, systems, challenges (pp. 3-33). Springer. https://doi.org/10.1007/978-3-030-05318-5_1
+
He, P., Huang, W., Qiao, Y., Loy, C. C., & Tang, X. (2016). Reading scene text in deep convolutional sequences. Proceedings of the AAAI Conference on Artificial Intelligence, 30(1), 3501-3508. https://doi.org/10.1609/aaai.v30i1.10291
Liang, J., Doermann, D., & Li, H. (2005). Camera-based analysis of text and documents: A survey. International Journal of Document Analysis and Recognition, 7(2), 84-104. https://doi.org/10.1007/s10032-004-0138-z
+
Liao, M., Wan, Z., Yao, C., Chen, K., & Bai, X. (2020). Real-time scene text detection with differentiable binarization. Proceedings of the AAAI Conference on Artificial Intelligence, 34(07), 11474-11481. https://doi.org/10.1609/aaai.v34i07.6812
+
Liaw, R., Liang, E., Nishihara, R., Moritz, P., Gonzalez, J. E., & Stoica, I. (2018). Tune: A research platform for distributed model selection and training. arXiv preprint arXiv:1807.05118. https://arxiv.org/abs/1807.05118
+
Mindee. (2021). DocTR: Document Text Recognition. GitHub. https://github.com/mindee/doctr
+
Moritz, P., Nishihara, R., Wang, S., Tumanov, A., Liaw, R., Liang, E., Elibol, M., Yang, Z., Paul, W., Jordan, M. I., & Stoica, I. (2018). Ray: A distributed framework for emerging AI applications. 13th USENIX Symposium on Operating Systems Design and Implementation (OSDI 18), 561-577. https://www.usenix.org/conference/osdi18/presentation/moritz
+
Morris, A. C., Maier, V., & Green, P. D. (2004). From WER and RIL to MER and WIL: Improved evaluation measures for connected speech recognition. Eighth International Conference on Spoken Language Processing. https://doi.org/10.21437/Interspeech.2004-668
+
PaddlePaddle. (2024). PaddleOCR: Awesome multilingual OCR toolkits based on PaddlePaddle. GitHub. https://github.com/PaddlePaddle/PaddleOCR
+
Pearson, K. (1895). Notes on regression and inheritance in the case of two parents. Proceedings of the Royal Society of London, 58, 240-242. https://doi.org/10.1098/rspl.1895.0041
Shi, B., Bai, X., & Yao, C. (2016). An end-to-end trainable neural network for image-based sequence recognition and its application to scene text recognition. IEEE Transactions on Pattern Analysis and Machine Intelligence, 39(11), 2298-2304. https://doi.org/10.1109/TPAMI.2016.2646371
+
Smith, R. (2007). An overview of the Tesseract OCR engine. Ninth International Conference on Document Analysis and Recognition (ICDAR 2007), 2, 629-633. https://doi.org/10.1109/ICDAR.2007.4376991
+
Zhou, X., Yao, C., Wen, H., Wang, Y., Zhou, S., He, W., & Liang, J. (2017). EAST: An efficient and accurate scene text detector. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, 5551-5560. https://doi.org/10.1109/CVPR.2017.283
+
Zoph, B., & Le, Q. V. (2017). Neural architecture search with reinforcement learning. International Conference on Learning Representations (ICLR). https://arxiv.org/abs/1611.01578
+
+
Anexo A. Código fuente y datos analizados {.unnumbered}
+
A.1 Repositorio del Proyecto
+
El código fuente completo y los datos utilizados en este trabajo están disponibles en el siguiente repositorio:
+URL del repositorio: https://github.com/seryus/MastersThesis
+
El repositorio incluye:
+
Notebooks de experimentación: Código completo de los experimentos realizados
Scripts de evaluación: Herramientas para evaluar modelos OCR
Dataset: Imágenes y textos de referencia utilizados
Resultados: Archivos CSV con los resultados de los 64 trials de Ray Tune
+
A.2 Estructura del Repositorio
+
``
+
MastersThesis/
+
├── docs/ # Capítulos de la tesis en Markdown
+
├── 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/ # Instrucciones y plantilla UNIR
+
└── README.md
+`
+
A.3 Requisitos de Software
+
Para reproducir los experimentos se requieren las siguientes dependencias:
+
Componente
Versión
Python
3.11.9
PaddlePaddle
3.2.2
PaddleOCR
3.3.2
Ray
2.52.1
Optuna
4.6.0
jiwer
(última versión)
PyMuPDF
(última versión)
+
A.4 Instrucciones de Ejecución
+
Clonar el repositorio
Instalar dependencias:
pip install -r requirements.txt
Ejecutar el notebook
src/paddle_ocr_fine_tune_unir_raytune.ipynb`
+
A.5 Licencia
+
El código se distribuye bajo licencia MIT.
+
\ No newline at end of file
diff --git a/thesis_output_files/colorschememapping.xml b/thesis_output_files/colorschememapping.xml
new file mode 100644
index 0000000..b200daa
--- /dev/null
+++ b/thesis_output_files/colorschememapping.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/thesis_output_files/filelist.xml b/thesis_output_files/filelist.xml
new file mode 100644
index 0000000..66d2f53
--- /dev/null
+++ b/thesis_output_files/filelist.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/thesis_output_files/header.htm b/thesis_output_files/header.htm
new file mode 100644
index 0000000..e7ef847
--- /dev/null
+++ b/thesis_output_files/header.htm
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Sergio
+Jimnez Jimnez
+
+
Optimizacin
+de Hiperparmetros OCR con Ray Tune para Documentos Acadmicos en Espaol
+
+
+
+
+
+
+
+
+
+
+
+
13
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/thesis_output_files/image001.png b/thesis_output_files/image001.png
new file mode 100644
index 0000000..8d8942b
Binary files /dev/null and b/thesis_output_files/image001.png differ
diff --git a/thesis_output_files/image002.gif b/thesis_output_files/image002.gif
new file mode 100644
index 0000000..ab5c01f
Binary files /dev/null and b/thesis_output_files/image002.gif differ
diff --git a/thesis_output_files/image003.png b/thesis_output_files/image003.png
new file mode 100644
index 0000000..da81321
Binary files /dev/null and b/thesis_output_files/image003.png differ
diff --git a/thesis_output_files/image004.jpg b/thesis_output_files/image004.jpg
new file mode 100644
index 0000000..611d78b
Binary files /dev/null and b/thesis_output_files/image004.jpg differ
diff --git a/thesis_output_files/image005.png b/thesis_output_files/image005.png
new file mode 100644
index 0000000..6a3daf4
Binary files /dev/null and b/thesis_output_files/image005.png differ
diff --git a/thesis_output_files/image006.gif b/thesis_output_files/image006.gif
new file mode 100644
index 0000000..eba1d96
Binary files /dev/null and b/thesis_output_files/image006.gif differ
diff --git a/thesis_output_files/item0001.xml b/thesis_output_files/item0001.xml
new file mode 100644
index 0000000..26bed88
--- /dev/null
+++ b/thesis_output_files/item0001.xml
@@ -0,0 +1,258 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This value indicates the number of saves or revisions. The application is responsible for updating this value after each revision.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/thesis_output_files/item0003.xml b/thesis_output_files/item0003.xml
new file mode 100644
index 0000000..17bc8dd
--- /dev/null
+++ b/thesis_output_files/item0003.xml
@@ -0,0 +1 @@
+Dor81JournalArticle{D7C468B5-5E32-4254-9330-6DB2DDB01037}There's a S.M.A.R.T. way to write management's goals and objectives1981DoranG.T.Management Review (AMA FORUM)35-36701
\ No newline at end of file
diff --git a/thesis_output_files/item0005.xml b/thesis_output_files/item0005.xml
new file mode 100644
index 0000000..ce42a91
--- /dev/null
+++ b/thesis_output_files/item0005.xml
@@ -0,0 +1 @@
+<_Flow_SignoffStatus xmlns="27c1adeb-3674-457c-b08c-8a73f31b6e23" xsi:nil="true"/>
\ No newline at end of file
diff --git a/thesis_output_files/item0007.xml b/thesis_output_files/item0007.xml
new file mode 100644
index 0000000..607faca
--- /dev/null
+++ b/thesis_output_files/item0007.xml
@@ -0,0 +1 @@
+DocumentLibraryFormDocumentLibraryFormDocumentLibraryForm
\ No newline at end of file
diff --git a/thesis_output_files/props002.xml b/thesis_output_files/props002.xml
new file mode 100644
index 0000000..86b71d3
--- /dev/null
+++ b/thesis_output_files/props002.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/thesis_output_files/props004.xml b/thesis_output_files/props004.xml
new file mode 100644
index 0000000..29b878f
--- /dev/null
+++ b/thesis_output_files/props004.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/thesis_output_files/props006.xml b/thesis_output_files/props006.xml
new file mode 100644
index 0000000..1ade933
--- /dev/null
+++ b/thesis_output_files/props006.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/thesis_output_files/props008.xml b/thesis_output_files/props008.xml
new file mode 100644
index 0000000..18d4345
--- /dev/null
+++ b/thesis_output_files/props008.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/thesis_output_files/themedata.thmx b/thesis_output_files/themedata.thmx
new file mode 100644
index 0000000..69725bf
Binary files /dev/null and b/thesis_output_files/themedata.thmx differ