Views
No views yet
1import requests
2import torch
3from PIL import Image
4from transformers import Sam3Model, Sam3Processor
5from transformers.models.sam3.modeling_sam3 import Sam3Config
6
7model_id = "tiny-random/sam3"
8device = "cuda" if torch.cuda.is_available() else "cpu"
9model = Sam3Model.from_pretrained(model_id).to(device)
10processor = Sam3Processor.from_pretrained(model_id)
11
12kitchen_url = "http://images.cocodataset.org/val2017/000000136466.jpg"
13kitchen_image = Image.open(requests.get(
14 kitchen_url, stream=True).raw).convert("RGB")
15# Segment "handle" but exclude the oven handle using a negative box
16text = "handle"
17# Negative box covering oven handle area (xyxy): [40, 183, 318, 204]
18oven_handle_box = [40, 183, 318, 204]
19input_boxes = [[oven_handle_box]]
20inputs = processor(
21 images=kitchen_image,
22 text=text,
23 input_boxes=input_boxes,
24 input_boxes_labels=[[0]], # 0 = negative (exclude this region)
25 return_tensors="pt"
26).to(device)
27with torch.no_grad():
28 outputs = model(**inputs)
29# Post-process results
30results = processor.post_process_instance_segmentation(
31 outputs,
32 threshold=0.5,
33 mask_threshold=0.5,
34 target_sizes=inputs.get("original_sizes").tolist()
35)[0]
36print(results)
37# This will segment pot handles but exclude the oven handle1import json
2from pathlib import Path
3
4import accelerate
5import torch
6from huggingface_hub import file_exists, hf_hub_download
7from transformers import (
8 AutoConfig,
9 AutoModelForCausalLM,
10 AutoProcessor,
11 GenerationConfig,
12 Sam3Processor,
13 set_seed,
14)
15from transformers.models.sam3.modeling_sam3 import Sam3Config, Sam3Model
16
17source_model_id = "facebook/sam3"
18save_folder = "/tmp/tiny-random/sam3"
19
20processor = Sam3Processor.from_pretrained(
21 source_model_id, trust_remote_code=True)
22processor.save_pretrained(save_folder)
23
24with open(hf_hub_download(source_model_id, filename='config.json', repo_type='model'), 'r', encoding='utf-8') as f:
25 config_json = json.load(f)
26HIDDEN_SIZE = 16
27INTERMEDIATE_SIZE = 32
28NUM_ATTENTION_HEADS = 2
29config_json['detector_config']['detr_decoder_config'].update({
30 'hidden_size': HIDDEN_SIZE,
31 'intermediate_size': INTERMEDIATE_SIZE,
32 'num_attention_heads': NUM_ATTENTION_HEADS,
33})
34config_json['detector_config']['detr_encoder_config'].update({
35 'hidden_size': HIDDEN_SIZE,
36 'intermediate_size': INTERMEDIATE_SIZE,
37 'num_attention_heads': NUM_ATTENTION_HEADS,
38})
39config_json['detector_config']['geometry_encoder_config'].update({
40 'hidden_size': HIDDEN_SIZE,
41 'intermediate_size': INTERMEDIATE_SIZE,
42 'num_attention_heads': NUM_ATTENTION_HEADS,
43})
44config_json['detector_config']['mask_decoder_config'].update({
45 'hidden_size': HIDDEN_SIZE,
46 'intermediate_size': INTERMEDIATE_SIZE,
47 'num_attention_heads': NUM_ATTENTION_HEADS,
48})
49config_json['detector_config']['text_config'].update({
50 'hidden_size': HIDDEN_SIZE,
51 'intermediate_size': INTERMEDIATE_SIZE,
52 'num_attention_heads': NUM_ATTENTION_HEADS,
53 'projection_dim': HIDDEN_SIZE,
54 'num_hidden_layers': 2,
55})
56config_json['detector_config']['vision_config']['backbone_config'].update({
57 'hidden_size': HIDDEN_SIZE,
58 'intermediate_size': INTERMEDIATE_SIZE,
59 'num_attention_heads': NUM_ATTENTION_HEADS,
60 'fpn_hidden_size': HIDDEN_SIZE,
61 'global_attn_indexes': [1, 3, 5, 7],
62 'num_hidden_layers': 8,
63})
64config_json['detector_config']['vision_config'].update({
65 'fpn_hidden_size': HIDDEN_SIZE,
66})
67config_json['tracker_config']['mask_decoder_config'].update({
68 'hidden_size': HIDDEN_SIZE,
69 'iou_head_hidden_dim': HIDDEN_SIZE,
70 'num_attention_heads': NUM_ATTENTION_HEADS,
71})
72config_json['tracker_config'].update({
73 'mask_downsampler_embed_dim': HIDDEN_SIZE,
74 'memory_attention_feed_forward_hidden_size': HIDDEN_SIZE,
75 'memory_attention_hidden_size': HIDDEN_SIZE,
76 'memory_encoder_hidden_size': HIDDEN_SIZE,
77 'memory_fuser_embed_dim': HIDDEN_SIZE,
78 'memory_fuser_intermediate_dim': INTERMEDIATE_SIZE,
79})
80config_json['tracker_config']['prompt_encoder_config'].update({
81 'hidden_size': HIDDEN_SIZE,
82 'intermediate_size': INTERMEDIATE_SIZE,
83 'num_attention_heads': NUM_ATTENTION_HEADS,
84})
85config_json['tracker_config']['vision_config']['backbone_config'].update({
86 'hidden_size': HIDDEN_SIZE,
87 'intermediate_size': INTERMEDIATE_SIZE,
88 'num_attention_heads': NUM_ATTENTION_HEADS,
89 'global_attn_indexes': [1, 3, 5, 7],
90 'num_hidden_layers': 8,
91})
92config_json['tracker_config']['vision_config'].update({
93 'fpn_hidden_size': HIDDEN_SIZE,
94})
95
96with open(f"{save_folder}/config.json", "w", encoding='utf-8') as f:
97 json.dump(config_json, f, indent=2)
98
99config = Sam3Config.from_pretrained(
100 save_folder,
101 trust_remote_code=True,
102)
103print(config)
104torch.set_default_dtype(torch.float32)
105model = Sam3Model(config)
106set_seed(42)
107model = model.cpu()
108with torch.no_grad():
109 for name, p in sorted(model.named_parameters()):
110 torch.nn.init.normal_(p, 0, 0.1)
111 print(name, p.shape)
112model.save_pretrained(save_folder)
113# print(list(model.state_dict().keys()))
114# there is some bug in model.save_pretrained... Re-save the model weights here.
115import safetensors.torch
116safetensors.torch.save_file(
117 tensors=model.state_dict(),
118 filename=f"{save_folder}/model.safetensors"
119)1Sam3Model(
2 (vision_encoder): Sam3VisionModel(
3 (backbone): Sam3ViTModel(
4 (embeddings): Sam3ViTEmbeddings(
5 (patch_embeddings): Sam3ViTPatchEmbeddings(
6 (projection): Conv2d(3, 16, kernel_size=(14, 14), stride=(14, 14), bias=False)
7 )
8 (dropout): Dropout(p=0.0, inplace=False)
9 )
10 (layer_norm): LayerNorm((16,), eps=1e-06, elementwise_affine=True)
11 (layers): ModuleList(
12 (0-7): 8 x Sam3ViTLayer(
13 (layer_norm1): LayerNorm((16,), eps=1e-06, elementwise_affine=True)
14 (rotary_emb): Sam3ViTRotaryEmbedding()
15 (attention): Sam3ViTRoPEAttention(
16 (q_proj): Linear(in_features=16, out_features=16, bias=True)
17 (k_proj): Linear(in_features=16, out_features=16, bias=True)
18 (v_proj): Linear(in_features=16, out_features=16, bias=True)
19 (o_proj): Linear(in_features=16, out_features=16, bias=True)
20 )
21 (layer_norm2): LayerNorm((16,), eps=1e-06, elementwise_affine=True)
22 (mlp): Sam3MLP(
23 (activation_fn): GELUActivation()
24 (fc1): Linear(in_features=16, out_features=32, bias=True)
25 (fc2): Linear(in_features=32, out_features=16, bias=True)
26 (dropout): Dropout(p=0.0, inplace=False)
27 )
28 (dropout): Dropout(p=0.0, inplace=False)
29 )
30 )
31 )
32 (neck): Sam3VisionNeck(
33 (position_encoding): Sam3SinePositionEmbedding()
34 (fpn_layers): ModuleList(
35 (0): Sam3FPNLayer(
36 (scale_layers): ModuleList(
37 (0): ConvTranspose2d(16, 8, kernel_size=(2, 2), stride=(2, 2))
38 (1): GELU(approximate='none')
39 (2): ConvTranspose2d(8, 4, kernel_size=(2, 2), stride=(2, 2))
40 )
41 (proj1): Conv2d(4, 16, kernel_size=(1, 1), stride=(1, 1))
42 (proj2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
43 )
44 (1): Sam3FPNLayer(
45 (scale_layers): ModuleList(
46 (0): ConvTranspose2d(16, 8, kernel_size=(2, 2), stride=(2, 2))
47 )
48 (proj1): Conv2d(8, 16, kernel_size=(1, 1), stride=(1, 1))
49 (proj2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
50 )
51 (2): Sam3FPNLayer(
52 (scale_layers): ModuleList()
53 (proj1): Conv2d(16, 16, kernel_size=(1, 1), stride=(1, 1))
54 (proj2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
55 )
56 (3): Sam3FPNLayer(
57 (scale_layers): ModuleList(
58 (0): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
59 )
60 (proj1): Conv2d(16, 16, kernel_size=(1, 1), stride=(1, 1))
61 (proj2): Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
62 )
63 )
64 )
65 )
66 (text_encoder): CLIPTextModelWithProjection(
67 (text_model): CLIPTextTransformer(
68 (embeddings): CLIPTextEmbeddings(
69 (token_embedding): Embedding(49408, 16)
70 (position_embedding): Embedding(32, 16)
71 )
72 (encoder): CLIPEncoder(
73 (layers): ModuleList(
74 (0-1): 2 x CLIPEncoderLayer(
75 (self_attn): CLIPAttention(
76 (k_proj): Linear(in_features=16, out_features=16, bias=True)
77 (v_proj): Linear(in_features=16, out_features=16, bias=True)
78 (q_proj): Linear(in_features=16, out_features=16, bias=True)
79 (out_proj): Linear(in_features=16, out_features=16, bias=True)
80 )
81 (layer_norm1): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
82 (mlp): CLIPMLP(
83 (activation_fn): GELUActivation()
84 (fc1): Linear(in_features=16, out_features=32, bias=True)
85 (fc2): Linear(in_features=32, out_features=16, bias=True)
86 )
87 (layer_norm2): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
88 )
89 )
90 )
91 (final_layer_norm): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
92 )
93 (text_projection): Linear(in_features=16, out_features=16, bias=False)
94 )
95 (text_projection): Linear(in_features=16, out_features=16, bias=True)
96 (geometry_encoder): Sam3GeometryEncoder(
97 (position_encoding): Sam3SinePositionEmbedding()
98 (label_embed): Embedding(2, 16)
99 (cls_embed): Embedding(1, 16)
100 (boxes_direct_project): Linear(in_features=4, out_features=16, bias=True)
101 (boxes_pool_project): Conv2d(16, 16, kernel_size=(7, 7), stride=(1, 1))
102 (boxes_pos_enc_project): Linear(in_features=18, out_features=16, bias=True)
103 (vision_layer_norm): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
104 (final_proj): Linear(in_features=16, out_features=16, bias=True)
105 (prompt_layer_norm): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
106 (layers): ModuleList(
107 (0-2): 3 x Sam3GeometryEncoderLayer(
108 (layer_norm1): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
109 (self_attn): Sam3Attention(
110 (q_proj): Linear(in_features=16, out_features=16, bias=True)
111 (k_proj): Linear(in_features=16, out_features=16, bias=True)
112 (v_proj): Linear(in_features=16, out_features=16, bias=True)
113 (o_proj): Linear(in_features=16, out_features=16, bias=True)
114 )
115 (dropout): Dropout(p=0.1, inplace=False)
116 (cross_attn): Sam3Attention(
117 (q_proj): Linear(in_features=16, out_features=16, bias=True)
118 (k_proj): Linear(in_features=16, out_features=16, bias=True)
119 (v_proj): Linear(in_features=16, out_features=16, bias=True)
120 (o_proj): Linear(in_features=16, out_features=16, bias=True)
121 )
122 (layer_norm2): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
123 (mlp): Sam3MLP(
124 (activation_fn): ReLU()
125 (fc1): Linear(in_features=16, out_features=32, bias=True)
126 (fc2): Linear(in_features=32, out_features=16, bias=True)
127 (dropout): Dropout(p=0.0, inplace=False)
128 )
129 (layer_norm3): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
130 )
131 )
132 (output_layer_norm): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
133 )
134 (detr_encoder): Sam3DetrEncoder(
135 (layers): ModuleList(
136 (0-5): 6 x Sam3DetrEncoderLayer(
137 (layer_norm1): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
138 (self_attn): Sam3Attention(
139 (q_proj): Linear(in_features=16, out_features=16, bias=True)
140 (k_proj): Linear(in_features=16, out_features=16, bias=True)
141 (v_proj): Linear(in_features=16, out_features=16, bias=True)
142 (o_proj): Linear(in_features=16, out_features=16, bias=True)
143 )
144 (dropout): Dropout(p=0.1, inplace=False)
145 (cross_attn): Sam3Attention(
146 (q_proj): Linear(in_features=16, out_features=16, bias=True)
147 (k_proj): Linear(in_features=16, out_features=16, bias=True)
148 (v_proj): Linear(in_features=16, out_features=16, bias=True)
149 (o_proj): Linear(in_features=16, out_features=16, bias=True)
150 )
151 (layer_norm2): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
152 (mlp): Sam3MLP(
153 (activation_fn): ReLU()
154 (fc1): Linear(in_features=16, out_features=32, bias=True)
155 (fc2): Linear(in_features=32, out_features=16, bias=True)
156 (dropout): Dropout(p=0.0, inplace=False)
157 )
158 (layer_norm3): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
159 )
160 )
161 )
162 (detr_decoder): Sam3DetrDecoder(
163 (layers): ModuleList(
164 (0-5): 6 x Sam3DetrDecoderLayer(
165 (self_attn): Sam3Attention(
166 (q_proj): Linear(in_features=16, out_features=16, bias=True)
167 (k_proj): Linear(in_features=16, out_features=16, bias=True)
168 (v_proj): Linear(in_features=16, out_features=16, bias=True)
169 (o_proj): Linear(in_features=16, out_features=16, bias=True)
170 )
171 (self_attn_dropout): Dropout(p=0.1, inplace=False)
172 (self_attn_layer_norm): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
173 (text_cross_attn): Sam3Attention(
174 (q_proj): Linear(in_features=16, out_features=16, bias=True)
175 (k_proj): Linear(in_features=16, out_features=16, bias=True)
176 (v_proj): Linear(in_features=16, out_features=16, bias=True)
177 (o_proj): Linear(in_features=16, out_features=16, bias=True)
178 )
179 (text_cross_attn_dropout): Dropout(p=0.1, inplace=False)
180 (text_cross_attn_layer_norm): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
181 (vision_cross_attn): Sam3Attention(
182 (q_proj): Linear(in_features=16, out_features=16, bias=True)
183 (k_proj): Linear(in_features=16, out_features=16, bias=True)
184 (v_proj): Linear(in_features=16, out_features=16, bias=True)
185 (o_proj): Linear(in_features=16, out_features=16, bias=True)
186 )
187 (vision_cross_attn_dropout): Dropout(p=0.1, inplace=False)
188 (vision_cross_attn_layer_norm): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
189 (mlp): Sam3MLP(
190 (activation_fn): ReLU()
191 (fc1): Linear(in_features=16, out_features=32, bias=True)
192 (fc2): Linear(in_features=32, out_features=16, bias=True)
193 (dropout): Dropout(p=0.0, inplace=False)
194 )
195 (mlp_layer_norm): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
196 (mlp_dropout): Dropout(p=0.1, inplace=False)
197 )
198 )
199 (output_layer_norm): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
200 (box_head): Sam3DecoderMLP(
201 (layer1): Linear(in_features=16, out_features=16, bias=True)
202 (layer2): Linear(in_features=16, out_features=16, bias=True)
203 (layer3): Linear(in_features=16, out_features=4, bias=True)
204 )
205 (query_embed): Embedding(200, 16)
206 (reference_points): Embedding(200, 4)
207 (presence_token): Embedding(1, 16)
208 (presence_head): Sam3DecoderMLP(
209 (layer1): Linear(in_features=16, out_features=16, bias=True)
210 (layer2): Linear(in_features=16, out_features=16, bias=True)
211 (layer3): Linear(in_features=16, out_features=1, bias=True)
212 )
213 (presence_layer_norm): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
214 (ref_point_head): Sam3DecoderMLP(
215 (layer1): Linear(in_features=32, out_features=16, bias=True)
216 (layer2): Linear(in_features=16, out_features=16, bias=True)
217 )
218 (box_rpb_embed_x): Sam3DecoderMLP(
219 (layer1): Linear(in_features=2, out_features=16, bias=True)
220 (layer2): Linear(in_features=16, out_features=2, bias=True)
221 )
222 (box_rpb_embed_y): Sam3DecoderMLP(
223 (layer1): Linear(in_features=2, out_features=16, bias=True)
224 (layer2): Linear(in_features=16, out_features=2, bias=True)
225 )
226 (position_encoding): Sam3SinePositionEmbedding()
227 )
228 (mask_decoder): Sam3MaskDecoder(
229 (pixel_decoder): Sam3PixelDecoder(
230 (conv_layers): ModuleList(
231 (0-2): 3 x Conv2d(16, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
232 )
233 (norms): ModuleList(
234 (0-2): 3 x GroupNorm(8, 16, eps=1e-05, affine=True)
235 )
236 )
237 (mask_embedder): Sam3MaskEmbedder(
238 (layers): ModuleList(
239 (0-2): 3 x Linear(in_features=16, out_features=16, bias=True)
240 )
241 (activation): ReLU()
242 )
243 (instance_projection): Conv2d(16, 16, kernel_size=(1, 1), stride=(1, 1))
244 (semantic_projection): Conv2d(16, 1, kernel_size=(1, 1), stride=(1, 1))
245 (prompt_cross_attn): Sam3Attention(
246 (q_proj): Linear(in_features=16, out_features=16, bias=True)
247 (k_proj): Linear(in_features=16, out_features=16, bias=True)
248 (v_proj): Linear(in_features=16, out_features=16, bias=True)
249 (o_proj): Linear(in_features=16, out_features=16, bias=True)
250 )
251 (prompt_cross_attn_norm): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
252 (prompt_cross_attn_dropout): Dropout(p=0.0, inplace=False)
253 )
254 (dot_product_scoring): Sam3DotProductScoring(
255 (text_mlp): Sam3DecoderMLP(
256 (layer1): Linear(in_features=16, out_features=32, bias=True)
257 (layer2): Linear(in_features=32, out_features=16, bias=True)
258 )
259 (text_mlp_dropout): Dropout(p=0.1, inplace=False)
260 (text_mlp_out_norm): LayerNorm((16,), eps=1e-05, elementwise_affine=True)
261 (text_proj): Linear(in_features=16, out_features=16, bias=True)
262 (query_proj): Linear(in_features=16, out_features=16, bias=True)
263 )
264)