DINOv2
DINOv2 là vision transformer tự giám sát được Meta AI huấn luyện để tạo đặc trưng ảnh đa dụng mà không cần nhãn. LibreYOLO bọc backbone DINOv2-with-Registers cho ba tác vụ: phân đoạn ngữ nghĩa, phân loại và tạo embedding toàn ảnh.
- Tác vụ
- semantic, classify, embed
- Kích thước
- n, s, m, l at 518 px
- Cài đặt
pip install libreyolo- Bậc hỗ trợ
- Được hỗ trợ, từ v. Các mô hình huấn luyện bổ trợ: luôn giữ CI ở trạng thái xanh, tính năng được bổ sung khi có cơ hội.
- Giấy phép
- Mã nguồn MIT, trọng số Apache-2.0. Sử dụng thương mại
Cài đặt
LibreDINOv2 chỉ đăng ký khi đã cài transformers, cùng dependency tùy chọn mà RF-DETR cần cho backbone DINOv2, vì vậy mô hình cần cùng extra.
pip install "libreyolo[rfdetr]"Dự đoán
LibreYOLO không phát hành checkpoint LibreDINOv2. Thay vì tải tệp, hãy khởi tạo trực tiếp wrapper: model_path=None (mặc định) tải backbone facebook/dinov2-with-registers-small Apache-2.0 của Meta từ Hugging Face trong lần sử dụng đầu tiên. task= chọn nội dung chạy bên trên backbone.
from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # Không có checkpoint do LibreYOLO host cho họ mô hình này: đoạn này# tải backbone DINOv2-with-Registers-small Apache-2.0 từ tổ chức# Hugging Face của Meta. Dense head bắt đầu với khởi tạo ngẫu nhiên# cho đến khi bạn huấn luyện nó (xem phần Huấn luyện bên dưới).model = LibreDINOv2(size="s", task="semantic", nb_classes=19)result = model(SAMPLE_IMAGE) mask = result.semantic_maskprint(mask.data.shape, mask.classes)from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # nb_classes= là số lớp đối tượng của dataset; linear head bắt đầu# với khởi tạo ngẫu nhiên cho đến khi bạn huấn luyện nó.model = LibreDINOv2(size="s", task="classify", nb_classes=10)result = model(SAMPLE_IMAGE) print(result.probs.top1, result.probs.top1conf)from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # Bỏ qua mọi task head: chỉ backbone là đủ, vì vậy cách này# không cần tinh chỉnh để trở nên hữu ích.model = LibreDINOv2(size="s", task="embed")result = model(SAMPLE_IMAGE) print(result.embeddings.data.shape) # (1, D), được chuẩn hóa L2from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="embed") # Wrapper tiện ích: chạy predict() và xếp mọi hàng vào một# tensor (N, D).features = model.embed(["a.jpg", "b.jpg", "c.jpg"])print(features.shape)task="semantic" và task="classify" thêm dense head hoặc linear head trên backbone; head đó được khởi tạo ngẫu nhiên và chỉ hữu ích sau khi bạn huấn luyện (xem Huấn luyện). task="embed" bỏ qua mọi head và trả về token CLS được chuẩn hóa cuối cùng của backbone dưới dạng một hàng toàn ảnh trong result.embeddings, vì vậy hoàn toàn không cần huấn luyện. result.boxes luôn là None: không tác vụ nào trong ba tác vụ tạo detection theo từng thực thể. Xem dự đoán để biết về nguồn, xử lý luồng và kết quả.
Biến thể
size chọn độ rộng projector kiểu RF-DETR được xếp trên backbone, không chọn chính backbone: mọi kích thước dùng chung encoder DINOv2-S (small). Phân đoạn ngữ nghĩa chạy ở lưới patch vuông nguyên bản của DINOv2; phân loại và embedding chạy ở độ phân giải phân loại nhỏ hơn dùng để huấn luyện linear probe.
Huấn luyện
task="semantic" và task="classify" đều có thể huấn luyện; task="embed" không có head phụ thuộc lớp đối tượng để fit và phát sinh NotImplementedError nếu bạn gọi train() trên tác vụ này.
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.train(data="my-dataset.yaml", epochs=100, batch_size=4, lr=1e-4)from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)model.train(data="my-dataset.yaml", epochs=100, batch_size=4, lr=1e-4)from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.train( data="my-dataset.yaml", epochs=100, batch_size=4, lr=1e-4, device="0,1",)Các đối số keyword chính ở đây là batch_size và lr, không phải batch và lr0 như hầu hết các họ mô hình khác; batch và lr0 vẫn được chấp nhận và ánh xạ sang chúng, nhưng truyền cả hai sẽ phát sinh lỗi xung đột. output_dir= (mặc định "runs/train") thay thế project=/name= làm cách chính để đặt vị trí lượt chạy, dù truyền trực tiếp project=/name= vẫn hoạt động. Xem huấn luyện để biết về dataset, tăng cường dữ liệu (data augmentation), multi-GPU và logger.
Xác thực
val() trả về dictionary gồm các key metrics/: mIoU và độ chính xác pixel cho task="semantic", độ chính xác top-1 và top-5 cho task="classify". task="embed" không có ground truth để chấm điểm và phát sinh NotImplementedError nếu bạn gọi val() trên tác vụ này.
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mIoU"])print(metrics["metrics/pixel_accuracy"])from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])Xuất
| Tác vụ | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic to ONNX: được hỗ trợ | semantic to TorchScript: được hỗ trợ | semantic to ExecuTorch: được hỗ trợ | semantic to TensorRT: được hỗ trợ | semantic to OpenVINO: được hỗ trợ | semantic to Paddle: không được hỗ trợ | semantic to MNN: không được hỗ trợ | semantic to RKNN: không được hỗ trợ | semantic to ncnn: không được hỗ trợ | semantic to TFLite: không được hỗ trợ | semantic to CoreML: không được hỗ trợ | semantic to Core AI: không được hỗ trợ |
| 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: không đượ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ợ |
Mỗi tác vụ hỗ trợ một tập con định dạng khác nhau như hiển thị ở trên. Artifact đã xuất được tải lại qua LibreYOLO() dựa trên hậu tố tệp, vì vậy tệp .onnx hoặc .engine hoạt động như checkpoint và trả về cùng đối tượng Results. Trang Xuất liệt kê các đối số mà mọi định dạng chấp nhận.
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.export(format="onnx")from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)model.export(format="onnx")from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="embed")model.export(format="tflite")from libreyolo import LibreYOLO, SAMPLE_IMAGE # Factory định tuyến dựa trên hậu tố tệp, vì vậy artifact đã xuất tải# như mọi checkpoint và trả về cùng đối tượng Results. Thao tác xuất# đặt tên tệp theo tác vụ, ở đây là LibreDINOv2s-sem.onnx.model = LibreYOLO("LibreDINOv2s-sem.onnx")result = model(SAMPLE_IMAGE)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
- DINOv2, Meta AI (FAIR)
- Giấy phép thượng nguồn
- Apache-2.0
- Nguồn thượng nguồn
- github.com/facebookresearch/dinov2
- Mã nguồn LibreYOLO
- MIT
- Trọng số
- Apache-2.0, do tác giả phân phối. LibreYOLO không lưu trữ hoặc sao chép chúng.
- 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. LibreYOLO does not host or republish a DINOv2 checkpoint of its own: LibreDINOv2 downloads the pretrained backbone directly from Meta's facebook/dinov2-with-registers-small repository on Hugging Face the first time it runs, unmodified. The semantic and classification heads start at random initialization until you train them, since LibreYOLO does not publish a trained head for this family.
Hàng "Trọng số" bên trên nêu giấy phép áp dụng là Apache-2.0, nhưng thực tế không có gì được phát hành lại dưới tổ chức LibreYOLO trên Hugging Face cho họ mô hình này: LibreYOLO không host checkpoint LibreDINOv2 riêng. Nội dung mà LibreDINOv2(model_path=None) tải là repo facebook/dinov2-with-registers-small của chính Meta, không qua chỉnh sửa.
Trích dẫn
@misc{oquab2023dinov2,
title={DINOv2: Learning Robust Visual Features without Supervision},
author={Oquab, Maxime and Darcet, Timothée and Moutakanni, Theo and Vo, Huy V. and Szafraniec, Marc and Khalidov, Vasil and Fernandez, Pierre and Haziza, Daniel and Massa, Francisco and El-Nouby, Alaaeldin and Howes, Russell and Huang, Po-Yao and Xu, Hu and Sharma, Vasu and Li, Shang-Wen and Galuba, Wojciech and Rabbat, Mike and Assran, Mido and Ballas, Nicolas and Synnaeve, Gabriel and Misra, Ishan and Jegou, Herve and Mairal, Julien and Labatut, Patrick and Joulin, Armand and Bojanowski, Piotr},
journal={arXiv:2304.07193},
year={2023}
}Được sao chép từ khối trích dẫn của tác giả tại github.com/facebookresearch/dinov2#citing-dinov2.