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 із посиланням на цей розділ.
1 pip install 'libreyolo[vlm]'
Ваги завантажуються з Hugging Face Hub під час першого використання до локальної папки weights/. Кілька сімейств постачаються за ліцензіями, не схваленими OSI, і перед завантаженням одноразово показують повідомлення. Для більших бекендів рекомендовано GPU, але кожна модель також працює на CPU з device="cpu".
Швидкий старт
Створіть модель, укажіть потрібні слова та запустіть передбачення. Типовим бекендом є Qwen3-VL-4B, найсильніший детектор цього рівня з ліцензією 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")
Це весь цикл. Усе після predict() поводиться як звичайний детектор, тому наявний код візуалізації, обрізання й відстеження продовжує працювати.
Підтримувані моделі
Виберіть бекенд за псевдонімом, який передаєте до LibreVLM(...). Назва сімейства без розміру відповідає типовому розміру. Загальним типовим бекендом є qwen3-vl-4b. На практиці найсильнішими детекторами є Qwen3-VL, LFM2-VL і Florence-2.
| Сімейство | Псевдонім | Розміри (параметри) | Ліцензія | Примітки |
|---|---|---|---|---|
| Qwen3-VL | qwen3-vl-2b / -4b / -8b | 2B / 4B / 8B | Apache-2.0 | Типовий і найсильніший. Рекомендована відправна точка. |
| LFM2-VL | lfm2-vl-450m / -1.6b | 450M / 1.6B | LFM Open License | Розмір для edge-пристроїв, напрочуд сильний малий детектор. Перед завантаженням показується повідомлення. |
| InternVL3 | internvl3-1b / -2b / -8b | 1B / 2B / 8B | Qwen License | Добре прив'язує об'єкти у версії 8B, а малі розміри слабкі. Перед завантаженням показується повідомлення. |
| Florence-2 | florence-2-base / -large | 0.23B / 0.77B | MIT | Спеціалізована модель прив'язування. Щільні рамки, без chat(). |
| SmolVLM2 | smolvlm2-500m / -2.2b | 500M / 2.2B | Apache-2.0 | Крихітний і швидкий, але слабший детектор. Добре підходить для швидких випробувань. |
| Kosmos-2 | kosmos-2 | ~1.6B | MIT | Модель прив'язування 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, тому виклики можна з'єднувати в ланцюжок.
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"])
Міткою може бути будь-яка фраза. Мітки мають бути унікальними без урахування регістру, і потрібно передати список, а не окремий рядок. Якщо жодного разу не викликати set_classes(), модель використовує словник COCO-80, тому звичайний виклик predict() усе одно дає осмислений результат.
Передбачення
predict() (і еквівалентний виклик model(...)) приймає ті самі типи джерел, що й будь-який детектор LibreYOLO: шлях, зображення PIL, масив NumPy, URL, папку або відео. stream=True і track() також працюють.
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 )
Структура результату
Ви отримуєте стандартний об'єкт Results, ідентичний результату детектора із закритим словником:
| Поле | Форма / тип | Значення |
|---|---|---|
result.boxes.xyxy | N x 4 | Рамки в пікселях [x1, y1, x2, y2], масштабовані до оригінального зображення. |
result.boxes.cls | N | Ідентифікатори класів, що індексують ваш словник set_classes(). |
result.boxes.conf | N | Синтетична впевненість: 1.0 для кожної рамки (див. розділ «Обмеження»). |
result.plot() / .save() | - | Звичні допоміжні засоби малювання та збереження. |
Усередині LibreVLM стійко аналізує вихід моделі (обробляє огорожі Markdown, сторонній текст, дубльовані рамки й обрізані масиви), зіставляє довільні текстові мітки з ідентифікаторами ваших класів і відкидає всі мітки поза вашим словником. Саме останній крок змушує генератор довільного тексту поводитися як детектор із закритим набором класів.
Приклади
Виявити об'єкт певного кольору
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")
Щільні рамки з 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()
Фільтрувати до одного класу під час виконання
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])
Запустити на CPU із вбудованим зразком зображення
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"
Батчі, папки та відео
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(), який приймає зображення та довільний промпт і дослівно повертає декодований текст. Використовуйте його для підрахунку, створення підписів або швидких запитань про зображення.
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() доступний для сімейств із шаблонами чату (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 із закритим словником за основною документацією.