SigLIP2
SigLIP2 là mô hình hai tower chấm điểm ảnh theo các prompt văn bản bằng sigmoid độc lập cho từng lớp, thay vì softmax dùng chung trên một tập nhãn cố định. LibreYOLO hỗ trợ mô hình để phân loại zero-shot và tạo embedding ảnh/văn bản mà không cần bước huấn luyện.
- Tác vụ
- classify, embed
- Kích thước
- Cài đặt
pip install libreyolo- Bậc hỗ trợ
- Bậc song hành, từ v. Một bề mặt sản phẩm riêng với factory và contract riêng.
- Giấy phép
- Mã nguồn MIT, trọng số Apache-2.0. Sử dụng thương mại
Cài đặt
SigLIP2 cần extra riêng, extra này cài thêm gói SentencePiece mà tokenizer đa ngôn ngữ sử dụng.
pip install "libreyolo[siglip2]"Dự đoán
Trọng số được tải từ Hugging Face ở lần dùng đầu tiên và lưu vào bộ nhớ đệm cục bộ.
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))# Khi không gọi set_classes(), dự đoán bằng CLI dùng 1.000 tên lớp# ImageNet mà mô hình tải theo mặc định.libreyolo predict model=LibreSigLIP2b16-cls.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom 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) # Xác suất độc lập theo lớp: nhiều lớp hoặc không lớp nào có thể cùng# đạt điểm cao. Softmax (mặc định) chuẩn hóa chúng thành phân phối# đơn nhãn, khớp với hành vi của 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") # Cả hai đều được chuẩn hóa L2, nên tích vô hướng thông thường là độ tương đồng cosine.similarity = (image_embed @ text_embed.T).item()set_classes() là thao tác cơ bản biến mô hình thành bộ phân loại open-vocabulary: phương thức kết xuất từng nhãn vào mọi mẫu prompt, mã hóa và lấy trung bình kết quả, rồi lưu ma trận [K, D] thu được làm head phân loại trong bộ nhớ đệm để không phải tính lại theo từng ảnh. Gọi lại phương thức bất cứ lúc nào để đổi lớp. Nếu không gọi, LibreSigLIP2 tải với 1.000 tên lớp ImageNet-1k đã được đặt sẵn.
SigLIP chấm điểm từng lớp độc lập: logit = scale * (image . text) + bias. Theo mặc định, tập logit vẫn được đưa qua softmax để tạo phân phối đơn nhãn khớp với hành vi top1/top5 của LibreCLIP. Truyền multi_label=True vào set_classes() (hoặc khi khởi tạo) sẽ chuyển sang các xác suất sigmoid độc lập, vì vậy nhiều lớp hoặc không lớp nào có thể đạt điểm cao trên cùng một ảnh. Tokenizer là mô hình SentencePiece đa ngôn ngữ (từ vựng Gemma), nên tên lớp ở ngôn ngữ khác tiếng Anh hoạt động theo cùng cách.
Với task="embed", dự đoán trả về một vector ảnh đã chuẩn hóa L2 cho mỗi đầu vào thay vì xác suất lớp, còn embed_text() trả về các hàng văn bản đã chuẩn hóa trong cùng không gian vector, vì vậy tích vô hướng thông thường giữa chúng là độ tương đồng cosine. iou không tác động đến cả hai tác vụ; không có bước NMS. Xem dự đoán để biết về nguồn, streaming và xử lý kết quả.
Đánh giá
val() đọc tên thư mục lớp trong phần chia train/ của ImageFolder, gọi set_classes() với các tên đó, rồi đo độ chính xác zero-shot top-1 và top-5 theo cách chấm điểm softmax. Độ chính xác phụ thuộc vào cách tên lớp được diễn đạt thành prompt chứ không phụ thuộc vào cập nhật trọng số vì không có gì để huấn luyện. Việc đánh giá chỉ bao quát task="classify"; task="embed" không có bộ đánh giá tập dữ liệu.
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt") # data là thư mục gốc ImageFolder có phần chia train/; tên các thư mục# trở thành prompt lớp zero-shot cho lượt chạy này.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])libreyolo val model=LibreSigLIP2b16-cls.pt data=imagenette160Xuất
| Tác vụ | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| classify | classify to ONNX: được hỗ trợ | classify to TorchScript: được hỗ trợ | classify to ExecuTorch: được hỗ trợ | classify to TensorRT: được hỗ trợ | classify to OpenVINO: được hỗ trợ | classify to Paddle: không được hỗ trợ | classify to MNN: không được hỗ trợ | classify to RKNN: không được hỗ trợ | classify to ncnn: không được hỗ trợ | classify to TFLite: được hỗ trợ | classify to CoreML: không được hỗ trợ | classify to Core AI: được hỗ trợ |
| embed | embed to ONNX: được hỗ trợ | embed to TorchScript: được hỗ trợ | embed to ExecuTorch: được hỗ trợ | embed to TensorRT: được hỗ trợ | embed to OpenVINO: được hỗ trợ | embed to Paddle: không được hỗ trợ | embed to MNN: không được hỗ trợ | embed to RKNN: không được hỗ trợ | embed to ncnn: không được hỗ trợ | embed to TFLite: được hỗ trợ | embed to CoreML: không được hỗ trợ | embed to Core AI: không được hỗ trợ |
Quá trình xuất nhúng trạng thái hiện tại của mô hình vào đồ thị cố định. Với task="classify", các nhãn được set_classes() đặt gần nhất cùng độ phân giải tại thời điểm xuất được nhúng vào lớp tuyến tính cuối với scale và bias đã học, vì vậy đồ thị đã xuất là bộ phân loại ảnh [B, K] thông thường, không có text tower hay tokenizer; hãy xuất lại sau khi đổi lớp hoặc kích thước. Chưa triển khai xuất ở chế độ multi_label=True; trước tiên hãy đặt lại thành False. Xuất task="embed" chỉ truy vết image tower. Cả hai cần ONNX opset 14 trở lên, được trình xuất đặt theo mặc định.
from libreyolo import LibreYOLO model = LibreYOLO("LibreSigLIP2b16-cls.pt")model.set_classes(["a forklift", "an empty aisle", "a spill"])model.export(format="onnx") # Các nhãn set_classes() hiện tại và độ phân giải đầu vào được nhúng# vào đồ thị. Hãy xuất lại sau khi thay đổi một trong hai. multi_label# phải là False (mặc định) khi xuất.# Không gọi set_classes() ở đây, nên thao tác này nhúng 1.000 lớp# ImageNet mặc định mà mô hình tải.libreyolo export model=LibreSigLIP2b16-cls.pt format=onnxfrom libreyolo import LibreYOLO # task="embed" chỉ truy vết image tower; không cần lớp.model = LibreYOLO("LibreSigLIP2b16-cls.pt", task="embed")model.export(format="onnx")Checkpoint
Mọi tệp trọng số đã công bố cho họ này. Cả hai đều được chuyển đổi từ các checkpoint siglip2-base-patch16-256 và siglip2-so400m-patch14-384 theo Apache-2.0 của Google, không phải từ bất kỳ lượt huấn luyện COCO nào.
| Tệp | Đầu vào (px) | Giấy phép trọng số |
|---|---|---|
| classify | ||
| LibreSigLIP2b16-cls.pt | apache-2.0 | |
| LibreSigLIP2so400m-cls.pt | apache-2.0 | |
Mọi tệp ở trên hiện đều có trong tổ chức LibreYOLO và được tải xuống trong lần sử dụng đầu tiên.
Giấy phép
Hãy kiểm tra giấy phép trong repo Hugging Face của trọng số cụ thể mà bạn tải xuống. Mỗi checkpoint trong tổ chức LibreYOLO đều có giấy phép riêng và giấy phép có thể khác nhau trong cùng một họ. Repo đó là nguồn có thẩm quyền; phần tóm tắt dưới đây mô tả các điều khoản áp dụng khi trang này được kiểm chứng lần gần nhất.
Đây là phần mô tả các giấy phép liên quan, không phải tư vấn pháp lý. Nếu câu trả lời có ý nghĩa về mặt thương mại, hãy tự đọc các giấy phép và tham khảo cố vấn của riêng bạn.
- Công trình gốc
- SigLIP 2, Google DeepMind
- Giấy phép thượng nguồn
- Apache-2.0
- Nguồn thượng nguồn
- github.com/huggingface/transformers
- Mã nguồn LibreYOLO
- MIT
- Trọng số
- Apache-2.0, được phát hành lại tại huggingface.co/LibreYOLO
- Diễn giải
- 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.
Trích dẫn
@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},
}Được sao chép từ khối trích dẫn của tác giả tại huggingface.co/google/siglip2-base-patch16-256#bibtex-entry-and-citation-info.