AnyModal е рамка, предназначена да обедини множество „модалности“ (като изображения, текст или други данни) в единен, съгласуван работен процес. Вместо да жонглира с отделни библиотеки или да пише персонализиран код за свързване на визия и езикови модели, AnyModal предоставя структуриран тръбопровод, където всеки компонент – енкодери на изображения, токенизатори, езикови модели – може да бъде включен без тежко персонализиране. Чрез обработката на основните връзки между тези части AnyModal ви позволява да се съсредоточите върху процеса на високо ниво: подаване на изображение, например, и получаване на текстов резултат.
На практика AnyModal може да помогне със задачи като надписи на изображения, класификация или в случая, показан тук, LaTeX OCR. Тъй като рамката е модулна, сравнително лесно е да се замени един модел с друг (напр. различна визия или нов езиков модел), което я прави гъвкава за експериментиране или специализирани случаи на употреба.
Преобразуването на изображение на математически израз във валиден LaTeX низ изисква свързване на компютърно зрение и обработка на естествен език. Работата на енкодера на изображения е да извлича характеристики или символни модели от уравнението, като разпознаване на „плюс“, „минус“ и други символи. След това езиковият компонент използва тези функции, за да предвиди последователно правилните токени на LaTeX.
LaTeX OCR с AnyModal е по същество демонстрация на това колко бързо можете да сдвоите визуален енкодер с езиков модел. Докато този пример се отнася конкретно до уравнения, общият подход може да бъде разширен към други сценарии за преобразуване на изображение в текст, включително по-усъвършенствани или специализирани математически нотации.
До края на този урок ще знаете как да използвате AnyModal, заедно с Llama 3.2 1B и SigLIP на Google, за да създадете малък VLM за LaTeX OCR задачи:
Имайте предвид, че теглата, публикувани в AnyModal/LaTeX-OCR-Llama-3.2-1B, се получават чрез обучение само на 20% от
Вероятно ще получите по-добър модел чрез обучение върху целия набор от данни и през по-голям брой епохи.
За тези, които се интересуват предимно от генериране на LaTeX от съществуващи изображения, ето демонстрация с използване на предварително обучени тегла. Това избягва необходимостта да се обучава нещо от нулата, предлагайки бърз път да видите AnyModal в действие. По-долу е даден кратък преглед на настройването на вашата среда, изтеглянето на необходимите модели и изпълнението на изводи.
Клонирайте репозитория AnyModal:
git clone https://github.com/ritabratamaiti/AnyModal.git
Инсталирайте необходимите библиотеки:
pip install torch torchvision huggingface_hub PIL
След това изтеглете предварително обучени тежести, хоствани в Hugging Face Hub:
from huggingface_hub import snapshot_download snapshot_download("AnyModal/Image-Captioning-Llama-3.2-1B", local_dir="latex_ocr_model")
Тези специфични тегла могат да бъдат намерени тук: LaTeX-OCR-Llama-3.2-1B на Hugging Face
След това заредете визуалния енкодер и езиковия модел:
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()
Накрая, предоставете изображението и получете изхода на 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)
Тази проста последователност от стъпки управлява целия конвейер – анализиране на изображението, прожектиране в пространството на езиковия модел и генериране на съответния LaTeX.
За тези, които искат повече контрол, като например адаптиране на модела към нови данни или изследване на механиката на тръбопровод на визуален език, процесът на обучение осигурява по-задълбочена представа. Разделите по-долу илюстрират как се подготвят данните, как се интегрират компонентите на модела и как се оптимизират съвместно.
Вместо да разчитате само на предварително обучени компоненти, можете да придобиете набор от данни за обучение от сдвоени изображения и LaTeX етикети. Един пример е наборът от данни unsloth/LaTeX_OCR
, който съдържа изображения на уравнения заедно с техните LaTeX низове. След като инсталирате зависимости и настроите вашия набор от данни, стъпките за обучение включват създаване на конвейер за данни, инициализиране на модела и преминаване през епохи.
Ето схема за подготовка на набора от данни и зареждането му:
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))))
На този етап бихте изградили или повторно използвали същия тръбопровод AnyModal, описан по-рано. Вместо да зареждате предварително обучени тежести, бихте инициализирали модела, така че да може да се учи от нулата или от частично предварително обучени контролни точки.
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:" )
След това можете да създадете тренировъчен цикъл, за да оптимизирате параметрите на модела. Един общ подход използва оптимизатора AdamW
на PyTorch и по избор използва обучение със смесена точност за ефективност:
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()
След всяка епоха или поне когато обучението приключи, оценяването на модела върху набор за валидиране помага да се гарантира, че той се обобщава към нови данни:
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}")
В допълнение към потвърждаването на ефективността, тази стъпка за валидиране може да насочи подобрения като коригиране на хиперпараметри, превключване към различен базов модел или прецизиране на предварителната обработка на вашите данни. Следвайки тези стъпки за обучение, получавате по-добро разбиране на взаимодействието между визуалния енкодер и езиковия модел и можете да разширите работния процес до допълнителни задачи или по-специализирани области.