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 |
| 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.
LibreVLM, LibreLFM2VL, LibreQwen3VL, LibreSmolVLM2, LibreInternVL3,
LibreFlorence2, LibreKosmos2, LibreLocateAnything и LibreMODUS
(также пишется LibreModus) экспортируются на уровне пакета.
Задачи
Большинство семейств поддерживают только detect. Два умеют больше:
| Семейство | Поддерживаемые задачи |
|---|---|
| LocateAnything | detect, point |
| SenseNova-Vision | detect, segment, panoptic, pose, point, depth, ocr |
Задача задаётся промптом, а не запечена в чекпойнт, поэтому её можно переключить на уже загруженной модели:
model.set_task(task: str) -> LibreVLMModelЗадача проверяется по списку поддерживаемых семейством задач, запоминается для
последующих вызовов predict() и track(), а модель возвращается, чтобы вызовы
можно было соединять в цепочку.
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 выключен, потому что генерация авторегрессионная, а препроцессинг
возвращает кодировку из текста и изображения, а не тензор изображения, который
можно сложить в батч.
Что не поддерживается
train(), val() и export() выбрасывают NotImplementedError. Дообучайте в
апстриме и загружайте полученные веса.
Удалённый код
Каждое поставляемое семейство загружается через нативный класс модели, поэтому
LibreYOLO по умолчанию не выполняет код из сторонних репозиториев. Семейство,
которому это действительно нужно, должно явно это включить и зафиксировать
ревизию снапшота; LocateAnything — единственное такое семейство, зафиксировано
на коммите c32291ca5e996f5a7a485845b4f57a233936bba0.
LibreMODUS — явное исключение из схемы чекпойнтов: его алиас разрешается в
каталог зафиксированных файлов апстрима, а не в .pt от LibreYOLO, и LibreYOLO
не добавляет к нему метаданные v1.0 и не публикует его заново.