paint-brush
AI Framework lo tiene cubierto en flujos de trabajo de imagen a textopor@ritabratamaiti
Nueva Historia

AI Framework lo tiene cubierto en flujos de trabajo de imagen a texto

por ritabratamaiti5m2024/12/31
Read on Terminal Reader

Demasiado Largo; Para Leer

Qué: Transforma imágenes de ecuaciones matemáticas en LaTeX usando la secuencia de comandos de visión y lenguaje modular de AnyModal. Cómo: Usa pesos entrenados previamente para una inferencia rápida o entrena un modelo personalizado con tu propio conjunto de datos. Dónde: Encuentra ejemplos completos, código y pesos de modelos en GitHub y Hugging Face. Por qué: Integra fácilmente múltiples componentes de IA (visión + texto) sin escribir un código extenso de conexión.
featured image - AI Framework lo tiene cubierto en flujos de trabajo de imagen a texto
ritabratamaiti HackerNoon profile picture
0-item
1-item

Acerca de AnyModal

AnyModal es un marco diseñado para unificar múltiples “modalidades” (como imágenes, texto u otros datos) en un flujo de trabajo único y coherente. En lugar de hacer malabarismos con bibliotecas separadas o escribir código personalizado para unir los modelos de visión y lenguaje, AnyModal proporciona una secuencia de comandos estructurada donde cada componente (codificadores de imágenes, tokenizadores, modelos de lenguaje) se puede conectar sin necesidad de una personalización excesiva. Al gestionar las conexiones subyacentes entre estas piezas, AnyModal le permite centrarse en el proceso de alto nivel: introducir una imagen, por ejemplo, y obtener un resultado textual.


En la práctica, AnyModal puede ayudar con tareas como subtítulos de imágenes, clasificación o, en el caso que se muestra aquí, reconocimiento óptico de caracteres (OCR) de LaTeX. Debido a que el marco es modular, es relativamente sencillo cambiar un modelo por otro (por ejemplo, una estructura de visión diferente o un nuevo modelo de lenguaje), lo que lo hace flexible para la experimentación o casos de uso especializados.


El caso de uso del OCR de LaTeX

Para convertir una imagen de una expresión matemática en una cadena de caracteres LaTeX válida es necesario combinar la visión artificial y el procesamiento del lenguaje natural. El trabajo del codificador de imágenes es extraer características o patrones simbólicos de la ecuación, como reconocer los símbolos “más”, “menos” y otros. A continuación, el componente de lenguaje utiliza estas características para predecir los tokens LaTeX adecuados en secuencia.


El OCR de LaTeX con AnyModal es, en esencia, una demostración de la rapidez con la que se puede vincular un codificador de visión con un modelo de lenguaje. Si bien este ejemplo aborda específicamente las ecuaciones, el enfoque general se puede extender a otros escenarios de conversión de imágenes a texto, incluida la notación matemática más avanzada o especializada.


Al final de este tutorial, sabrá cómo usar AnyModal, junto con Llama 3.2 1B y SigLIP de Google para crear un pequeño VLM para tareas de OCR LaTeX:

Título real: f ( u ) = u + \sum _ { n = o d d } \alpha _ { n } \left[ \frac { ( u - \pi ) } { \pi } \right] ^ { n }, Título generado usando AnyModal/LaTeX-OCR-Llama-3.2-1B: f ( u ) = u + \sum _ { n = o o d } \alpha _ { n } \left[ \frac { ( u - \pi ) ^ { n } } { \pi } \right],


Tenga en cuenta que los pesos publicados en AnyModal/LaTeX-OCR-Llama-3.2-1B se obtienen entrenando solo el 20 % de conjunto de datos unsloth/LaTeX_OCR .


Probablemente obtendrá un mejor modelo al entrenarlo con todo el conjunto de datos y durante una mayor cantidad de épocas.


Ejemplo de inferencia rápida

Para aquellos interesados principalmente en generar LaTeX a partir de imágenes existentes, aquí hay una demostración con pesos entrenados previamente. Esto evita la necesidad de entrenar nada desde cero y ofrece una ruta rápida para ver AnyModal en acción. A continuación, se incluye una descripción general concisa de cómo configurar su entorno, descargar los modelos necesarios y ejecutar la inferencia.


Clonar el repositorio AnyModal:

 git clone https://github.com/ritabratamaiti/AnyModal.git


Instalar las librerias necesarias:

 pip install torch torchvision huggingface_hub PIL


Luego, descargue las pesas previamente entrenadas alojadas en Hugging Face Hub:

 from huggingface_hub import snapshot_download snapshot_download("AnyModal/Image-Captioning-Llama-3.2-1B", local_dir="latex_ocr_model")


Estos pesos específicos se pueden encontrar aquí: LaTeX-OCR-Llama-3.2-1B en Hugging Face


