API vision-language моделей
LibreVLM загружает генеративную vision-language модель и использует её как детектор объектов. Список классов здесь — это промпт, а не фиксированная голова, и модель возвращает такие же Results, как любое другое семейство.
Установка
Этому уровню нужен extra vlm.
pip install 'libreyolo[vlm]'Фабрика
LibreVLM(model: str = "qwen3-vl-4b", **kwargs) -> LibreVLMModelmodel — это алиас, а не путь. **kwargs передаётся в конструктор семейства,
который принимает device, names (начальный словарь, то же самое, что вызвать
set_classes после загрузки), prompt (переопределяет промпт детекции) и
max_new_tokens. Неизвестный алиас вызывает ValueError со списком всех алиасов.
from libreyolo import LibreVLM, SAMPLE_IMAGE model = LibreVLM("lfm2-vl-450m")model.set_classes(["person", "skateboard"]) result = model.predict(SAMPLE_IMAGE)for box, cls in zip(result.boxes.xyxy, result.boxes.cls): print(result.names[int(cls)], box.tolist())from libreyolo import LibreVLM, SAMPLE_IMAGE model = LibreVLM("lfm2-vl-450m")print(model.chat(SAMPLE_IMAGE, "How many people are in this image?"))Алиасы
| Семейство | Алиасы | Размеры | Веса |
|---|---|---|---|
| Qwen3-VL | qwen3-vl, qwen3-vl-2b, qwen3-vl-4b, qwen3-vl-8b | 2b, 4b, 8b | Qwen/Qwen3-VL-2B-Instruct, -4B-, -8B- |
| LFM2-VL | lfm2-vl, lfm2-vl-450m, lfm2-vl-1.6b | 450m, 1.6b | LiquidAI/LFM2.5-VL-450M, -1.6B |
| InternVL3 | internvl3, internvl3-1b, internvl3-2b, internvl3-8b | 1b, 2b, 8b | OpenGVLab/InternVL3-1B-hf, -2B-hf, -8B-hf |
| SmolVLM2 | smolvlm2, smolvlm2-2.2b, smolvlm2-500m | 2.2b, 500m | HuggingFaceTB/SmolVLM2-2.2B-Instruct, SmolVLM2-500M-Video-Instruct |
| Florence-2 | florence-2, florence2, florence-2-base, florence-2-large | base, large | florence-community/Florence-2-base, -large |
| Kosmos-2 | kosmos-2, kosmos2 | 224 | microsoft/kosmos-2-patch14-224 |
| LocateAnything | locate-anything, locateanything, locate-anything-3b, locateanything-3b | 3b | nvidia/LocateAnything-3B |
| SenseNova-Vision | sensenova-vision, sensenova-vision-7b, sensenovavision | 7b | LibreYOLO/SenseNovaVision7b |
| WeVisOne-VL | wevisone-vl, wevisone, wevisonevl, wevisone-vl-2b, wevisone-vl-4b | 2b, 4b | tencent/WeVisOne-VL-2B, -4B |
| LibreMODUS | libremodus, libremodus-14b-a7b, modus, modus-14b-a7b | 14b-a7b | Зафиксированный снапшот из апстрима |
Алиас по умолчанию — qwen3-vl-4b. Для алиаса по умолчанию каждого семейства
берётся размер, указанный первым: qwen3-vl разрешается в 4b, lfm2-vl — в
450m, internvl3 — в 2b, smolvlm2 — в 2.2b, florence-2 — в base, wevisone-vl — в 2b.
LibreVLM, LibreLFM2VL, LibreQwen3VL, LibreSmolVLM2, LibreInternVL3,
LibreFlorence2, LibreKosmos2, LibreLocateAnything, LibreWeVisOneVL
и LibreMODUS (также пишется LibreModus) экспортируются на уровне пакета.
Детекция также включает north-micro-vision, gemma-4-e2b, gemma-4-e4b, moondream-2, moondream-3 и lfm2-vl-3b. Псевдоним gemma-4 без суффикса выбирает E4B. Псевдонимы Molmo2: molmo2-4b, molmo2-8b и molmo2-o-7b; по умолчанию выбран 4B. Псевдонимы задают маршрутизацию, но не означают, что каждый удалённый снимок был скачан и проверен. moondream-3 в 1.6.0 не загружается: в его зеркале не хватает шардов весов.
Задачи
Поддержка задач зависит от семейства. Эти адаптеры поддерживают несколько задач:
| Семейство | Поддерживаемые задачи |
|---|---|
| LocateAnything | detect, point |
| SenseNova-Vision | detect, segment, panoptic, pose, point, depth, ocr |
| WeVisOne-VL | detect, point, segment, matte, ocr |
Задача задаётся промптом, а не запечена в чекпойнт, поэтому её можно переключить на уже загруженной модели:
model.set_task(task: str) -> LibreVLMModelЗадача проверяется по списку поддерживаемых семейством задач, запоминается для
последующих вызовов predict() и track(), а модель возвращается, чтобы вызовы
можно было соединять в цепочку.
Molmo2 возвращает точки и требует {label} в собственных шаблонах указания точек. referring=True в WeVisOne-VL заставляет detect отправлять по одной генерации на фразу, а его segment, matte и референтная детекция вызывают ValueError без словаря. Moondream поддерживает детекцию, точки и нативный чат. Для запросов клика по инструкции используйте LibreGround.
set_classes
model.set_classes(classes: list[str]) -> LibreVLMModelЗадаёт открытый словарь. Подойдут любые слова, потому что модель получает их в
промпте, а не ограничена фиксированной головой. Список должен быть непустым, а
его элементы — уникальными при сравнении без учёта регистра. Передача голой
строки вызывает TypeError, потому что она развернулась бы в набор
односимвольных классов. Словарь запоминается: задайте его один раз после загрузки, и он
действует, пока вы не зададите его снова.
chat
model.chat(image, prompt, max_new_tokens=None, color_format="auto") -> strСырая мультимодальная генерация: на входе изображение и промпт, на выходе —
декодированный текст, дословно. Это запасной выход под удобной обёрткой
детекции — для произвольных вопросов, подсчёта объектов или формата вывода,
который обёртка детекции не покрывает. max_new_tokens по умолчанию берёт
значение MAX_NEW_TOKENS семейства, а в базовом классе оно равно 1024.
Декодирование жадное, с мягким штрафом за повторы.
Уверенность
У сгенерированного вывода нет калиброванной уверенности для каждой рамки. В этой
версии проставляется постоянная заглушка, чтобы работали predict, отрисовка и
track, из-за чего фильтрация по conf= и mAP получаются условными, а не
осмысленными. По этой же причине val() выбрасывает исключение: COCO mAP по
оценкам-заглушкам вводил бы в заблуждение.
Предсказание и трекинг
Стандартный набор аргументов predict работает как обычно, track() тоже
работает, поэтому VLM-детектор встраивается в тот же пайплайн, что и любое
другое семейство. Две политики на уровне класса отличаются от свёрточного
детектора: аугментация на этапе инференса отключена, потому что многомасштабная
аугментация бессмысленна для генератора с фиксированным разрешением, а батчевый
predict выключен, потому что генерация авторегрессионная, а препроцессинг
возвращает кодировку из текста и изображения, а не тензор изображения, который
можно сложить в батч.
Что не поддерживается
Экспорт и валидация mAP детекции не поддерживаются. Обучение ограничено описанным ниже процессом Qwen3-VL.
Удалённый код
Каждое поставляемое семейство загружается через нативный класс модели, поэтому
LibreYOLO по умолчанию не выполняет код из сторонних репозиториев. Семейство,
которому это действительно нужно, должно явно это включить и зафиксировать
ревизию снапшота; LocateAnything — единственное такое семейство, зафиксировано
на коммите c32291ca5e996f5a7a485845b4f57a233936bba0.
LibreMODUS — явное исключение из схемы чекпойнтов: его алиас разрешается в
каталог зафиксированных файлов апстрима, а не в .pt от LibreYOLO, и LibreYOLO
не добавляет к нему метаданные v1.0 и не публикует его заново.
Обучение
Qwen3-VL поддерживает LoRA для детекции через train(data=...) после установки libreyolo[vlm-train]. Визуальный энкодер замораживается, лучшие чекпойнты выбираются по функции потерь на валидации и сохраняются в каталогах. См. дообучение VLM.