查看 Markdown

SigLIP2

SigLIP2 是一个双塔(dual-tower)模型,它拿图像去和文本提示词打分,每个类别用一个独立的 sigmoid,而不是在一个固定的标签集合上共用一个 softmax。LibreYOLO 支持用它做零样本分类和图像/文本嵌入向量,没有训练这一步。

任务
classify, embed
尺寸
安装
pip install libreyolo
支持层级
兄弟层级,自 v 起。一个独立的产品面,有自己的工厂和契约。
上游
SigLIP 2,由 Google DeepMind 发布,采用 Apache-2.0 许可。论文源码
许可
代码采用 MIT,权重采用 Apache-2.0。商用

安装

SigLIP2 需要它自己的 extra,它会装上其多语言分词器所用到的 SentencePiece 包。

bash
pip install "libreyolo[siglip2]"

预测

权重在首次使用时从 Hugging Face 下载,并缓存在本地。

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreSigLIP2b16-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])result = model(SAMPLE_IMAGE, save=True) print(model.names[result.probs.top1], float(result.probs.top1conf))
CLI
# 不调用 set_classes() 时,CLI 的 predict 用的是模型默认加载的# 1,000 个 ImageNet 类别名libreyolo predict model=LibreSigLIP2b16-cls.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True
多标签 sigmoid 打分
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreSigLIP2b16-cls.pt")model.set_classes(["a dog", "a cat", "outdoors"], multi_label=True)r = model(SAMPLE_IMAGE) # 每个类别的概率互相独立:可以同时有多个类别得分很高,# 也可以一个都没有;默认的 softmax 则会把它们归一化成# 单标签分布,和 LibreCLIP 的行为一致for i, name in model.names.items():    print(name, float(r.probs.data[i]))
图像与文本嵌入向量
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreSigLIP2b16-cls.pt", task="embed")image_embed = model(SAMPLE_IMAGE).embeddings.datatext_embed = model.embed_text("a photo of a forklift") # 两者都做了 L2 归一化,所以直接点积就是余弦相似度similarity = (image_embed @ text_embed.T).item()

set_classes() 是让它成为开放词汇分类器的那一个原语:它把每个标签渲染进每一个提示词模板,编码之后取平均,并把得到的 [K, D] 矩阵缓存为分类器 head,所以不会每张图像重算一次。随时再调用一次就能更换类别。如果一次都不调用,LibreSigLIP2 加载时就已经设好了 1,000 个 ImageNet-1k 类别名。

SigLIP 对每个类别独立打分:logit = scale * (image . text) + bias。默认情况下,这组 logit 仍然会过一次 softmax,给出一个单标签分布,和 LibreCLIP 的 top1/top5 行为一致。给 set_classes()multi_label=True(或者在构造时传),就会换成互相独立的 sigmoid 概率,于是同一张图像上可以有多个类别得分很高,也可以一个都没有。分词器是一个多语言的 SentencePiece 模型(Gemma 词表),所以用英语以外的语言写类别名,效果是一样的。

task="embed" 时,预测对每个输入返回一个经过 L2 归一化的图像向量,而不是类别概率;embed_text() 返回同一个向量空间里归一化的文本行,所以两者之间直接点积就是余弦相似度。iou 对这两个任务都没有影响,也没有 NMS 这一步。数据源、流式处理和结果处理见预测

验证

val() 读取 ImageFolder train/ 划分下的类别文件夹名,用它们调用 set_classes(),然后在 softmax 打分下测量零样本的 top-1 和 top-5 精度。精度取决于这些类别名当作提示词读起来怎么样,而不是取决于任何权重更新,因为这里根本没有东西可训练。验证只覆盖 task="classify"task="embed" 没有数据集验证器。

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt") # data 是一个带 train/ 划分的 ImageFolder 根目录,它的文件夹名# 会成为本次运行的零样本类别提示词metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])
CLI
libreyolo val model=LibreSigLIP2b16-cls.pt data=imagenette160

导出

任务ONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
classifyclassify to ONNX:支持classify to TorchScript:支持classify to ExecuTorch:支持classify to TensorRT:支持classify to OpenVINO:支持classify to Paddle:不支持classify to MNN:不支持classify to RKNN:不支持classify to ncnn:不支持classify to TFLite:支持classify to CoreML:不支持classify to Core AI:支持
embedembed to ONNX:支持embed to TorchScript:支持embed to ExecuTorch:支持embed to TensorRT:支持embed to OpenVINO:支持embed to Paddle:不支持embed to MNN:不支持embed to RKNN:不支持embed to ncnn:不支持embed to TFLite:支持embed to CoreML:不支持embed to Core AI:不支持