A continuación, cargue el codificador de visión y el modelo de lenguaje:

 import llm import anymodal import vision from PIL import Image # Load language model and tokenizer tokenizer, model = llm.get_llm("meta-llama/Llama-3.2-1B") # Load vision-related components image_processor, vision_model, vision_hidden_size = vision.get_image_encoder('google/vit-base-patch16-224') vision_encoder = vision.VisionEncoder(vision_model) # Configure the multimodal pipeline multimodal_model = anymodal.MultiModalModel( input_processor=None, input_encoder=vision_encoder, input_tokenizer=vision.Projector(vision_hidden_size, llm.get_hidden_size(tokenizer, model), num_hidden=1), language_tokenizer=tokenizer, language_model=model, prompt_text="The LaTeX expression of the equation in the image is:" ) # Load the pretrained model weights multimodal_model._load_model("latex_ocr_model") multimodal_model.eval()


Finalmente, proporcione la imagen y obtenga la salida LaTeX:

 # Replace with the path to your equation image image_path = "path_to_equation_image.png" image = Image.open(image_path).convert("RGB") processed_image = image_processor(image, return_tensors="pt") processed_image = {k: v.squeeze(0) for k, v in processed_image.items()} latex_output = multimodal_model.generate(processed_image, max_new_tokens=120) print("Generated LaTeX:", latex_output)


Esta simple secuencia de pasos ejecuta todo el proceso: analiza la imagen, la proyecta en el espacio del modelo de lenguaje y genera el LaTeX correspondiente.


Tutorial de formación

Para aquellos que desean un mayor control, como adaptar el modelo a nuevos datos o explorar la mecánica de una secuencia de comandos de visión y lenguaje, el proceso de entrenamiento brinda una visión más profunda. Las secciones siguientes ilustran cómo se preparan los datos, cómo se integran los componentes del modelo y cómo se optimizan en conjunto.


En lugar de depender únicamente de componentes entrenados previamente, puede adquirir un conjunto de datos de entrenamiento de imágenes emparejadas y etiquetas LaTeX. Un ejemplo es el conjunto de datos unsloth/LaTeX_OCR , que contiene imágenes de ecuaciones junto con sus cadenas LaTeX. Después de instalar las dependencias y configurar su conjunto de datos, los pasos para entrenar incluyen la creación de una secuencia de datos, la inicialización del modelo y el recorrido por épocas.


A continuación se muestra un esquema para preparar el conjunto de datos y cargarlo:

 from torch.utils.data import Subset import vision # Load training and validation sets train_dataset = vision.ImageDataset("unsloth/LaTeX_OCR", image_processor, split='train') val_dataset = vision.ImageDataset("unsloth/LaTeX_OCR", image_processor, split='test') # Optionally use a smaller subset for faster iteration subset_ratio = 0.2 train_dataset = Subset(train_dataset, range(int(subset_ratio * len(train_dataset)))) val_dataset = Subset(val_dataset, range(int(subset_ratio * len(val_dataset))))


En este punto, crearía o reutilizaría la misma secuencia de AnyModal descrita anteriormente. En lugar de cargar pesos entrenados previamente, inicializaría el modelo para que pueda aprender desde cero o a partir de puntos de control parcialmente entrenados previamente.

 multimodal_model = anymodal.MultiModalModel( input_processor=None, input_encoder=vision_encoder, input_tokenizer=vision.Projector(vision_hidden_size, llm.get_hidden_size(tokenizer, model), num_hidden=1), language_tokenizer=tokenizer, language_model=model, prompt_text="The LaTeX expression of the equation in the image is:" )


Luego, puede crear un bucle de entrenamiento para optimizar los parámetros del modelo. Un enfoque común utiliza el optimizador AdamW de PyTorch y, opcionalmente, emplea entrenamiento de precisión mixta para lograr eficiencia:

 from tqdm import tqdm import torch optimizer = torch.optim.AdamW(multimodal_model.parameters(), lr=1e-4) scaler = torch.cuda.amp.GradScaler() train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=16, shuffle=True) num_epochs = 5 for epoch in range(num_epochs): for batch_idx, batch in tqdm(enumerate(train_loader), desc=f"Epoch {epoch+1} Training"): optimizer.zero_grad() with torch.cuda.amp.autocast(): logits, loss = multimodal_model(batch) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()


Después de cada época o al menos cuando concluye el entrenamiento, evaluar el modelo en un conjunto de validación ayuda a garantizar que se generalice a nuevos datos:

 val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=16, shuffle=False) for batch_idx, batch in enumerate(val_loader): predictions = multimodal_model.generate(batch['input'], max_new_tokens=120) for idx, prediction in enumerate(predictions): print(f"Actual LaTeX: {batch['text'][idx]}") print(f"Generated LaTeX: {prediction}")


Además de confirmar el rendimiento, este paso de validación puede orientar las mejoras, como ajustar los hiperparámetros, cambiar a un modelo base diferente o refinar el preprocesamiento de los datos. Si sigue estos pasos de capacitación, comprenderá mejor la interacción entre el codificador de visión y el modelo de lenguaje, y podrá ampliar el flujo de trabajo a tareas adicionales o dominios más especializados.


Recursos adicionales

  • Repositorio de GitHub : AnyModal
  • Directorio de proyectos de reconocimiento óptico de caracteres LaTeX : carpeta de GitHub
  • Pesos del modelo entrenado para abrazar la cara : LaTeX-OCR-Llama-3.2-1B
  • Organización de Hugging Face : AnyModal en HF (síguelo para recibir actualizaciones)
  • Comunidad de Reddit : r/AnyModal (para debates, comentarios y soporte de la comunidad)