import jsonimport torchfrom transformers import AutoProcessor, AutoModelForImageTextToTextfrom qwen_vl_utils import process_vision_info model_id = "shahedm2001/qwen3-vl-2b-cataract-grpo" # 1. Load model and processormodel = AutoModelForImageTextToText.from_pretrained( model_id, torch_dtype=torch.bfloat16, device_map="auto")processor = AutoProcessor.from_pretrained(model_id) # 2. Formulate video analysis querymessages = [ { "role": "user", "content": [ { "type": "video", "video": "path/to/cataract_phacoemulsification_clip.mp4", "nframes": 50, "video_min_pixels": 131072, "video_max_pixels": 196608, }, { "type": "text", "text": "Identify the active surgical phase occurring at timestamp 14.5s in this video. Provide clinical explanation and output strictly in JSON format matching {\"explanation\": \"...\", \"phase_id\": \"...\", \"phase_name\": \"...\"}." } ] }] # 3. Preprocess inputsprompt = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)image_inputs, video_inputs = process_vision_info(messages)inputs = processor( text=[prompt], images=image_inputs, videos=video_inputs, padding=True, return_tensors="pt").to("cuda") # 4. Generate structured predictionwith torch.no_grad(): generated_ids = model.generate( **inputs, max_new_tokens=256, temperature=0.2, do_sample=False ) generated_ids_trimmed = [ out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids) ] response = processor.batch_decode( generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False )[0] print("Model Output:")print(response)