import torchfrom transformers import AutoProcessor, AutoModelForImageTextToTextfrom qwen_vl_utils import process_vision_info model_id = "shahedm2001/qwen3-vl-2b-cataract-sft" # <-- update after publishprocessor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)model = AutoModelForImageTextToText.from_pretrained( model_id, dtype=torch.bfloat16, device_map="auto", attn_implementation="sdpa", trust_remote_code=True)model.eval() video = "path/to/clip.mp4"question = "Describe what is happening in this cataract surgical video clip." # --- choose ONE of nframes / fps, plus desired pixel bounds ---messages = [{"role": "user", "content": [ {"type": "video", "video": video, "nframes": 64, # ← max frames; use one of nframes/fps # "fps": 1.0, # ← alternative: frames per second "min_pixels": 98_304, # 96*32*32 — lower bound "max_pixels": 196_608}, # 192*32*32 — upper bound (increase for more detail / more tokens) {"type": "text", "text": question}]}] text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)image_inputs, video_inputs, video_kwargs = process_vision_info( messages, return_video_kwargs=True)video_kwargs = {k: v for k, v in (video_kwargs or {}).items() if k != "fps"}inputs = processor(text=[text], images=image_inputs, videos=video_inputs, padding=True, return_tensors="pt", **video_kwargs).to(model.device) with torch.no_grad(): out = model.generate(**inputs, max_new_tokens=256, do_sample=False)pred = processor.tokenizer.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True)print(pred)