En este tutorial, creamos un flujo de trabajo completo para ejecutar el modelo Unlimited-OCR de Baidu en imágenes de documentos y archivos PDF de varias páginas. Configuramos el entorno de GPU, instalamos las dependencias requeridas, cargamos el modelo de lenguaje de visión de parámetros 3B con selección automática de bfloat16 o float16 y generamos documentos de muestra estructurados para pruebas. Luego evaluamos tanto el modo de inferencia de Gundam en mosaico como el modo Base más rápido para OCR de una sola página antes de extender el proceso al análisis de PDF de varias páginas con PyMuPDF e infer_multi(). A lo largo del flujo de trabajo, preservamos la configuración de generación de contexto largo, los controles de repetición y el manejo estructurado de la salida para procesar diseños densos, tablas, párrafos y contenido de varias páginas en un proceso reproducible de un extremo a otro.
Instalamos las bibliotecas necesarias y preparamos el entorno de Google Colab para la inferencia Unlimited-OCR. Verificamos que haya una GPU habilitada para CUDA disponible y elegimos automáticamente bfloat16 o float16 según la compatibilidad del hardware. Luego cargamos el tokenizador y el modelo de parámetros 3B de Hugging Face, los cambiamos al modo de evaluación y los movemos a la GPU.
“/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf”,
“/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf”,
]: si os.path.exists(ruta): return ImageFont.truetype(ruta, tamaño) return ImageFont.load_default() def make_sample_page(ruta, número de página): W, H = 1240, 1754 img = Image.new(“RGB”, (W, H), “white”) d = ImageDraw.Draw(img) title_f, head_f, body_f = load_font(48), load_font(34), load_font(26) d.text((80, 70), f”Informe de operaciones trimestral – Página {page_no}”, fill=”black”, font=title_f) d.line([(80, 145), (W – 80, 145)]fill=”black”, width=3) body = ( “Este documento demuestra el análisis de un solo ” “horizonte largo de Unlimited-OCR. El modelo lee una página completa (títulos, párrafos, ” “y tablas) y emite texto estructurado en una sola pasada de decodificación. ” “A diferencia de los procesos de OCR clásicos, no se requiere una etapa ” “de análisis de diseño separada”. ) y = 190 para la línea en textwrap.wrap(body, width=72): d.text((80, y), line, fill=”black”, font=body_f) y += 40 y += 30 d.text((80, y), f”Tabla {page_no}: Ingresos regionales (USD, millones)”, fill=”black”, font=head_f) y += 60 filas = [
[“Region”, “Q1”, “Q2”, “Q3”],
[“North”, “12.4”, “13.1”, “15.0”],
[“South”, “9.8”, “10.2”, “11.7”],
[“East”, “14.3”, “13.9”, “16.2”],
[“West”, “11.1”, “12.5”, “12.9”]]col_w, fila_h, x0 = 260, 56, 80 para r, fila en enumerar(filas): para c, celda en enumerar(fila): x = x0 + c * col_w d.rectangle([x, y, x + col_w, y + row_h]contorno=”negro”, ancho=2) d.text((x + 14, y + 12), celda, relleno=”negro”, fuente=body_f) y += fila_h y += 50 pie de página = ( f”Nota {página_no}: Las figuras son ilustrativas. El modo de varias páginas une ” “contexto entre páginas, por lo que las referencias entre páginas permanecen coherentes.” ) para la línea en textwrap.wrap(pie de página, ancho=72): d.text((80, y), line, fill=”black”, font=body_f) y += 40 img.save(path) ruta de retorno IMAGE_PATH = make_sample_page(“inputs/sample_page_1.png”, 1) PAGE_2 = make_sample_page(“inputs/sample_page_2.png”, 2) PAGE_3 = make_sample_page(“inputs/sample_page_3.png”, 3) print(f”>> Páginas de muestra escritas: {IMAGE_PATH}, {PAGE_2}, {PAGE_3}”) import matplotlib.pyplot as plt plt.figure(figsize=(6, 8)) plt.imshow(Image.open(IMAGE_PATH)) plt.axis(“off”) plt.title(“Documento de entrada (página 1)”) plt.show()
Creamos los directorios de entrada y salida necesarios y generamos tres páginas de documentos de muestra realistas con PIL. Agregamos títulos, párrafos, tablas y notas a pie de página para probar el modelo en contenido estructurado y rico en diseño. También obtenemos una vista previa de la primera página generada con Matplotlib antes de enviarla al proceso de OCR.
Ejecutamos OCR de una sola imagen usando el modo Gundam, que combina una vista global del documento con recortes de imágenes en mosaico. Habilitamos crop_mode y utilizamos un tamaño de mosaico más pequeño para preservar el texto fino y mejorar el reconocimiento en diseños de documentos densos. También configuramos controles de repetición y generación de resultados a largo plazo para garantizar que el modelo produzca resultados estables y estructurados.
Procesamos el mismo documento usando el modo Base con una única vista de imagen de 1024 píxeles. Desactivamos el recorte de imágenes para reducir la complejidad de la inferencia y mejorar la velocidad de procesamiento para obtener páginas limpias y claramente impresas. Mantenemos la misma longitud de salida y la misma configuración de control de repetición para comparar directamente el modo Base con el modo Gundam.
para i, página en enumerate(doc): out = os.path.join(tmp_dir, f”page_{i + 1:04d}.png”) page.get_pixmap(matrix=mat).save(out) paths.append(out) doc.close() rutas de retorno SAMPLE_PDF = “inputs/sample_doc.pdf” pdf = fitz.open() para p in [IMAGE_PATH, PAGE_2, PAGE_3]: img_doc = fitz.open(p) rect = img_doc[0].rect pdf_bytes = img_doc.convert_to_pdf() img_pdf = fitz.open(“pdf”, pdf_bytes) page = pdf.new_page(width=rect.width, height=rect.height) page.show_pdf_page(rect, img_pdf, 0) pdf.save(SAMPLE_PDF) pdf.close() print(f”>> PDF de muestra creado: {MUESTRA_PDF}”) page_images = pdf_to_images(SAMPLE_PDF, dpi=300) print(f”>> {len(page_images)} páginas rasterizadas”) model.infer_multi( tokenizer, Prompt=”Análisis de varias páginas.”, image_files=page_images, output_path=”outputs/multi_page”, image_size=1024, max_length=32768, no_repeat_ngram_size=35, ngram_window=1024, save_results=Verdadero,)
Creamos un PDF de tres páginas a partir de las imágenes del documento generado y rasterizamos cada página del PDF en un PNG de alta resolución usando PyMuPDF. Pasamos la secuencia página-imagen resultante a infer_multi() para que el modelo pueda analizar el documento completo en una única operación de inferencia de largo horizonte. También ampliamos la ventana de repetición de n-gramas para mantener una decodificación estable en varias páginas.
print(” ” + “-” * 60) print(“\n”.join(” | ” + ln para ln en vista previa.splitlines())) si len(content) > 1500: print(f” | … [{len(content) – 1500:,} more chars]”) print(” ” + “-” * 60) para out_dir en [“outputs/single_gundam”, “outputs/single_base”, “outputs/multi_page”]: show_outputs(out_dir) print(“”” =============================================================================== HECHO — HOJA DE TRUCOS ===================================================================================== Imagen única, texto denso/pequeño… infer(), gundam (640 + crop_mode=True) Imagen única, impresión limpia ……… infer(), base (1024, crop_mode=False) Varias páginas o PDF …………….. infer_multi(), image_size=1024, ngram_window=1024 Documentos largos……………….. mantenga max_length=32768 y la configuración no_repeat_ngram: evitan la degeneración en salidas largas…. cárguelos a través de la barra lateral de Colab, apunte image_file / pdf_to_images() a ellos. ============================================================================== “””)
Inspeccionamos los directorios de salida creados por las ejecuciones de inferencia de una y varias páginas. Enumeramos todos los archivos generados y mostramos vistas previas de los artefactos de texto, Markdown, MMD y JSON compatibles. Concluimos el flujo de trabajo con una referencia concisa que resume los modos de inferencia recomendados para imágenes densas, páginas limpias y archivos PDF de varias páginas.
En conclusión, completamos un proceso de OCR práctico que maneja tanto documentos de una sola página con mucho detalle como archivos PDF largos de varias páginas dentro de Google Colab. Comparamos los modos de inferencia de Gundam y Base, rasterizamos archivos PDF en imágenes de páginas listas para el modelo, ejecutamos un análisis de documentos a largo plazo e inspeccionamos el texto generado, Markdown y los artefactos auxiliares directamente desde los directorios de salida. También configuramos el flujo de trabajo para adaptarlo a diferentes capacidades de GPU y al mismo tiempo conservamos los parámetros de generación necesarios para una decodificación estable de documentos largos. Nos proporciona una base reutilizable para aplicar Unlimited-OCR a informes, formularios escaneados, documentos técnicos, tablas y otro contenido rico en diseño sin depender de un OCR tradicional independiente y una pila de análisis de diseño.
Consulte el código completo aquí. Además, no dude en seguirnos en Twitter y no olvide unirse a nuestro SubReddit de más de 150.000 ml y suscribirse a nuestro boletín. ¡Esperar! estas en telegrama? Ahora también puedes unirte a nosotros en Telegram.
¿Necesita asociarse con nosotros para promocionar su repositorio de GitHub O su página principal de Hugging O su lanzamiento de producto O seminario web, etc.? Conéctate con nosotros
A Sana Hassan, pasante de consultoría en Marktechpost y estudiante de doble titulación en IIT Madras, le apasiona aplicar la tecnología y la inteligencia artificial para abordar los desafíos del mundo real. Con un gran interés en resolver problemas prácticos, aporta una nueva perspectiva a la intersección de la IA y las soluciones de la vida real.