paint-brush
AI Framework har du dækket over billed-til-tekst-workflowsved@ritabratamaiti
Ny historie

AI Framework har du dækket over billed-til-tekst-workflows

ved ritabratamaiti5m2024/12/31
Read on Terminal Reader

For langt; At læse

Hvad: Transformer matematiske ligningsbilleder til LaTeX ved hjælp af AnyModals modulære vision-sprog-pipeline. Hvordan: Brug fortrænede vægte til hurtig slutning eller træne en tilpasset model med dit eget datasæt. Hvor: Find fulde eksempler, kode og modelvægte på GitHub og Hugging Face. Hvorfor: Integrer nemt flere AI-komponenter (vision + tekst) uden at skrive omfattende brokode.
featured image - AI Framework har du dækket over billed-til-tekst-workflows
ritabratamaiti HackerNoon profile picture
0-item
1-item

Om AnyModal

AnyModal er en ramme designet til at forene flere "modaliteter" (såsom billeder, tekst eller andre data) i en enkelt sammenhængende arbejdsgang. I stedet for at jonglere med separate biblioteker eller skrive brugerdefineret kode for at bygge bro over vision og sprogmodeller, giver AnyModal en struktureret pipeline, hvor hver komponent - billedkodere, tokenizere, sprogmodeller - kan tilsluttes uden tung tilpasning. Ved at håndtere de underliggende forbindelser mellem disse stykker, lader AnyModal dig fokusere på processen på højt niveau: f.eks. indføje et billede og få et tekstresultat frem.


I praksis kan AnyModal hjælpe med opgaver som billedtekstning, klassificering eller i det tilfælde, der er vist her, LaTeX OCR. Fordi rammeværket er modulopbygget, er det relativt nemt at udskifte en model med en anden (f.eks. en anden synsstruktur eller en ny sprogmodel), hvilket gør den fleksibel til eksperimentering eller specialiserede brugssager.


LaTeX OCR Use Case

Konvertering af et billede af et matematisk udtryk til en gyldig LaTeX-streng kræver bro mellem computersyn og naturlig sprogbehandling. Billedkoderens opgave er at udtrække funktioner eller symbolske mønstre fra ligningen, såsom at genkende "plus", "minus" og andre symboler. Sprogkomponenten bruger derefter disse funktioner til at forudsige de korrekte LaTeX-tokens i rækkefølge.


LaTeX OCR med AnyModal er i bund og grund en demonstration af, hvor hurtigt du kan parre en vision-koder med en sprogmodel. Selvom dette eksempel specifikt omhandler ligninger, kan den overordnede tilgang udvides til andre billed-til-tekst-scenarier, herunder mere avanceret eller specialiseret matematisk notation.


Ved slutningen af denne vejledning vil du vide, hvordan du bruger AnyModal sammen med Llama 3.2 1B og Googles SigLIP til at skabe en lille VLM til LaTeX OCR-opgaver:

Faktisk billedtekst: f ( u ) = u + \sum _ { n = o d d } \alpha _ { n } \left[ \frac { ( u - \pi ) } { \pi } \right] ^ { n } ,Genereret Billedtekst ved hjælp af AnyModal/LaTeX-OCR-Llama-3.2-1B: f ( u ) = u + \sum _ { n = o o d } \alpha _ { n } \left[ \frac { ( u - \pi ) ^ { n } } { \pi } \right],


Bemærk, at vægtene frigivet ved AnyModal/LaTeX-OCR-Llama-3.2-1B opnås ved kun at træne på 20 % af unsloth/LaTeX_OCR-datasæt .


Du vil sandsynligvis få en bedre model ved at træne på hele datasættet og over et større antal epoker.


Eksempel på hurtig slutning

For dem, der primært er interesseret i at generere LaTeX fra eksisterende billeder, er her en demonstration ved hjælp af fortrænede vægte. Dette undgår behovet for at træne alt fra bunden, hvilket giver en hurtig vej til at se AnyModal i aktion. Nedenfor er en kortfattet oversigt over opsætning af dit miljø, download af de nødvendige modeller og kørsel af konklusioner.


Klon AnyModal Repository:

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


Installer de nødvendige biblioteker:

 pip install torch torchvision huggingface_hub PIL


Download derefter fortrænede vægte hostet på Hugging Face Hub:

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


Disse specifikke vægte kan findes her: LaTeX-OCR-Llama-3.2-1B på Hugging Face


Indlæs derefter vision-koderen og sprogmodellen:

 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()


Giv endelig billedet og få LaTeX-output:

 # 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)


Denne enkle sekvens af trin kører hele pipelinen – analyserer billedet, projicerer det ind i sprogmodellens rum og genererer den tilsvarende LaTeX.


Træningsvejledning

For dem, der ønsker mere kontrol, såsom at tilpasse modellen til nye data eller udforske mekanikken i en vision-sprog pipeline, giver træningsprocessen dybere indsigt. Nedenstående afsnit illustrerer, hvordan data udarbejdes, hvordan modellens komponenter integreres, og hvordan de i fællesskab optimeres.


I stedet for at stole på fortrænede komponenter alene, kan du erhverve et træningsdatasæt med parrede billeder og LaTeX-etiketter. Et eksempel er unsloth/LaTeX_OCR -datasættet, som indeholder billeder af ligninger sammen med deres LaTeX-strenge. Efter installation af afhængigheder og opsætning af dit datasæt, omfatter trinene til at træne oprettelse af en datapipeline, initialisering af modellen og loop gennem epoker.


Her er en oversigt over forberedelse af datasættet og indlæsning af det:

 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))))


På dette tidspunkt vil du bygge eller genbruge den samme AnyModal-pipeline som beskrevet tidligere. I stedet for at indlæse fortrænede vægte, ville du initialisere modellen, så den kan lære fra bunden eller fra delvist fortrænede kontrolpunkter.

 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:" )


Du kan derefter oprette en træningsloop for at optimere modellens parametre. En almindelig tilgang bruger PyTorchs AdamW optimizer og anvender eventuelt blandet præcisionstræning for effektivitet:

 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()


Efter hver epoke eller i det mindste når træningen slutter, hjælper evaluering af modellen på et valideringssæt med at sikre, at den generaliserer til nye data:

 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}")


Ud over at bekræfte ydeevnen kan dette valideringstrin guide forbedringer såsom justering af hyperparametre, skift til en anden basismodel eller finpudsning af din dataforbehandling. Ved at følge disse træningstrin får du en bedre forståelse af samspillet mellem vision-koderen og sprogmodellen, og du kan udvide arbejdsgangen til yderligere opgaver eller mere specialiserede domæner.


Yderligere ressourcer