import json
import torch
from peft import PeftModel
from transformers import AutoProcessor, BitsAndBytesConfig, Qwen2_5_VLForConditionalGeneration
from PIL import Image
base = "Qwen/Qwen2.5-VL-3B-Instruct"
adapter = "MuhibBeekun/pickai-qwen2.5-vl-3b-layout-vision-lora"
processor = AutoProcessor.from_pretrained(adapter, trust_remote_code=True)
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
base,
trust_remote_code=True,
device_map="auto",
quantization_config=BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
),
)
model = PeftModel.from_pretrained(model, adapter)
model.eval()
image = Image.open("floor_plan.png").convert("RGB")
prompt = (
'Return JSON only: {"facility_draft":{"locations":[...]}} extracted from the warehouse floor plan image.\n'
"Copy location_id exactly as printed on bay labels.\n"
)
messages = [{"role": "user", "content": [{"type": "image", "image": image}, {"type": "text", "text": prompt}]}]
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = processor(text=[text], images=[image], return_tensors="pt").to(model.device)
with torch.inference_mode():
out = model.generate(**inputs, max_new_tokens=2048, do_sample=False)
decoded = processor.decode(out[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True)
print(decoded)