Views
No views yet
facebook/EUPE-ViT-S and google/siglip2-base-patch16-224.
1import torch
2import torch.nn.functional as F
3from PIL import Image
4import requests
5import matplotlib.pyplot as plt
6from transformers import AutoModel, AutoTokenizer, AutoImageProcessor
7
8#-----------------------------------------------
9## Instantiate model and load to target device
10if torch.cuda.is_available(): device = "cuda"
11elif torch.backends.mps.is_available(): device = "mps"
12else: device = "cpu"
13model = AutoModel.from_pretrained("SimonSchwaiger/resireg_mini", trust_remote_code=True).to(device).eval()
14
15#-----------------------------------------------
16## Image inference
17url = "https://raw.githubusercontent.com/simonschwaiger/otas/main/img/demo/dataset_demo.png"
18img = Image.open(requests.get(url, stream=True).raw).convert("RGB")
19dense = model.encode_image(img) # [1, C, H, W]
20
21#-----------------------------------------------
22## Text inference
23prompt = "wooden bridge"
24prompts_neg = ["thing", "object", "stuff"] # Optional negative prompts for multi-class segmentation
25prompts = [prompt] + [p for p in prompts_neg]
26text = model.encode_text(prompts) # [K, C] (K = 1 + n_negatives)
27
28#-----------------------------------------------
29## Calculate dense similarity and perform optional multi-class voting
30dense_n = F.normalize(dense, dim=1)
31text_n = F.normalize(text, dim=-1)
32sims = torch.einsum("bchw,kc->bkhw", dense_n, text_n)[0] # [K, H, W]
33
34if len(prompts) > 1:
35 probs = F.softmax(sims / 2, dim=0)
36 sim = probs[0]
37else:
38 sim = sims[0]
39 sim_range = torch.clamp(sim.max() - sim.min(), min=0.2)
40 sim = (sim - sim.min()) / (sim_range + 1e-8)
41
42#-----------------------------------------------
43## Visualise resluting similarity heatmap
44heat = F.interpolate(
45 sim.unsqueeze(0).unsqueeze(0),
46 size=(img.height, img.width),
47 mode="bilinear",
48 align_corners=False,
49)[0, 0].cpu().numpy()
50
51plt.figure(figsize=(8, 8))
52plt.imshow(img)
53plt.imshow(heat, cmap="jet", alpha=0.45)
54plt.axis("off")
55plt.title(f"Patch/Text Cosine Similarity (ReSiReg-Lite): '{prompt}'")
56plt.tight_layout()
57plt.show()
58@article{schwaiger2026_resireg,
title = {{ReSiReg}: Towards Spatially Consistent Semantics in Language-Conditioned Robotic Tasks},
author = {Schwaiger, Simon and Seyser, David and Scherl, Alessandro and W{\"o}ber, Wilfried and Steinbauer-Wagner, Gerald},
journal = {arXiv preprint arXiv:2606.19088},
year = {2026},
url = {https://arxiv.org/abs/2606.19088}
}facebook/EUPE, facebook/EUPE-ViT-S): FAIR Noncommercial Research License
google/siglip2-base-patch16-224): Apache-2.0
1import torch
2import torch.nn.functional as F
3from PIL import Image
4import requests
5import matplotlib.pyplot as plt
6from transformers import AutoModel, AutoTokenizer, AutoImageProcessor
7
8if torch.cuda.is_available(): device = "cuda"
9elif torch.backends.mps.is_available(): device = "mps"
10else: device = "cpu"
11
12#-----------------------------------------------
13## Instantiate model and load to target device
14model = AutoModel.from_pretrained("SimonSchwaiger/resireg_mini", trust_remote_code=True).to(device).eval()
15tokenizer = AutoTokenizer.from_pretrained("SimonSchwaiger/resireg_mini", trust_remote_code=True)
16image_processor = AutoImageProcessor.from_pretrained("SimonSchwaiger/resireg_mini", trust_remote_code=True)
17
18#-----------------------------------------------
19## Load image, positive and optional negative prompts
20url = "https://raw.githubusercontent.com/simonschwaiger/otas/main/img/demo/dataset_demo.png"
21img = Image.open(requests.get(url, stream=True).raw).convert("RGB")
22prompt = "wooden bridge"
23prompts_neg = ["thing", "object", "stuff"] # Optional negative prompts for multi-class segmentation
24
25#-----------------------------------------------
26## Combined inference. The model.forward also supports individually encoding images or text
27prompts = [prompt] + [p for p in prompts_neg]
28pixel_values = image_processor(images=img, return_tensors="pt")["pixel_values"].to(device)
29tok = tokenizer(prompts, padding="max_length", truncation=True, max_length=64, return_tensors="pt")
30tok = {k: v.to(device) for k, v in tok.items()}
31with torch.no_grad():
32 out = model(
33 pixel_values=pixel_values,
34 input_ids=tok["input_ids"],
35 attention_mask=tok.get("attention_mask"),
36 )
37
38dense = out.dense_embeds_resireg_lite # [1, C, H, W]
39text = out.text_embeds # [K, C] (K = 1 + n_negatives)
40del out
41
42#-----------------------------------------------
43## Calculate dense similarity and perform optional multi-class voting
44dense_n = F.normalize(dense, dim=1)
45text_n = F.normalize(text, dim=-1)
46sims = torch.einsum("bchw,kc->bkhw", dense_n, text_n)[0] # [K, H, W]
47
48if len(prompts) > 1:
49 probs = F.softmax(sims / 2, dim=0)
50 sim = probs[0]
51else:
52 sim = sims[0]
53 sim_range = torch.clamp(sim.max() - sim.min(), min=0.2)
54 sim = (sim - sim.min()) / (sim_range + 1e-8)
55
56#-----------------------------------------------
57## Visualise resluting similarity heatmap
58heat = F.interpolate(
59 sim.unsqueeze(0).unsqueeze(0),
60 size=(img.height, img.width),
61 mode="bilinear",
62 align_corners=False,
63)[0, 0].cpu().numpy()
64
65plt.figure(figsize=(8, 8))
66plt.imshow(img)
67plt.imshow(heat, cmap="jet", alpha=0.45)
68plt.axis("off")
69plt.title(f"Patch/Text Cosine Similarity (ReSiReg-Lite): '{prompt}'")
70plt.tight_layout()
71plt.show()