from PIL import Imageimport torchfrom transformers import AutoModelForImageTextToText, AutoProcessorfrom qwen_vl_utils import process_vision_info model_id = "sugartai/Qwen3.5-4B-MathParser-pro" processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)model = AutoModelForImageTextToText.from_pretrained( model_id, trust_remote_code=True, dtype=torch.bfloat16, device_map="auto",).eval() image = Image.open("formula.png").convert("RGB")messages = [ { "role": "system", "content": "You are a handwritten mathematical OCR model. Return only the LaTeX transcription.", }, { "role": "user", "content": [ {"type": "image", "image": image}, {"type": "text", "text": "Transcribe the handwritten mathematical formula into LaTeX only."}, ], },] text = processor.apply_chat_template( messages, tokenize=False, add_generation_prompt=True, enable_thinking=False,)image_inputs, video_inputs = process_vision_info(messages)inputs = processor( text=[text], images=image_inputs, videos=video_inputs, padding=True, return_tensors="pt",).to(model.device) eos_ids = [processor.tokenizer.eos_token_id]pad_id = processor.tokenizer.pad_token_idif pad_id is not None and pad_id not in eos_ids: eos_ids.append(pad_id) with torch.no_grad(): output_ids = model.generate( **inputs, max_new_tokens=1536, do_sample=False, num_beams=1, eos_token_id=eos_ids, pad_token_id=pad_id if pad_id is not None else eos_ids[0], ) new_ids = output_ids[:, inputs["input_ids"].shape[1]:]print(processor.decode(new_ids[0], skip_special_tokens=True))