SigLIP2

SigLIP2는 고정 레이블 집합에 공유 softmax를 적용하는 대신 클래스마다 독립 sigmoid로 이미지와 텍스트 프롬프트의 점수를 비교하는 이중 타워 모델입니다. LibreYOLO는 학습 단계 없이 제로샷 분류와 이미지/텍스트 임베딩을 지원합니다.

작업
classify, embed
크기
설치
pip install libreyolo
지원 티어
별도 티어, v부터 지원. 자체 팩토리와 계약을 갖춘 별도의 제품 영역입니다.
업스트림
Google DeepMind의 SigLIP 2, Apache-2.0. 논문, 소스
라이선스
코드 MIT, 가중치 Apache-2.0. 상업적 사용

설치

SigLIP2에는 전용 extra가 필요합니다. 이 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는 모델이 기본으로 불러오는# ImageNet 클래스 이름 1,000개를 사용합니다.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] 행렬을 분류기 헤드로 캐시하므로 이미지마다 다시 계산하지 않습니다. 언제든 다시 호출해 클래스를 바꿀 수 있습니다. 호출하지 않으면 LibreSigLIP2는 ImageNet-1k 클래스 이름 1,000개가 이미 설정된 상태로 불러옵니다.

SigLIP은 각 클래스에 독립적으로 점수를 매깁니다. 공식은 logit = scale * (image . text) + bias입니다. 기본적으로 이 logit 집합에도 softmax를 적용하여 LibreCLIP의 top1/top5 동작과 일치하는 단일 레이블 분포를 만듭니다. set_classes() 또는 생성 시 multi_label=True를 전달하면 독립 sigmoid 확률로 전환되어 같은 이미지에서 둘 이상의 클래스 또는 아무 클래스도 높은 점수를 받을 수 있습니다. 토크나이저는 Gemma 어휘의 다국어 SentencePiece 모델이므로 영어 외 언어의 클래스 이름도 같은 방식으로 작동합니다.

task="embed"를 사용하면 예측이 클래스 확률 대신 입력마다 L2 정규화된 이미지 벡터 하나를 반환합니다. embed_text()는 같은 벡터 공간에서 정규화된 텍스트 행을 반환하므로 둘 사이의 일반 내적이 코사인 유사도입니다. 두 작업 모두 NMS 단계가 없으므로 iou는 영향을 주지 않습니다. 소스, 스트리밍, 결과 처리는 예측을 참조합니다.

검증

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 모드의 내보내기는 구현되지 않았으므로 먼저 False로 되돌립니다. task="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()를 호출하지 않으므로 모델이 불러온 기본# ImageNet 클래스 1,000개가 고정됩니다.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")

체크포인트

이 계열에 공개된 모든 가중치 파일입니다. 두 체크포인트는 모두 COCO 학습 결과가 아니라 Google의 Apache-2.0 siglip2-base-patch16-256siglip2-so400m-patch14-384 체크포인트를 변환한 것입니다.

파일입력(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에서 검증되었습니다. 이 페이지의 지원 표, 체크포인트, 벤치마크 수치는 출시된 라이브러리와 공개된 가중치에서 생성되며 수동으로 작성되지 않습니다.