Цей розділ наразі доступний лише англійською.
Основна документація
Експериментальний рівень

LibreVLM

Передайте візуально-мовній моделі зображення та список слів і отримайте рамки. LibreVLM перетворює Qwen3-VL, Florence-2 та подібні моделі на детектори об'єктів із відкритим словником, які використовують той самий API Results, що й усі інші моделі LibreYOLO.

Вступ

Класичний детектор постачається з фіксованим переліком класів, закладеним у його голову. LibreVLM усуває це обмеження. Він обгортає сучасні візуально-мовні моделі, налаштовані за інструкціями, пропонує їм вивести обмежувальні рамки, аналізує згенерований текст і повертає той самий об'єкт Results, який ви вже використовуєте для YOLO9 та RF-DETR. Перелік класів є звичайним списком слів, який ви передаєте під час виконання, тому нову категорію можна додати без витрат і попереднього навчання.

  • Відкритий словник. Виявляйте "pink car", "license plate" або "the small island", жодного разу не навчаючи для них голову.
  • Одна фабрика, один контракт. LibreVLM(...) повертає стандартний Results із boxes.xyxy, boxes.cls, boxes.conf, а також .plot() і .save().
  • Взаємозамінні бекенди. Шість сімейств моделей за одним рядком псевдоніма, від Florence-2 із 230 млн параметрів до Qwen3-VL із 8 млрд.
  • Прямий доступ. chat() дає змогу ставити довільні запитання про зображення, коли самих рамок недостатньо.

Навіщо окремий рівень (і окрема сторінка)

LibreVLM навмисно не входить до фабрики LibreYOLO(...) із закритим словником і її реєстру .pt. Ці моделі керуються промптами, мають відкритий словник і повідомляють синтетичну впевненість, тому дотримуються іншого контракту. Окремий рівень зберігає основну документацію з виявлення чіткою та чесно описує, що саме вимірюється.

У гілці dev

LibreVLM зараз розміщено в гілці dev і заплановано для випуску v1.3. До v1.2.0 він не входить. Це рівень інференсу лише для Python: навчання, валідація, експорт і шлях через CLI поки відсутні, а оцінки впевненості є тимчасовими значеннями. Перед використанням прочитайте розділ Обмеження.

Встановлення

LibreVLM доступний через необов'язковий додатковий пакет vlm. Він встановлює нову версію transformers і допоміжні засоби, потрібні кільком процесорам. Без цього пакета імпорт сімейства VLM спричиняє ImportError із посиланням на цей розділ.

bash
1pip install 'libreyolo[vlm]'

Ваги завантажуються з Hugging Face Hub під час першого використання до локальної папки weights/. Кілька сімейств постачаються за ліцензіями, не схваленими OSI, і перед завантаженням одноразово показують повідомлення. Для більших бекендів рекомендовано GPU, але кожна модель також працює на CPU з device="cpu".

Швидкий старт

Створіть модель, укажіть потрібні слова та запустіть передбачення. Типовим бекендом є Qwen3-VL-4B, найсильніший детектор цього рівня з ліцензією 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")

Це весь цикл. Усе після predict() поводиться як звичайний детектор, тому наявний код візуалізації, обрізання й відстеження продовжує працювати.

Підтримувані моделі

Виберіть бекенд за псевдонімом, який передаєте до LibreVLM(...). Назва сімейства без розміру відповідає типовому розміру. Загальним типовим бекендом є qwen3-vl-4b. На практиці найсильнішими детекторами є Qwen3-VL, LFM2-VL і Florence-2.

СімействоПсевдонімРозміри (параметри)ЛіцензіяПримітки
Qwen3-VLqwen3-vl-2b / -4b / -8b2B / 4B / 8BApache-2.0Типовий і найсильніший. Рекомендована відправна точка.
LFM2-VLlfm2-vl-450m / -1.6b450M / 1.6BLFM Open LicenseРозмір для edge-пристроїв, напрочуд сильний малий детектор. Перед завантаженням показується повідомлення.
InternVL3internvl3-1b / -2b / -8b1B / 2B / 8BQwen LicenseДобре прив'язує об'єкти у версії 8B, а малі розміри слабкі. Перед завантаженням показується повідомлення.
Florence-2florence-2-base / -large0.23B / 0.77BMITСпеціалізована модель прив'язування. Щільні рамки, без chat().
SmolVLM2smolvlm2-500m / -2.2b500M / 2.2BApache-2.0Крихітний і швидкий, але слабший детектор. Добре підходить для швидких випробувань.
Kosmos-2kosmos-2~1.6BMITМодель прив'язування 2023 року. Грубші рамки, без chat().

Вибір бекенда

  • Найкраща якість: qwen3-vl-8b або qwen3-vl-4b (типовий).
  • Щільні рамки й малий обсяг: florence-2-large.
  • Edge-пристрої / CPU: lfm2-vl-450m або smolvlm2-500m.
  • Повністю дозвільна ліцензія: будь-який розмір Qwen3-VL, SmolVLM2, Florence-2 або Kosmos-2.

Ліцензування

