Deteksi open-vocabulary
Deteksi open-vocabulary mengganti list kelas tetap checkpoint dengan kata yang dipilih saat pemanggilan. Di LibreYOLO, ini bukan task terpisah: ini adalah task detect yang dilayani tier model terpisah, dimuat melalui factory LibreOpenVocab, bukan LibreYOLO.
Definisi
Deteksi open-vocabulary mengembalikan Results deteksi biasa: bounding box, confidence,
dan indeks kelas, dengan result.names memetakan indeks ke string yang diminta.
Perubahannya adalah sumber list kelas. Detektor konvensional dilatih terhadap
kumpulan kategori tetap dan tidak pernah menghasilkan kategori di luar
kumpulan tersebut. Model ini menerima vocabulary sebagai teks saat inferensi,
sehingga set_classes(["forklift", "safety cone"]) cukup untuk menjadikannya
kelas.
LibreYOLO tidak memiliki kunci task open-vocabulary. Model ini mendeklarasikan
SUPPORTED_TASKS = ("detect",) seperti detektor lain. Pemisahnya adalah jalur
pemuatan: model berupa snapshot Hugging Face, bukan checkpoint state dict
LibreYOLO, sehingga tidak masuk factory LibreYOLO() dan dibuat melalui
LibreOpenVocab(). Factory tersebut adalah sibling LibreSAM() dan
LibreVLM(), bukan pengganti LibreYOLO().
Skor merupakan skor deteksi nyata, bukan caption hasil generasi yang diurai. Setiap family menilai region gambar terhadap embedding teks setiap prompt.
Model
Empat family membentuk tier ini dan semuanya hanya memprediksi. Muat family
berdasarkan alias melalui LibreOpenVocab.
Grounding DINO dari IDEA Research, dalam ukuran
t dan b. Ini adalah default tier dan satu-satunya family yang menerima
text_threshold, cutoff kedua untuk skor token frasa hasil decode.
OWLv2 dari Google Research, dalam ukuran b16 dan l14.
Model menilai region gambar terhadap embedding teks dari encoder bergaya CLIP.
OMDet-Turbo dari Om AI Lab, dalam satu ukuran t.
Model memisahkan embedding kelas dari prompt task bahasa dan merupakan satu-
satunya family di sini yang menekan bounding box tumpang tindih dalam postprocessing,
sehingga iou= dipatuhi.
OV-DEIM, dalam ukuran s, m, dan l, adalah detektor
bergaya DETR yang mencocokkan query decoder terhadap embedding teks dari text
tower MobileCLIP bawaan. Model memakai pencocokan one-to-one dengan pemilihan
top-K, sehingga NMS tidak dijalankan.
Bobot OV-DEIM adalah kasus terbatas dalam tier ini. Bobot detektor berlisensi
CC BY-NC 4.0 dan nonkomersial. Text tower bawaan berada di bawah Apple's Machine
Learning Research Model license, khusus penggunaan penelitian. Checkpoint l
menambahkan fine-tuning backbone DINOv3-S di bawah DINOv3 License milik Meta.
Ketiga teks lisensi tersedia dalam repositori bobot, dan library mencatat
ringkasan yang sama ketika me-resolve bobot, sebelum model dibangun. Baca
OV-DEIM sebelum deployment.
Tier memerlukan satu ekstra:
pip install "libreyolo[openvocab]"Ekstra mencakup transformers dan timm untuk tiga family wrapper, serta
huggingface_hub, safetensors, regex, dan ftfy yang diperlukan OV-DEIM
sebagai port native.
Tier kedua juga menerima vocabulary teks: LibreVLM() memuat vision-language
model generatif seperti Qwen3-VL dan
Florence-2, lalu mengubah output-nya menjadi
Results yang sama. Tier tersebut berbagi antarmuka set_classes().
Perbedaannya adalah penghasil bounding box: family halaman ini berupa detektor
diskriminatif yang langsung menghasilkan skor, sedangkan tier VLM melakukan
generasi.
Prediksi
from libreyolo import LibreOpenVocab, SAMPLE_IMAGE model = LibreOpenVocab("grounding-dino-t")model.set_classes(["person", "dog", "skateboard"]) result = model.predict(SAMPLE_IMAGE, conf=0.25)print(result.names)for box in result.boxes: print(box.cls, box.conf, box.xyxy)from libreyolo import LibreOpenVocab, SAMPLE_IMAGE model = LibreOpenVocab("owlv2-b16") # set_classes bersifat persisten hingga pemanggilan berikutnya.# Label harus unik setelah diubah ke huruf kecil dan artikel dihapus.model.set_classes(["a red backpack", "traffic cone"])result = model.predict(SAMPLE_IMAGE) model.set_classes(["bicycle wheel"])result = model.predict(SAMPLE_IMAGE)from libreyolo import LibreOpenVocab, SAMPLE_IMAGE model = LibreOpenVocab("grounding-dino-b")model.set_classes(["remote control", "school bus"]) # conf memfilter berdasarkan skor bounding box, text_threshold berdasarkan skor token# frasa hasil decode. Default keduanya 0.25 jika tidak ditetapkan. Hanya Grounding# DINO yang menerima text_threshold; lainnya memunculkan error.result = model.predict(SAMPLE_IMAGE, conf=0.25, text_threshold=0.3)set_classes() menerima list string label yang tidak kosong dan bertahan
hingga dipanggil kembali. Label harus unik setelah diubah ke huruf kecil dan
artikel di awal dihapus, sehingga "a bus" dan "bus" tidak dapat berada dalam
satu vocabulary. Frasa multi-kata merupakan label biasa, dan setiap family
mengubah list menjadi input teksnya sendiri sebelum tokenization, sehingga
"traffic cone" adalah query berbeda dari "cone".
Tiga argumen prediksi berperilaku berbeda dari detektor native. imgsz= ditolak
karena processor mengendalikan resize. augment=True ditolak karena augmentasi
saat pengujian berada di luar cakupan tier. iou= hanya berlaku pada family
yang processor-nya menjalankan suppression; jika tidak ada suppression,
memberikannya menghasilkan peringatan dan diabaikan.
Jika tidak ditetapkan, conf mengambil default milik family yang dimuat, bukan
default umum predict() 0.25, dan nilainya berbeda dalam tier. Tetapkan secara
eksplisit saat membandingkan dua family pada gambar sama.
track() memunculkan error di seluruh tier. Jalankan predict() per frame.
Lihat prediksi untuk sumber, streaming, dan penanganan hasil.
Pelatihan
Tidak ada family dalam tier yang berlatih di LibreYOLO. train() memunculkan
error: lakukan fine-tuning di upstream dan muat bobot hasilnya. Vocabulary pada
set_classes() adalah satu-satunya pengaturan yang mengubah yang dideteksi
model termuat.
Validasi
Tidak ada validator untuk tier ini dan val() memunculkan error. Validasi
open-vocabulary memerlukan validator khusus karena validator deteksi standar
memberikan tensor gambar langsung kepada model, sedangkan family ini memerlukan
input yang dikondisikan teks.
Ekspor
Ekspor berada di luar cakupan tier dan export() memunculkan error. Model
berjalan melalui predict() di PyTorch.