LibreVLM
Arahkan vision language model ke sebuah gambar, berikan daftar kata, lalu dapatkan kotak. LibreVLM mengubah Qwen3-VL, Florence-2, dan model sejenis menjadi detektor objek open-vocabulary yang menggunakan API Results yang sama persis dengan setiap model LibreYOLO lainnya.
Pengantar
Detektor klasik disertai daftar kelas tetap yang tertanam di dalam head. LibreVLM menghapus batasan tersebut. LibreVLM membungkus vision language model modern yang telah disetel dengan instruksi, memintanya menghasilkan bounding box, mengurai teks yang dihasilkan, lalu mengembalikan objek Results yang sama dengan yang sudah digunakan untuk YOLO9 dan RF-DETR. Daftar kelas hanyalah daftar kata yang diberikan saat runtime, sehingga kategori baru dapat ditambahkan tanpa biaya dan berfungsi secara zero-shot.
- Open vocabulary. Deteksi
"pink car","license plate", atau"the small island"tanpa pernah melatih head untuk kategori tersebut. - Satu factory, satu kontrak.
LibreVLM(...)mengembalikanResultsstandar denganboxes.xyxy,boxes.cls,boxes.conf, ditambah.plot()dan.save(). - Backend yang dapat ditukar. Enam family model di balik satu string alias, dari Florence-2 230M hingga Qwen3-VL 8B.
- Jalur keluar mentah.
chat()menyediakan tanya jawab gambar berformat bebas saat diperlukan lebih dari sekadar kotak.
Alasan menggunakan tier terpisah (dan halaman terpisah)
LibreVLM sengaja dipisahkan dari factory closed-vocabulary LibreYOLO(...) dan registry .pt-nya. Model ini digerakkan oleh prompt, bersifat open vocabulary, dan melaporkan skor keyakinan sintetis, sehingga menggunakan kontrak yang berbeda. Menempatkannya dalam tier tersendiri menjaga dokumentasi deteksi inti tetap jelas dan jujur tentang hal yang diukur.
Di branch dev
LibreVLM saat ini berada di branch dev dan ditargetkan untuk rilis v1.3. Fitur ini bukan bagian dari v1.2.0. Tier inferensi ini hanya tersedia melalui Python: belum ada jalur pelatihan, validasi, ekspor, atau CLI, dan skor keyakinannya masih berupa placeholder. Baca bagian Keterbatasan sebelum membangun sesuatu di atasnya.
Instalasi
LibreVLM tersedia melalui paket tambahan opsional vlm. Paket ini memasang versi terbaru transformers dan helper yang diperlukan beberapa processor. Tanpa paket tambahan tersebut, mengimpor family VLM memicu ImportError yang mengarahkan ke halaman ini.
1 pip install 'libreyolo[vlm]'
Bobot diunduh dari Hugging Face Hub saat pertama kali digunakan ke folder lokal weights/. Beberapa family menggunakan lisensi non-OSI dan mencatat pemberitahuan satu kali sebelum mengunduh. GPU disarankan untuk backend yang lebih besar, tetapi setiap model juga dapat dijalankan pada CPU dengan device="cpu".
Mulai cepat
Buat model, tentukan kata yang diperlukan, lalu jalankan prediksi. Backend default adalah Qwen3-VL-4B, detektor terkuat di tier ini yang berlisensi Apache-2.0.
1 from libreyolo import LibreVLM 2 3 # Qwen3-VL-4B by default; weights autodownload on first use 4 model = LibreVLM() 5 6 # The vocabulary is just words. Any words. 7 model.set_classes(["pink car", "wheel"]) 8 9 result = model.predict("street.jpg") 10 11 print(result.boxes.xyxy) # pixel [x1, y1, x2, y2] 12 print(result.boxes.cls) # ids into ["pink car", "wheel"] 13 result.plot() # same drawing helpers as any LibreYOLO model 14 result.save("out.jpg")
Itulah seluruh alurnya. Semua yang berjalan setelah predict() berperilaku seperti detektor biasa, sehingga kode visualisasi, pemotongan, dan pelacakan yang sudah ada tetap berfungsi.
Model yang Didukung
Pilih backend melalui alias yang diberikan ke LibreVLM(...). Nama family tanpa ukuran akan menggunakan ukuran default. Backend default secara keseluruhan adalah qwen3-vl-4b. Dalam praktiknya, detektor terkuat adalah Qwen3-VL, LFM2-VL, dan Florence-2.
| Family model | Nama alias | Ukuran (parameter) | Lisensi | Catatan |
|---|---|---|---|---|
| Qwen3-VL | qwen3-vl-2b / -4b / -8b | 2B / 4B / 8B | Apache-2.0 | Default dan paling kuat. Titik awal yang disarankan. |
| LFM2-VL | lfm2-vl-450m / -1.6b | 450M / 1.6B | LFM Open License | Berukuran untuk edge, detektor kecil yang ternyata kuat. Memerlukan pemberitahuan. |
| InternVL3 | internvl3-1b / -2b / -8b | 1B / 2B / 8B | Qwen License | Grounding yang baik pada 8B. Ukuran kecilnya lemah. Memerlukan pemberitahuan. |
| Florence-2 | florence-2-base / -large | 0.23B / 0.77B | MIT | Model grounding yang dibuat khusus. Kotak rapat, tanpa chat(). |
| SmolVLM2 | smolvlm2-500m / -2.2b | 500M / 2.2B | Apache-2.0 | Sangat kecil dan cepat, tetapi detektornya lebih lemah. Cocok untuk percobaan cepat. |
| Kosmos-2 | kosmos-2 | ~1.6B | MIT | Model grounding dari 2023. Kotak lebih kasar, tanpa chat(). |
Memilih backend
- Kualitas terbaik:
qwen3-vl-8batauqwen3-vl-4b(default). - Kotak rapat, footprint kecil:
florence-2-large. - Edge / CPU:
lfm2-vl-450matausmolvlm2-500m. - Lisensi yang sepenuhnya permisif: semua ukuran Qwen3-VL, SmolVLM2, Florence-2, atau Kosmos-2.
Lisensi
Qwen3-VL dan SmolVLM2 berlisensi Apache-2.0. Florence-2 dan Kosmos-2 berlisensi MIT. LFM2-VL dan InternVL3 menggunakan lisensi non-OSI dan menampilkan pemberitahuan satu kali sebelum unduhan pertama, sehingga pilihan untuk penggunaan komersial dapat dibuat dengan informasi yang memadai.
Mengatur Kosakata
Kosakata adalah inti deteksi open-vocabulary. Panggil set_classes() dengan daftar string label. Pengaturan ini melekat: nilainya bertahan pada setiap pemanggilan predict() dan track() berikutnya hingga diatur kembali. Metode ini mengembalikan self, sehingga pemanggilannya dapat dirangkai.
1 # Sticky and chainable 2 model = LibreVLM("qwen3-vl-2b").set_classes(["person", "dog", "cat"]) 3 4 # Set it once at construction instead 5 model = LibreVLM("lfm2-vl-450m", names=["boat"], device="cpu") 6 7 # Re-set any time to change what you are looking for 8 model.set_classes(["a red car", "a blue truck"])
Label dapat berupa frasa apa pun. Setiap label harus unik tanpa membedakan huruf besar dan kecil, dan input harus berupa daftar, bukan satu string. Jika set_classes() tidak pernah dipanggil, model kembali ke kosakata COCO-80 sehingga pemanggilan predict() tanpa pengaturan tetap menghasilkan sesuatu yang masuk akal.
Prediksi
predict() (dan pemanggilan model(...) yang setara) menerima tipe sumber yang sama dengan semua detektor LibreYOLO: path, gambar PIL, array numpy, URL, folder, atau video. stream=True dan track() juga berfungsi.
1 result = model.predict( 2 source="image.jpg", # path | PIL | ndarray | URL | folder | video 3 conf=0.25, # see note below: scoring is synthetic 4 classes=[0], # optional: keep only these vocabulary ids 5 max_det=300, 6 )
Struktur hasil
Objek Results standar akan dikembalikan, sama seperti detektor closed-vocabulary:
| Atribut | Shape / tipe | Arti |
|---|---|---|
result.boxes.xyxy | N x 4 | Kotak piksel [x1, y1, x2, y2], diskalakan ke gambar asli. |
result.boxes.cls | N | ID kelas yang mengindeks kosakata set_classes(). |
result.boxes.conf | N | Skor keyakinan sintetis: 1.0 untuk setiap kotak (lihat Keterbatasan). |
result.plot() / .save() | - | Helper untuk menggambar dan menyimpan seperti biasa. |
Di balik layar, LibreVLM mengurai output model secara toleran (menangani pembatas markdown, prosa yang terselip, kotak duplikat, dan array yang terpotong), memetakan label teks bebas kembali ke ID kelas Anda, dan membuang label yang tidak ada dalam kosakata. Langkah terakhir itulah yang membuat generator berformat bebas berperilaku seperti detektor dengan himpunan tertutup.
Contoh
Deteksi objek dengan warna tertentu
1 from libreyolo import LibreVLM 2 3 model = LibreVLM("qwen3-vl-4b") 4 model.set_classes(["red car"]) 5 6 result = model.predict("parking_lot.jpg") 7 print(f"Found {len(result.boxes.cls)} red car(s)") 8 result.save("red_cars.jpg")
Kotak rapat dengan Florence-2
1 # Florence-2 is a purpose-built grounder: very tight pixel boxes. 2 model = LibreVLM("florence-2-large") 3 model.set_classes(["a red car", "license plate"]) 4 5 result = model.predict("car.jpg") 6 result.plot()
Filter ke satu kelas secara langsung
1 model = LibreVLM("qwen3-vl-2b").set_classes(["person", "dog", "cat"]) 2 3 # classes= filters the configured vocabulary by id 4 people_only = model.predict("street.jpg", classes=[0])
Jalankan pada CPU dengan gambar sampel bawaan
1 from libreyolo import LibreVLM, SAMPLE_IMAGE 2 3 model = LibreVLM("lfm2-vl-450m", device="cpu") 4 # No set_classes() -> falls back to the COCO-80 vocabulary 5 result = model.predict(SAMPLE_IMAGE) 6 print(model.names[result.boxes.cls[0]]) # e.g. "person"
Batch, folder, dan video
1 model = LibreVLM().set_classes(["forklift", "pallet"]) 2 3 # A whole folder 4 for result in model.predict("warehouse_frames/", stream=True): 5 result.save() 6 7 # A video file (frames are processed one at a time) 8 model.predict("warehouse.mp4", save=True)
Chat Mentah
Terkadang yang diperlukan adalah modelnya, bukan detektornya. Family dengan template chat menyediakan chat(), yang menerima gambar dan prompt berformat bebas lalu mengembalikan teks hasil dekode apa adanya. Gunakan untuk penghitungan, pembuatan caption, atau pertanyaan visual cepat.
1 model = LibreVLM("qwen3-vl-4b") 2 3 answer = model.chat("harbor.jpg", "How many boats are docked? Answer with a number.") 4 print(answer)
chat() tersedia pada family dengan template chat (Qwen3-VL, LFM2-VL, SmolVLM2, InternVL3). Florence-2 dan Kosmos-2 adalah model grounding berbasis token task dan memicu NotImplementedError. Gunakan predict() untuk keduanya.
Perbedaan Backend
Setiap family mengembalikan Results yang sama, tetapi mencapainya dengan cara berbeda. Perbedaan ini jarang perlu diperhatikan, tetapi membantu menjelaskan perilaku beberapa backend. Family chat diminta menghasilkan array kotak dalam JSON, sedangkan model grounding menggunakan token task khusus.
| Family model | Metode prompt | Ruang koordinat | chat() |
|---|---|---|---|
| Qwen3-VL | Prompt kotak JSON | 0 hingga 1000, diskalakan ulang | Ya |
| LFM2-VL | Prompt kotak JSON | Dinormalisasi dari 0 hingga 1 | Ya |
| SmolVLM2 | Prompt kotak JSON | Dinormalisasi dari 0 hingga 1 | Ya |
| InternVL3 | Prompt kotak JSON | 0 hingga 1000, diskalakan ulang | Ya |
| Florence-2 | Token task | Piksel asli | Tidak |
| Kosmos-2 | Prompt grounding | Dinormalisasi, diskalakan ulang | Tidak |
Untuk family chat, prompt deteksi dapat ditimpa dengan argumen constructor prompt=, dan panjang generasi dapat dibatasi dengan max_new_tokens=. Perangkat dan dtype ditentukan secara otomatis: bf16 atau fp16 pada CUDA, fp32 pada CPU.
Keterbatasan
LibreVLM kuat, tetapi masih muda. Mengetahui batasannya sejak awal mencegah kejutan di kemudian hari.
- Skor keyakinan sintetis. Setiap kotak diberi skor 1.0. Karena itu, filter
conf=bersifat semua-atau-tidak-sama-sekali, bukan sebagai ambang batas nyata. - Tanpa mAP / validasi.
val()memicu error karena skor sintetis akan membuat mAP COCO menyesatkan. - Tanpa pelatihan atau ekspor.
train()danexport()memicu error. Sebagai gantinya, lakukan fine-tuning pada VLM upstream lalu muat bobot yang dihasilkan. - Kualitas pelacakan menurun.
track()dapat dijalankan, tetapi skor yang seragam membuat tahap pemulihan dengan skor keyakinan rendah pada pelacak tidak berfungsi. - Satu gambar setiap kali. Generasi berlangsung secara berurutan di v1, sehingga nilai
batch=yang lebih besar tidak mempercepat proses. - Hanya API Python. CLI
libreyolobelum dapat mengenali alias VLM.
Keunggulannya
Gunakan LibreVLM ketika himpunan kelas bersifat terbuka, sering berubah, atau sulit diberi label sejak awal: pembuatan prototipe cepat, kategori long-tail atau langka, dan alur kerja "temukan benda yang saya jelaskan dengan kata-kata". Jika memerlukan skor keyakinan terkalibrasi, throughput, atau artefak yang dapat diterapkan, latih YOLO9 atau RF-DETR closed-vocabulary dari dokumentasi inti.