Untuk saat ini bagian ini hanya tersedia dalam bahasa Inggris.
Dokumentasi inti
Tier eksperimental

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(...) mengembalikan Results standar dengan boxes.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.

bash
1pip 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.

python
1from libreyolo import LibreVLM
2
3# Qwen3-VL-4B by default; weights autodownload on first use
4model = LibreVLM()
5
6# The vocabulary is just words. Any words.
7model.set_classes(["pink car", "wheel"])
8
9result = model.predict("street.jpg")
10
11print(result.boxes.xyxy) # pixel [x1, y1, x2, y2]
12print(result.boxes.cls) # ids into ["pink car", "wheel"]
13result.plot() # same drawing helpers as any LibreYOLO model
14result.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 modelNama aliasUkuran (parameter)LisensiCatatan
Qwen3-VLqwen3-vl-2b / -4b / -8b2B / 4B / 8BApache-2.0Default dan paling kuat. Titik awal yang disarankan.
LFM2-VLlfm2-vl-450m / -1.6b450M / 1.6BLFM Open LicenseBerukuran untuk edge, detektor kecil yang ternyata kuat. Memerlukan pemberitahuan.
InternVL3internvl3-1b / -2b / -8b1B / 2B / 8BQwen LicenseGrounding yang baik pada 8B. Ukuran kecilnya lemah. Memerlukan pemberitahuan.
Florence-2florence-2-base / -large0.23B / 0.77BMITModel grounding yang dibuat khusus. Kotak rapat, tanpa chat().
SmolVLM2smolvlm2-500m / -2.2b500M / 2.2BApache-2.0Sangat kecil dan cepat, tetapi detektornya lebih lemah. Cocok untuk percobaan cepat.
Kosmos-2kosmos-2~1.6BMITModel grounding dari 2023. Kotak lebih kasar, tanpa chat().

Memilih backend

  • Kualitas terbaik: qwen3-vl-8b atau qwen3-vl-4b (default).
  • Kotak rapat, footprint kecil: florence-2-large.
  • Edge / CPU: lfm2-vl-450m atau smolvlm2-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.

python
1# Sticky and chainable
2model = LibreVLM("qwen3-vl-2b").set_classes(["person", "dog", "cat"])
3
4# Set it once at construction instead
5model = LibreVLM("lfm2-vl-450m", names=["boat"], device="cpu")
6
7# Re-set any time to change what you are looking for
8model.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.

python
1result = 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:

AtributShape / tipeArti
result.boxes.xyxyN x 4Kotak piksel [x1, y1, x2, y2], diskalakan ke gambar asli.
result.boxes.clsNID kelas yang mengindeks kosakata set_classes().
result.boxes.confNSkor 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

python
1from libreyolo import LibreVLM
2
3model = LibreVLM("qwen3-vl-4b")
4model.set_classes(["red car"])
5
6result = model.predict("parking_lot.jpg")
7print(f"Found {len(result.boxes.cls)} red car(s)")
8result.save("red_cars.jpg")

Kotak rapat dengan Florence-2

python
1# Florence-2 is a purpose-built grounder: very tight pixel boxes.
2model = LibreVLM("florence-2-large")
3model.set_classes(["a red car", "license plate"])
4
5result = model.predict("car.jpg")
6result.plot()

Filter ke satu kelas secara langsung

python
1model = LibreVLM("qwen3-vl-2b").set_classes(["person", "dog", "cat"])
2
3# classes= filters the configured vocabulary by id
4people_only = model.predict("street.jpg", classes=[0])

Jalankan pada CPU dengan gambar sampel bawaan

python
1from libreyolo import LibreVLM, SAMPLE_IMAGE
2
3model = LibreVLM("lfm2-vl-450m", device="cpu")
4# No set_classes() -> falls back to the COCO-80 vocabulary
5result = model.predict(SAMPLE_IMAGE)
6print(model.names[result.boxes.cls[0]]) # e.g. "person"

Batch, folder, dan video

python
1model = LibreVLM().set_classes(["forklift", "pallet"])
2
3# A whole folder
4for result in model.predict("warehouse_frames/", stream=True):
5 result.save()
6
7# A video file (frames are processed one at a time)
8model.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.

python
1model = LibreVLM("qwen3-vl-4b")
2
3answer = model.chat("harbor.jpg", "How many boats are docked? Answer with a number.")
4print(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 modelMetode promptRuang koordinatchat()
Qwen3-VLPrompt kotak JSON0 hingga 1000, diskalakan ulangYa
LFM2-VLPrompt kotak JSONDinormalisasi dari 0 hingga 1Ya
SmolVLM2Prompt kotak JSONDinormalisasi dari 0 hingga 1Ya
InternVL3Prompt kotak JSON0 hingga 1000, diskalakan ulangYa
Florence-2Token taskPiksel asliTidak
Kosmos-2Prompt groundingDinormalisasi, diskalakan ulangTidak

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() dan export() 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 libreyolo belum 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.

Hanya inferensibranch dev / ditargetkan untuk v1.3Sumber di GitHub