Qwen3-VL і SmolVLM2 мають ліцензію Apache-2.0, а Florence-2 і Kosmos-2 мають MIT. LFM2-VL та InternVL3 мають ліцензії, не схвалені OSI, і перед першим завантаженням показують одноразове повідомлення, щоб ви могли усвідомлено вибрати варіант для комерційного використання.

Налаштування словника

Словник є основою виявлення з відкритим словником. Викличте set_classes() зі списком рядків міток. Він зберігається для всіх наступних викликів predict() і track(), доки ви не задасте його знову. Метод повертає self, тому виклики можна з'єднувати в ланцюжок.

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"])

Міткою може бути будь-яка фраза. Мітки мають бути унікальними без урахування регістру, і потрібно передати список, а не окремий рядок. Якщо жодного разу не викликати set_classes(), модель використовує словник COCO-80, тому звичайний виклик predict() усе одно дає осмислений результат.

Передбачення

predict() (і еквівалентний виклик model(...)) приймає ті самі типи джерел, що й будь-який детектор LibreYOLO: шлях, зображення PIL, масив NumPy, URL, папку або відео. stream=True і track() також працюють.

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)

Структура результату

Ви отримуєте стандартний об'єкт Results, ідентичний результату детектора із закритим словником:

ПолеФорма / типЗначення
result.boxes.xyxyN x 4Рамки в пікселях [x1, y1, x2, y2], масштабовані до оригінального зображення.
result.boxes.clsNІдентифікатори класів, що індексують ваш словник set_classes().
result.boxes.confNСинтетична впевненість: 1.0 для кожної рамки (див. розділ «Обмеження»).
result.plot() / .save()-Звичні допоміжні засоби малювання та збереження.

Усередині LibreVLM стійко аналізує вихід моделі (обробляє огорожі Markdown, сторонній текст, дубльовані рамки й обрізані масиви), зіставляє довільні текстові мітки з ідентифікаторами ваших класів і відкидає всі мітки поза вашим словником. Саме останній крок змушує генератор довільного тексту поводитися як детектор із закритим набором класів.

Приклади

Виявити об'єкт певного кольору

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")

Щільні рамки з 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()

Фільтрувати до одного класу під час виконання

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])

Запустити на CPU із вбудованим зразком зображення

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"

Батчі, папки та відео

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(), який приймає зображення та довільний промпт і дослівно повертає декодований текст. Використовуйте його для підрахунку, створення підписів або швидких запитань про зображення.

python
1model = LibreVLM("qwen3-vl-4b")
2
3answer = model.chat("harbor.jpg", "How many boats are docked? Answer with a number.")
4print(answer)

chat() доступний для сімейств із шаблонами чату (Qwen3-VL, LFM2-VL, SmolVLM2, InternVL3). Florence-2 і Kosmos-2 є моделями прив'язування з токенами задач і спричиняють NotImplementedError. Використовуйте з ними predict().

Відмінності бекендів

Кожне сімейство повертає той самий Results, але отримує його по-різному. Це рідко має значення, проте пояснює поведінку деяких бекендів. Сімейства чату отримують промпт із запитом на масив рамок JSON, а моделі прив'язування використовують спеціальні токени задач.

СімействоПромптингПростір координатchat()
Qwen3-VLПромпт рамок JSONВід 0 до 1000, масштабованоТак
LFM2-VLПромпт рамок JSONНормалізовано від 0 до 1Так
SmolVLM2Промпт рамок JSONНормалізовано від 0 до 1Так
InternVL3Промпт рамок JSONВід 0 до 1000, масштабованоТак
Florence-2Токен задачіВихідні пікселіНі
Kosmos-2Промпт прив'язуванняНормалізовано й масштабованоНі

Для сімейств чату промпт виявлення можна перевизначити аргументом конструктора prompt=, а довжину генерації обмежити за допомогою max_new_tokens=. Пристрій і dtype визначаються автоматично: bf16 або fp16 у CUDA, fp32 на CPU.

Обмеження

LibreVLM має широкі можливості, але ще молодий. Знання обмежень заздалегідь допоможе уникнути несподіванок.

  • Синтетична впевненість. Кожна рамка отримує оцінку 1.0. Тому фільтр conf= пропускає або відкидає все, а не працює як справжній поріг.
  • Без mAP і валідації. val() спричиняє помилку, оскільки синтетичні оцінки зробили б COCO mAP оманливим.
  • Без навчання та експорту. train() і export() спричиняють помилку. Натомість донавчіть VLM у першоджерелі й завантажте отримані ваги.
  • Погіршене відстеження. track() працює, але однакові оцінки роблять етап відновлення з низькою впевненістю у трекері неактивним.
  • По одному зображенню. У v1 генерація послідовна, тому більші значення batch= не дають прискорення.
  • Лише API Python. CLI libreyolo поки не розпізнає псевдоніми VLM.

Де він найкращий

Використовуйте LibreVLM, коли набір класів відкритий, часто змінюється або його складно розмітити заздалегідь: для швидкого прототипування, рідкісних категорій або робочих процесів «знайди те, що я опишу словами». Коли потрібні калібрована впевненість, пропускна здатність або придатний до розгортання артефакт, навчіть YOLO9 чи RF-DETR із закритим словником за основною документацією.

Лише інференсгілка dev / заплановано для v1.3Вихідний код на GitHub