| | --- |
| | language: |
| | - en |
| | library_name: transformers |
| | license: apache-2.0 |
| | metrics: |
| | - accuracy |
| | tags: |
| | - multimodal |
| | pipeline_tag: video-text-to-text |
| | base_model: Qwen/Qwen2.5-VL-7B-Instruct |
| | --- |
| | |
| |
|
| | # ๐ก VideoChat-R1_5-7B |
| | |
| | [\[๐ GitHub\]](https://github.com/OpenGVLab/VideoChat-R1) |
| | [\[๐ Tech Report\]](https://arxiv.org/pdf/2509.21100v1) |
| | |
| | |
| | ## ๐ How to use the model |
| | |
| | We provide a simple installation example below: |
| | ``` |
| | pip install transformers |
| | ``` |
| | Using qwen_vl_utils in https://github.com/OpenGVLab/VideoChat-R1/blob/main/Videochat-R1.5/src_eval/my_vision_process.py |
| |
|
| | Then you could use our model: |
| | ```python |
| | from transformers import Qwen2_5_VLForConditionalGeneration, AutoTokenizer, AutoProcessor |
| | from qwen_vl_utils import process_vision_info |
| | |
| | model_path = "OpenGVLab/VideoChat-R1_5" |
| | # default: Load the model on the available device(s) |
| | model = Qwen2_5_VLForConditionalGeneration.from_pretrained( |
| | model_path, torch_dtype="auto", device_map="auto", |
| | attn_implementation="flash_attention_2" |
| | ) |
| | |
| | # default processer |
| | processor = AutoProcessor.from_pretrained(model_path) |
| | |
| | video_path = "your_video.mp4" |
| | question = "your_qa.mp4" |
| | num_percptions = 3 |
| | |
| | QA_THINK_GLUE = """Answer the question: "[QUESTION]" according to the content of the video. |
| | |
| | Output your think process within the <think> </think> tags. |
| | |
| | Then, provide your answer within the <answer> </answer> tags, output the corresponding letter of the option. At the same time, in the <glue> </glue> tags, present the precise time period in seconds of the video clips on which you base your answer to this question in the format of [(s1, e1), (s2, e2), ...]. For example: <think>...</think><answer>A</answer><glue>[(5.2, 10.4)]</glue>. |
| | """ |
| | |
| | QA_THINK = """Answer the question: "[QUESTION]" according to the content of the video. |
| | |
| | Output your think process within the <think> </think> tags. |
| | |
| | Then, provide your answer within the <answer> </answer> tags, output the corresponding letter of the option. For example: <think>...</think><answer>A</answer><glue>[(5.2, 10.4)]</glue>. |
| | """ |
| | |
| | |
| | def inference(video_path, prompt, model, processor, max_new_tokens=2048, device="cuda:0", client = None, pred_glue=None): |
| | messages = [ |
| | {"role": "user", "content": [ |
| | {"type": "video", |
| | "video": video_path, |
| | 'key_time':pred_glue, |
| | "total_pixels": 128*12 * 28 * 28, |
| | "min_pixels": 128 * 28 * 28, |
| | }, |
| | {"type": "text", "text": prompt}, |
| | ] |
| | }, |
| | ] |
| | 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, client = client) |
| | fps_inputs = video_kwargs['fps'] |
| | |
| | inputs = processor(text=[text], images=image_inputs, videos=video_inputs, fps=fps_inputs, padding=True, return_tensors="pt") |
| | inputs = inputs.to(device) |
| | |
| | with torch.no_grad(): |
| | output_ids = model.generate(**inputs, max_new_tokens=max_new_tokens, use_cache=True) |
| | |
| | generated_ids = [output_ids[i][len(inputs.input_ids[i]):] for i in range(len(output_ids))] |
| | output_text = processor.batch_decode(generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=True) |
| | return output_text[0] |
| | |
| | |
| | for percption in range(num_percptions): |
| | |
| | if percption == num_percptions - 1: |
| | example_prompt = QA_THINK.replace("[QUESTION]", item["problem"]["question"]) |
| | else: |
| | example_prompt = QA_THINK_GLUE.replace("[QUESTION]", item["problem"]["question"]) |
| | |
| | |
| | ans = inference(video_path, example_prompt, model, processor, device=device, client=client, pred_glue=pred_glue) |
| | |
| | pattern_glue = r'<glue>(.*?)</glue>' |
| | match_glue = re.search(pattern_glue, ans, re.DOTALL) |
| | # print(f'ann:{ans}') |
| | answers.append(ans) |
| | pred_glue = None |
| | try: |
| | if match_glue: |
| | glue = match_glue.group(1) |
| | pred_glue = ast.literal_eval(glue) |
| | |
| | |
| | except Exception as e: |
| | pred_glue = None |
| | print(ans) |
| | ``` |
| |
|
| |
|
| | ## โ๏ธ Citation |
| |
|
| | If you find this project useful in your research, please consider cite: |
| | ```BibTeX |
| | @article{li2025videochatr1, |
| | title={VideoChat-R1: Enhancing Spatio-Temporal |
| | Perception via Reinforcement Fine-Tuning}, |
| | author={Li, Xinhao and Yan, Ziang and Meng, Desen and Dong, Lu and Zeng, Xiangyu and He, Yinan and Wang, Yali and Qiao, Yu and Wang, Yi and Wang, Limin}, |
| | journal={arXiv preprint arXiv:2504.06958}, |
| | year={2025} |
| | } |
| | |
| | @article{yan2025videochatr15, |
| | title={VideoChat-R1.5: Visual Test-Time Scaling to Reinforce Multimodal Reasoning by Iterative Perception}, |
| | author={Yan, Ziang and Li, Xinhao and He, Yinan and Zhengrong Yue and Zeng, Xiangyu and Wang, Yali and Qiao, Yu and Wang, Limin and Wang, Yi}, |
| | journal={arXiv preprint arXiv:2509.21100}, |
| | year={2025} |
| | } |
| | ``` |