导出会把模型当前的状态固化成一张静态计算图。对 task="classify" 来说,set_classes() 最后设置的那批标签,以及导出时的分辨率,会连同学到的 scale 和 bias 一起固化进最后一层线性层,所以导出的计算图就是一个普通的 [B, K] 图像分类器,没有文本塔,也没有分词器;改动类别或尺寸之后要重新导出。multi_label=True 模式下的导出没有实现,先把它设回 Falsetask="embed" 的导出只追踪图像塔。两者都需要 ONNX opset 14 或更高,导出器默认就设成了这个值。

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # 当前 set_classes() 设置的标签和输入分辨率会被固化进计算图,# 改动其中任何一个之后都要重新导出;导出时 multi_label 必须是# False,也就是默认值
CLI
# 这里没有调用 set_classes(),所以固化进去的是模型默认加载的# 1,000 个 ImageNet 类别libreyolo export model=LibreSigLIP2b16-cls.pt format=onnx
嵌入向量导出
from libreyolo import LibreYOLO # task="embed" 只追踪图像塔,不需要类别model = LibreYOLO("LibreSigLIP2b16-cls.pt", task="embed")model.export(format="onnx")

检查点

这个家族已发布的全部权重文件。两个都是从 Google 采用 Apache-2.0 许可的 siglip2-base-patch16-256siglip2-so400m-patch14-384 检查点(checkpoint)转换而来,而不是来自任何一次 COCO 训练。

文件输入(px)权重许可
classify
LibreSigLIP2b16-cls.ptapache-2.0
LibreSigLIP2so400m-cls.ptapache-2.0

上面的每个文件目前都在 LibreYOLO 组织中,并会在首次使用时下载。

许可证

请检查你所下载的具体权重在 Hugging Face 仓库中的许可。LibreYOLO 组织里的每个检查点都附有许可,同一家族内也不一定相同。该仓库是权威来源;以下摘要说明本页上次验证时适用的情况。

这里只说明涉及的许可证,不构成法律意见。如果答案对商用很重要,请自行阅读许可证并咨询法律顾问。

原始工作
SigLIP 2, Google DeepMind
上游许可
Apache-2.0
LibreYOLO 代码
MIT
权重
采用 Apache-2.0 许可,重新发布在 huggingface.co/LibreYOLO
解读
Apache-2.0 is a permissive license, so these weights can be used in commercial and closed-source products. It asks you to keep its license text and attribution notices with any copy of the weights you redistribute, and it grants a patent license. It places no obligation on your own application code. LibreSigLIP2's image and text towers are a clean-room re-implementation structured to match Hugging Face Transformers' SigLIP reference implementation, built without transformers as a runtime dependency; the multilingual SentencePiece tokenizer (Gemma vocabulary) is shipped verbatim from the Apache-2.0 google/siglip2-* release. The shipped checkpoints (b16, so400m) are converted from Google's Apache-2.0 siglip2-base-patch16-256 and siglip2-so400m-patch14-384 weights, a metadata wrap with the learned parameters unchanged. Training is not offered for this family: LibreSigLIP2 is zero-shot, and set_classes() replaces the fine-tuning step a trained classifier would otherwise need.

引用

@misc{tschannen2025siglip2multilingualvisionlanguage,
      title={SigLIP 2: Multilingual Vision-Language Encoders with Improved Semantic Understanding, Localization, and Dense Features}, 
      author={Michael Tschannen and Alexey Gritsenko and Xiao Wang and Muhammad Ferjad Naeem and Ibrahim Alabdulmohsin and Nikhil Parthasarathy and Talfan Evans and Lucas Beyer and Ye Xia and Basil Mustafa and Olivier Hénaff and Jeremiah Harmsen and Andreas Steiner and Xiaohua Zhai},
      year={2025},
      eprint={2502.14786},
      archivePrefix={arXiv},
      primaryClass={cs.CV},
      url={https://arxiv.org/abs/2502.14786}, 
}

复制自作者在 huggingface.co/google/siglip2-base-patch16-256#bibtex-entry-and-citation-info 上提供的引用块。

已针对 LibreYOLO v1.5.0 验证。本页的支持表、检查点和基准测试数据由已发布的库和权重生成,并非手工编写。