Views
No views yet
conda create --name transformers4571 python=3.11
conda activate transformers4571
pip install transformers==4.57.1
pip install torch pillow einops torchvision accelerate decord2logits_processor=model.build_logit_processor_from_inputs(model_inputs)
to enforce points tokens are generated in a valid way.return_pointing_metadata flag.
Then model.extract_image_points and model.extract_video_points do the decoding, they
return a list of ({image_id|timestamps}, object_id, pixel_x, pixel_y) output points.1from transformers import AutoProcessor, AutoModelForImageTextToText
2import torch
3import numpy as np
4
5checkpoint_dir = "allenai/MolmoPoint-8B" # or path to a converted HF checkpoint
6
7model = AutoModelForImageTextToText.from_pretrained(
8 checkpoint_dir,
9 trust_remote_code=True,
10 dtype="auto",
11 device_map="auto",
12)
13
14processor = AutoProcessor.from_pretrained(
15 checkpoint_dir,
16 trust_remote_code=True,
17 padding_side="left",
18)
19
20image_messages = [
21 {
22 "role": "user",
23 "content": [
24 {"type": "text", "text": "Point to the boats"},
25 {"type": "image", "image": "https://assets.thesparksite.com/uploads/sites/5550/2025/01/aerial-view-of-boats-yachts-water-bike-and-woode-2023-11-27-04-51-17-utc.jpg"},
26 {"type": "image", "image": "https://storage.googleapis.com/ai2-playground-molmo/promptTemplates/Stock_278013497.jpeg"},
27 ]
28 }
29]
30
31inputs = processor.apply_chat_template(
32 image_messages,
33 tokenize=True,
34 add_generation_prompt=True,
35 return_tensors="pt",
36 return_dict=True,
37 padding=True,
38 return_pointing_metadata=True
39)
40metadata = inputs.pop("metadata")
41inputs = {k: v.to("cuda") for k, v in inputs.items()}
42
43with torch.inference_mode(), torch.autocast("cuda", dtype=torch.bfloat16):
44 output = model.generate(
45 **inputs,
46 logits_processor=model.build_logit_processor_from_inputs(inputs),
47 max_new_tokens=200
48 )
49
50generated_tokens = output[:, inputs["input_ids"].size(1):]
51generated_text = processor.post_process_image_text_to_text(generated_tokens, skip_special_tokens=False, clean_up_tokenization_spaces=False)[0]
52points = model.extract_image_points(
53 generated_text,
54 metadata["token_pooling"],
55 metadata["subpatch_mapping"],
56 metadata["image_sizes"]
57)
58
59# points as a list of [object_id, image_num, x, y]
60# For multiple images, `image_num` is the index of the image the point is in
61print(np.array(points))1video_path = "https://storage.googleapis.com/oe-training-public/demo_videos/many_penguins.mp4"
2video_messages = [
3 {
4 "role": "user",
5 "content": [
6 dict(type="text", text="Point to the penguins"),
7 dict(type="video", video=video_path),
8 ]
9 }
10]
11
12inputs = processor.apply_chat_template(
13 video_messages,
14 tokenize=True,
15 add_generation_prompt=True,
16 return_tensors="pt",
17 return_dict=True,
18 padding=True,
19 return_pointing_metadata=True
20)
21metadata = inputs.pop("metadata")
22inputs = {k: v.to("cuda") for k, v in inputs.items()}
23
24with torch.inference_mode(), torch.autocast("cuda", dtype=torch.bfloat16):
25 output = model.generate(
26 **inputs,
27 logits_processor=model.build_logit_processor_from_inputs(inputs),
28 max_new_tokens=200
29 )
30
31 generated_tokens = output[:, inputs['input_ids'].size(1):]
32 generated_text = processor.post_process_image_text_to_text(generated_tokens, skip_special_tokens=False, clean_up_tokenization_spaces=False)[0]
33 video_points = model.extract_video_points(
34 generated_text,
35 metadata["token_pooling"],
36 metadata["subpatch_mapping"],
37 metadata["timestamps"],
38 metadata["video_size"]
39 )
40
41 # points as a list of [object_id, image_num, x, y]
42 # For tracking, object_id uniquely identifies objects that might appear multiple frames.
43 print(np.array(video_points))