ILD

siglip2 inference
作者:Yuan Jianpeng 邮箱:yuanjp89@163.com
发布时间:2026-10-21 站点:Inside Linux Development

计算出图像和文本的向量,归一化后,计算余弦相似度。然后计算概率。

import torch
import torch.nn.functional as F
from PIL import Image
from transformers import AutoProcessor, AutoModel

model = AutoModel.from_pretrained("./my_local_siglip").eval()
processor = AutoProcessor.from_pretrained("./my_local_siglip")

# ---------- 图片特征 ----------
image = Image.open("你的图片.jpg").convert("RGB")
image_inputs = processor(images=image, return_tensors="pt")
with torch.no_grad():
    image_features = model.get_image_features(**image_inputs)

if not isinstance(image_features, torch.Tensor):
    image_features = image_features.pooler_output

# ---------- 文本特征 ----------
texts = ["一只乌龟", "一只猫", "一张风景照"]
text_inputs = processor(text=texts, padding="max_length", return_tensors="pt")
with torch.no_grad():
    text_features = model.get_text_features(**text_inputs)

if not isinstance(text_features, torch.Tensor):
    text_features = text_features.pooler_output

# ---------- 打印特征 ----------
print("image_features shape:", image_features.shape)
print("image_features[:5]:", image_features[0, :5])
print("text_features shape:", text_features.shape)
print("text_features[:3, :5]:", text_features[:3, :5])

# ---------- 归一化 + 余弦相似度 ----------
image_features_n = F.normalize(image_features, dim=-1)
text_features_n = F.normalize(text_features, dim=-1)
similarity = image_features_n @ text_features_n.T

print("similarity shape:", similarity.shape)
print("similarity (cosine):", similarity)

# ---------- 套用 SigLIP 打分公式 ----------
# 从模型里取出 logit_scale 和 logit_bias
logit_scale = model.logit_scale.exp()      # 注意:模型里存的是 log(scale),要 exp 还原
logit_bias = model.logit_bias

print("logit_scale (exp后):", logit_scale.item())
print("logit_bias:", logit_bias.item())

# SigLIP 公式: logit = scale * cosine + bias
logits = logit_scale * similarity + logit_bias

# sigmoid 得到概率
probs = torch.sigmoid(logits)

print("logits:", logits)
print("probs (与pipeline对齐):", probs)

# ---------- 按概率排序打印 ----------
for i, text in enumerate(texts):
    print(f"标签:{text},概率:{probs[0][i]:.2%}")


输出结果

D:\>python siglip2_sim.py
[transformers] Model config: bos_token_id must be `None` or an integer within the vocabulary (between 0 and 31999), got 49406. This may result in unexpected behavior.
[transformers] Model config: eos_token_id must be `None` or an integer within the vocabulary (between 0 and 31999), got 49407. This may result in unexpected behavior.
Loading weights: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 792/792 [00:01<00:00, 610.77it/s]
image_features shape: torch.Size([1, 1024])
image_features: tensor([[ 0.4702,  0.3278,  0.0822,  ...,  0.0059, -0.2070,  0.1430]])
text_features shape: torch.Size([3, 1024])
text_features: tensor([[-0.0905,  0.1456,  0.1879,  ..., -0.1348, -0.4561,  0.3933],
        [ 0.5858, -0.0117, -0.2989,  ...,  0.4996, -0.2518,  1.1217],
        [ 0.1977,  0.1644, -0.1696,  ...,  0.0288, -0.0876,  0.6664]])
similarity shape: torch.Size([1, 3])
similarity: tensor([[0.1704, 0.0758, 0.0875]])
similarity shape: torch.Size([1, 3])
similarity (cosine): tensor([[0.1704, 0.0758, 0.0875]])
logit_scale (exp后): 107.9853286743164
logit_bias: -16.347614288330078
logits: tensor([[ 2.0506, -8.1654, -6.9033]], grad_fn=<AddBackward0>)
probs (与pipeline对齐): tensor([[8.8601e-01, 2.8424e-04, 1.0035e-03]], grad_fn=<SigmoidBackward0>)
标签:一只乌龟,概率:88.60%
标签:一只猫,概率:0.03%
标签:一张风景照,概率:0.10%


可以看出乌龟的相似度只有0.1704,和猫的相似度0.0758差距不大。

但是算出来的概率确差距很大,一个88%接近1,一个0.03%接近0。

prob = sigmoid(logit_scale.exp() * cosine + logit_bias)


model.get_image_features() 是 SiglipModel(或 Siglip2Model)类的一个方法,它在内部调用了模型的视觉塔(vision_model),并额外接上一个投影层,最终输出图像的特征向量。

Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.