from pathlib import Path from qwen_vl_utils import process_vision_infofrom transformers import AutoModelForImageTextToText, AutoProcessor model_id = "MCG-NJU/TimeLens2-4B"video_path = "/path/to/video.mp4"query = "A man opens the refrigerator." model = AutoModelForImageTextToText.from_pretrained( model_id, torch_dtype="auto", device_map="auto", attn_implementation="flash_attention_2",)processor = AutoProcessor.from_pretrained(model_id) prompt = ( f'Given the query: "{query}", return ALL time spans (in seconds) where the query is relevant.\n' "Output format MUST be a JSON array of [start, end] pairs.\n")messages = [ { "role": "user", "content": [ { "type": "video", "video": Path(video_path).resolve().as_uri(), "fps": 2.0, "min_pixels": 32 * 32, "max_pixels": 480 * 480, "total_pixels": 128000 * 32 * 32, }, {"type": "text", "text": prompt}, ], }] 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,) if videos is not None: videos, video_metadatas = zip(*videos) videos, video_metadatas = list(videos), list(video_metadatas)else: video_metadatas = None inputs = processor( text=text, images=images, videos=videos, video_metadata=video_metadatas, do_resize=False, return_tensors="pt", **video_kwargs,).to(model.device) output_ids = model.generate( **inputs, max_new_tokens=4096, temperature=0.01, top_p=0.001, top_k=1, repetition_penalty=1.0,)output_ids = [ output[len(input_ids) :] for input_ids, output in zip(inputs.input_ids, output_ids)]response = processor.batch_decode( output_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False,)print(response[0])