MolmoPoint-Vid-4B 是由艾伦人工智能研究所(Ai2)开发的全开源视觉语言模型(VLM),专门用于视频指向任务。 该模型使用锚定标记而非文本坐标进行指向,详细信息请参见我们的论文。 本模型仅针对视频指向任务进行训练,通用模型请参见 MolmoPoint-8B。
请注意,Hugging Face 上的 MolmoPoint 模型不支持训练,训练代码请参见我们的 GitHub 仓库。
快速链接:
conda create --name transformers4571 python=3.11
conda activate transformers4571
pip install transformers==4.57.1
pip install torch pillow einops torchvision accelerate decord2我们建议使用 logits_processor=model.build_logit_processor_from_inputs(model_inputs) 运行 MolmoPoint,以确保点标记以有效的方式生成。
在 MolmoPoint 中,点不是以坐标形式生成,而是作为一系列特殊标记生成。要将这些标记解码回点,需要来自预处理器的一些额外元数据。该元数据由预处理器通过 return_pointing_metadata 标志返回。然后,model.extract_video_points 会执行解码操作,返回一个包含(时间戳、object_id、pixel_x、pixel_y)的输出点列表。
from transformers import AutoProcessor, AutoModelForImageTextToText
import torch
import numpy as np
checkpoint_dir = "allenai/MolmoPoint-Vid-4B"
model = AutoModelForImageTextToText.from_pretrained(
checkpoint_dir,
trust_remote_code=True,
dtype="auto",
device_map="auto",
)
processor = AutoProcessor.from_pretrained(
checkpoint_dir,
trust_remote_code=True,
padding_side="left",
)
video_path = "https://storage.googleapis.com/oe-training-public/demo_videos/many_penguins.mp4"
video_messages = [
{
"role": "user",
"content": [
dict(type="text", text="Point to the penguins"),
dict(type="video", video=video_path),
]
}
]
inputs = processor.apply_chat_template(
video_messages,
tokenize=True,
add_generation_prompt=True,
return_tensors="pt",
return_dict=True,
padding=True,
return_pointing_metadata=True
)
metadata = inputs.pop("metadata")
inputs = {k: v.to("cuda") for k, v in inputs.items()}
with torch.inference_mode(), torch.autocast("cuda", dtype=torch.bfloat16):
output = model.generate(
**inputs,
logits_processor=model.build_logit_processor_from_inputs(inputs),
max_new_tokens=200
)
generated_tokens = output[:, inputs['input_ids'].size(1):]
generated_text = processor.post_process_image_text_to_text(generated_tokens, skip_special_tokens=False, clean_up_tokenization_spaces=False)[0]
video_points = model.extract_video_points(
generated_text,
metadata["token_pooling"],
metadata["subpatch_mapping"],
metadata["timestamps"],
metadata["video_size"]
)
# points as a list of [object_id, image_num, x, y]
# For tracking, object_id uniquely identifies objects that might appear multiple frames.
print(np.array(video_points))
# expected:
[[ 1. 9. 188.86666667 177.65925926]
[ 2. 15.5 197.66666667 288.35555556]
[ 3. 17. 153.26666667 327.7037037 ]
[ 4. 23.5 46.6 406.87407407]
[ 5. 23.5 91. 406.87407407]
[ 6. 23.5 135.53333333 438.4 ]
[ 7. 23.5 233.26666667 477.98518519]
[ 8. 25. 184.33333333 280.2962963 ]
[ 9. 25. 268.86666667 232.88888889]
[ 10. 27. 171. 335.76296296]
[ 11. 30. 193.26666667 304. ]
[ 12. 32. 64.33333333 201.36296296]
[ 13. 32. 202.2 414.6962963 ]
[ 14. 38.5 184.33333333 383.17037037]
[ 15. 40.5 335.53333333 82.84444444]
[ 16. 40.5 117.66666667 201.36296296]
[ 17. 40.5 95.53333333 501.68888889]
[ 18. 47. 259.93333333 304. ]
[ 19. 47. 153.26666667 501.68888889]]本模型采用 Apache 2.0 许可协议。其旨在依据 Ai2 的《负责任使用指南》用于研究和教育用途。本模型基于第三方数据集训练而成,该数据集仅允许用于学术和非商业研究。请仔细查阅来源信息,以确定本模型是否适合您的使用场景。