Views
No views yet
1import numpy as np
2import torch
3from tdc.builder import load_pretrained_model
4from tdc.constants import (
5 DEFAULT_IMAGE_TOKEN,
6 IMAGE_TOKEN_INDEX,
7)
8from tdc.conversation import conv_templates, SeparatorStyle
9from tdc.mm_datautils import (
10 KeywordsStoppingCriteria,
11 process_images,
12 tokenizer_image_token,
13)
14from decord import cpu, VideoReader
15from utils.processor import Processor
16
17tokenizer, model, image_processor, context_len = load_pretrained_model(
18 "checkpoints/TDC-Qwen2-7B", None, "cambrian_qwen",
19)
20audio_processor = Processor("checkpoints/audio_encoder/whisper-large-v3")
21
22model.eval()
23model.cuda()
24video_path = "./examples/video1.mp4"
25audio_path = "./examples/audio1.wav"
26instruction = qs = "Describe this video in detail, what can you see and hear?"
27
28vr = VideoReader(video_path, ctx=cpu(0), num_threads=1)
29fps = float(vr.get_avg_fps())
30frame_indices = np.array([i for i in range(0, len(vr), round(fps),)])
31video = []
32for frame_index in frame_indices:
33 img = vr[frame_index].asnumpy()
34 video.append(img)
35video = np.stack(video)
36image_sizes = [video[0].shape[:2]]
37video = process_images(video, image_processor, model.config)
38video = [item.unsqueeze(0) for item in video]
39
40if audio_path is not None:
41 audio_data = {
42 "audio": [{'audio_file': audio_path, 'start_time': None, 'end_time': None}]
43 }
44 audio = audio_processor(audio_data)
45else:
46 audio = None
47
48qs = DEFAULT_IMAGE_TOKEN + "\n" + qs
49conv = conv_templates["qwen"].copy()
50conv.append_message(conv.roles[0], qs)
51conv.append_message(conv.roles[1], None)
52prompt = conv.get_prompt()
53
54input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).to(model.device)
55stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2
56keywords = [stop_str]
57stopping_criteria = KeywordsStoppingCriteria(keywords, tokenizer, input_ids)
58
59with torch.inference_mode():
60 output_ids = model.generate(
61 input_ids,
62 images=video,
63 image_sizes=image_sizes,
64 do_sample=True,
65 temperature=0.2,
66 max_new_tokens=128,
67 use_cache=True,
68 stopping_criteria=[stopping_criteria],
69 prompt=instruction,
70 audio=audio
71 )
72pred = tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0].strip()
73print(pred)@misc{hao2025multimodallongvideomodeling,
title={Multimodal Long Video Modeling Based on Temporal Dynamic Context},
author={Haoran Hao and Jiaming Han and Yiyuan Zhang and Xiangyu Yue},
year={2025},
eprint={2504.10443},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2504.10443},
}