DINOv2
DINOv2 adalah vision transformer self-supervised yang dilatih oleh Meta AI untuk menghasilkan fitur gambar serbaguna tanpa label. LibreYOLO membungkus backbone DINOv2-with-Registers untuk tiga task: segmentasi semantik, klasifikasi, dan embedding seluruh gambar.
- Task
- semantic, classify, embed
- Ukuran
- n, s, m, l at 518 px
- Instalasi
pip install libreyolo- Tier dukungan
- Didukung, sejak v. Model pendukung yang dapat dilatih: CI dijaga tetap lulus, fitur ditambahkan saat ada kesempatan.
- Lisensi
- Kode MIT, bobot Apache-2.0. Penggunaan komersial
Instalasi
LibreDINOv2 hanya terdaftar saat transformers terpasang. Ini adalah dependency
opsional yang juga diperlukan RF-DETR untuk backbone DINOv2, sehingga extra yang
diperlukan pun sama.
pip install "libreyolo[rfdetr]"Prediksi
LibreYOLO tidak memublikasikan checkpoint LibreDINOv2. Buat wrapper secara
langsung alih-alih memuat berkas: model_path=None (default) mengunduh backbone
facebook/dinov2-with-registers-small berlisensi Apache-2.0 milik Meta dari
Hugging Face saat pertama kali digunakan. task= memilih apa yang dijalankan
di atasnya.
from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # Tidak ada checkpoint yang dihosting LibreYOLO untuk family ini. Kode ini# mengunduh backbone DINOv2-with-Registers-small berlisensi Apache-2.0 dari# organisasi Hugging Face milik Meta. Head padat dimulai dengan# inisialisasi acak sampai model dilatih (lihat Pelatihan di bawah).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= adalah jumlah kelas dataset Anda. Head linear dimulai# dengan inisialisasi acak sampai model dilatih.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 # Melewati setiap head task. Backbone saja sudah cukup, sehingga# fine-tuning tidak diperlukan agar berguna.model = LibreDINOv2(size="s", task="embed")result = model(SAMPLE_IMAGE) print(result.embeddings.data.shape) # (1, D), dinormalisasi L2from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="embed") # Wrapper praktis: menjalankan predict() dan menumpuk setiap baris menjadi satu# tensor (N, D).features = model.embed(["a.jpg", "b.jpg", "c.jpg"])print(features.shape)task="semantic" dan task="classify" menambahkan head padat atau linear di
atas backbone. Head tersebut diinisialisasi secara acak dan hanya berguna
setelah dilatih (lihat Pelatihan). task="embed" melewati setiap
head dan mengembalikan token CLS terakhir backbone yang telah dinormalisasi
sebagai satu baris seluruh gambar dalam result.embeddings, sehingga tidak
memerlukan pelatihan sama sekali. result.boxes selalu None: tidak satu pun
dari ketiga task menghasilkan deteksi per instance. Lihat
prediksi untuk sumber, streaming, dan penanganan hasil.
Varian
size memilih lebar projector bergaya RF-DETR yang dilapiskan di atas backbone,
bukan backbone itu sendiri. Setiap ukuran memakai encoder DINOv2-S (small) yang
sama. Segmentasi semantik berjalan pada grid patch persegi native DINOv2,
sedangkan klasifikasi dan embedding berjalan pada resolusi klasifikasi lebih
kecil yang digunakan untuk melatih linear probe.
Pelatihan
task="semantic" dan task="classify" dapat dilatih. task="embed" tidak
memiliki head yang bergantung pada kelas untuk di-fit dan memunculkan
NotImplementedError jika train() dipanggil padanya.
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",)Argumen kata kunci utama di sini adalah batch_size dan lr, bukan batch
dan lr0 yang digunakan sebagian besar family lain. batch dan lr0 tetap
diterima dan dipetakan ke argumen tersebut, tetapi meneruskan keduanya
memunculkan error konflik. output_dir= (default "runs/train") menggantikan
project=/name= sebagai cara utama untuk menempatkan sebuah run, meskipun
project=/name= tetap dapat diteruskan secara langsung. Lihat
pelatihan untuk dataset, augmentasi, multi-GPU, dan logger.
Validasi
val() mengembalikan dictionary key metrics/: mIoU dan akurasi piksel untuk
task="semantic", serta akurasi top-1 dan top-5 untuk task="classify".
task="embed" tidak memiliki ground truth sebagai pembanding skor dan
memunculkan NotImplementedError jika val() dipanggil padanya.
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"])Ekspor
| Task | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic to ONNX: didukung | semantic to TorchScript: didukung | semantic to ExecuTorch: didukung | semantic to TensorRT: didukung | semantic to OpenVINO: didukung | semantic to Paddle: tidak didukung | semantic to MNN: tidak didukung | semantic to RKNN: tidak didukung | semantic to ncnn: tidak didukung | semantic to TFLite: tidak didukung | semantic to CoreML: tidak didukung | semantic to Core AI: tidak didukung |
| classify | classify to ONNX: didukung | classify to TorchScript: didukung | classify to ExecuTorch: didukung | classify to TensorRT: didukung | classify to OpenVINO: didukung | classify to Paddle: tidak didukung | classify to MNN: tidak didukung | classify to RKNN: tidak didukung | classify to ncnn: tidak didukung | classify to TFLite: tidak didukung | classify to CoreML: tidak didukung | classify to Core AI: didukung |
| embed | embed to ONNX: didukung | embed to TorchScript: didukung | embed to ExecuTorch: didukung | embed to TensorRT: didukung | embed to OpenVINO: didukung | embed to Paddle: tidak didukung | embed to MNN: tidak didukung | embed to RKNN: tidak didukung | embed to ncnn: tidak didukung | embed to TFLite: didukung | embed to CoreML: tidak didukung | embed to Core AI: tidak didukung |
Setiap task mendukung subset format yang berbeda, seperti ditampilkan di atas.
Artefak hasil ekspor dapat dimuat kembali melalui LibreYOLO() berdasarkan
akhiran berkasnya, sehingga berkas .onnx atau .engine berperilaku seperti
checkpoint dan mengembalikan Results yang sama. Ekspor
mencantumkan argumen yang diterima oleh setiap format.
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 merutekan berdasarkan akhiran berkas, sehingga artefak hasil ekspor dimuat# seperti checkpoint lain dan mengembalikan objek Results yang sama. Ekspor# menamai berkas berdasarkan task, dalam contoh ini LibreDINOv2s-sem.onnx.model = LibreYOLO("LibreDINOv2s-sem.onnx")result = model(SAMPLE_IMAGE)Lisensi
Periksa lisensi di repositori Hugging Face untuk bobot tertentu yang diunduh. Setiap checkpoint di organisasi LibreYOLO memiliki lisensi, dan lisensinya tidak selalu sama dalam satu family. Repositori tersebut adalah sumber resmi. Ringkasan di bawah menjelaskan ketentuan yang berlaku saat halaman ini terakhir diverifikasi.
Ini adalah deskripsi lisensi yang terlibat, bukan nasihat hukum. Jika jawabannya penting secara komersial, baca sendiri lisensinya dan mintalah nasihat dari penasihat hukum Anda.
- Karya asli
- DINOv2, Meta AI (FAIR)
- Lisensi upstream
- Apache-2.0
- Sumber upstream
- github.com/facebookresearch/dinov2
- Kode LibreYOLO
- MIT
- Bobot
- Apache-2.0, didistribusikan oleh penulisnya. LibreYOLO tidak menghosting atau mencerminkannya.
- Interpretasi
- 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.
Baris "Weights" di atas menyebutkan lisensi yang berlaku, yaitu Apache-2.0,
tetapi tidak ada apa pun yang benar-benar dipublikasikan ulang di organisasi
Hugging Face LibreYOLO untuk family ini. LibreYOLO tidak menghosting checkpoint
LibreDINOv2 miliknya sendiri. Yang diunduh oleh
LibreDINOv2(model_path=None) adalah repository
facebook/dinov2-with-registers-small milik Meta, tanpa perubahan.
Sitasi
@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}
}Disalin dari blok sitasi penulis di github.com/facebookresearch/dinov2#citing-dinov2.