import requestsimport osimport torchfrom transformers import AutoModelForImageTextToText, AutoProcessorfrom qwen_vl_utils import process_vision_infoย ย def download_video(url): save_path = os.path.basename(url) if not os.path.exists(save_path): print(f"Downloading video from {url}...") response = requests.get(url, stream=True) response.raise_for_status() with open(save_path, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) return save_pathย # Load model and processormodel = AutoModelForImageTextToText.from_pretrained( "TencentARC/TimeLens-8B", dtype=torch.bfloat16, attn_implementation="flash_attention_2", device_map="auto",)ย processor = AutoProcessor.from_pretrained( "TencentARC/TimeLens-8B", padding_side="left", do_resize=False,)ย # Prepare inputquery = "A man drinks water with a glass"video_path = download_video("https://huggingface.co/datasets/JungleGym/TimeLens-Assets/resolve/main/2Y8XQ.mp4")ย GROUNDER_PROMPT = "Please find the visual event described by the sentence '{}', determining its starting and ending times. The format should be: 'The event happens in <start time> - <end time> seconds'."ย messages = [{ 'role': 'user', 'content': [ { 'type': 'video', 'video': video_path, 'min_pixels': 64 * 32 * 32, 'total_pixels': 14336 * 32 * 32, 'fps': 2, }, { 'type': 'text', 'text': GROUNDER_PROMPT.format(query) } ]}]ย text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)images, videos, video_kwargs = process_vision_info( messages, image_patch_size=16, return_video_kwargs=True, return_video_metadata=True,)ย videos, video_metadatas = zip(*videos)videos, video_metadatas = list(videos), list(video_metadatas)ย inputs = processor( text=[text], images=images, videos=videos, video_metadata=video_metadatas, padding=True, return_tensors='pt', **video_kwargs,).to("cuda")ย output_ids = model.generate( **inputs, do_sample=False, max_new_tokens=512,)ย generated_ids_trimmed = [ out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, output_ids)]answer = processor.batch_decode( generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]print(f"Answer: {answer}")