Детекция с открытым словарём
Детекция с открытым словарём заменяет фиксированный список классов чекпойнта словами, которые вы выбираете в момент вызова. В LibreYOLO это не отдельная задача: это задача detect, которую обслуживает отдельная группа моделей — они загружаются через фабрику LibreOpenVocab, а не через LibreYOLO.
Определение
Детекция с открытым словарём возвращает обычные Results детекции:
ограничивающие рамки, оценки уверенности и индексы классов, а result.names
сопоставляет эти индексы со строками, которые вы запросили. Меняется только то,
откуда берётся список классов. Обычный детектор обучен на фиксированном наборе
категорий и никогда не выдаст категорию вне его. Эти модели принимают словарь
текстом во время инференса, поэтому достаточно
set_classes(["forklift", "safety cone"]), чтобы классами стали именно они.
В LibreYOLO нет ключа задачи open-vocabulary. Эти модели объявляют
SUPPORTED_TASKS = ("detect",), как любой другой детектор. Отличает их путь
загрузки: это снапшоты Hugging Face, а не чекпойнты LibreYOLO со state-dict,
поэтому они не попадают в фабрику LibreYOLO() и создаются через
LibreOpenVocab(). Эта фабрика стоит рядом с LibreSAM() и LibreVLM(), а не
заменяет LibreYOLO().
Оценки здесь — настоящие оценки детекции, а не сгенерированная подпись, которую разобрали постфактум. Каждое семейство оценивает области изображения относительно текстового эмбеддинга каждого запроса.
Модели
Группу составляют четыре семейства, и все они умеют только предсказывать. Любое
из них загружается по алиасу через LibreOpenVocab.
Grounding DINO от IDEA Research, в размерах t и
b. Это семейство по умолчанию для всей группы и единственное, которое
принимает text_threshold — второй порог, по оценке токенов декодированной
фразы.
OWLv2 от Google Research, в размерах b16 и l14.
Он оценивает области изображения относительно текстовых эмбеддингов из энкодера
в стиле CLIP.
OMDet-Turbo от Om AI Lab, в единственном размере
t. Он отделяет эмбеддинги классов от языкового промпта задачи и единственный
в группе подавляет перекрывающиеся рамки внутри собственной постобработки, так
что iou= учитывается.
OV-DEIM, в размерах s, m и l, — детектор в стиле
DETR, который сопоставляет запросы декодера с текстовыми эмбеддингами из
встроенной текстовой башни MobileCLIP. Сопоставление идёт один к одному с
отбором top-K, поэтому NMS нигде не запускается.
Веса OV-DEIM — ограниченный случай в этой группе. Веса детектора идут под
CC BY-NC 4.0, только для некоммерческого использования. Встроенная текстовая
башня — под лицензией Apple Machine Learning Research Model, только для
исследований. Чекпойнт l добавляет дообученный бэкбон DINOv3-S под лицензией
Meta DINOv3 License. Тексты всех трёх лицензий лежат внутри репозитория с
весами, и библиотека выводит в лог ту же сводку, когда находит веса, ещё до
сборки модели. Прочитайте OV-DEIM, прежде чем
разворачивать его.
Группе нужна одна дополнительная зависимость:
pip install "libreyolo[openvocab]"Она закрывает transformers и timm для трёх обёрнутых семейств, а также
пакеты huggingface_hub, safetensors, regex и ftfy, которые нужны
OV-DEIM как нативному порту.
Текстовый словарь принимает и вторая группа: LibreVLM() загружает генеративные
визуально-языковые модели, такие как Qwen3-VL и
Florence-2, и превращает их вывод в те же Results.
У неё тот же интерфейс set_classes(). Разница в том, что порождает рамки:
семейства на этой странице — дискриминативные детекторы, которые выдают оценки
напрямую, а группа VLM их генерирует.
Предсказание
from libreyolo import LibreOpenVocab, SAMPLE_IMAGE model = LibreOpenVocab("grounding-dino-t")model.set_classes(["person", "dog", "skateboard"]) result = model.predict(SAMPLE_IMAGE, conf=0.25)print(result.names)for box in result.boxes: print(box.cls, box.conf, box.xyxy)from libreyolo import LibreOpenVocab, SAMPLE_IMAGE model = LibreOpenVocab("owlv2-b16") # set_classes «липкий»: он действует до следующего своего вызова.# Метки должны быть уникальны в нижнем регистре и без артиклей.model.set_classes(["a red backpack", "traffic cone"])result = model.predict(SAMPLE_IMAGE) model.set_classes(["bicycle wheel"])result = model.predict(SAMPLE_IMAGE)from libreyolo import LibreOpenVocab, SAMPLE_IMAGE model = LibreOpenVocab("grounding-dino-b")model.set_classes(["remote control", "school bus"]) # conf фильтрует по оценке рамки, text_threshold — по оценке токенов# декодированной фразы. Если не задать, оба равны 0.25. Только Grounding# DINO принимает text_threshold, остальные вызывают ошибку.result = model.predict(SAMPLE_IMAGE, conf=0.25, text_threshold=0.3)set_classes() принимает непустой список строк-меток и держит его до
следующего вызова. Метки должны быть уникальны после приведения к нижнему
регистру и снятия ведущих артиклей, поэтому "a bus" и "bus" не могут
сосуществовать в одном словаре. Многословные фразы — такие же метки, как и
любые другие, и каждое семейство превращает список в собственный текстовый вход
перед токенизацией, поэтому "traffic cone" и "cone" — разные запросы.
Три аргумента предсказания ведут себя здесь иначе, чем на нативном детекторе.
imgsz= отклоняется, потому что за изменение размера в этих семействах отвечает
процессор. augment=True отклоняется, так как аугментация на этапе инференса
выходит за рамки этой группы. iou= действует только для того семейства, чей
процессор запускает собственное подавление; там, где ничего не подавляется,
аргумент вызывает предупреждение и игнорируется.
Если conf не задан, берётся собственное значение по умолчанию загруженного
семейства, а не привычные для predict() 0.25, и по всей группе оно разное.
Задавайте его явно, когда сравниваете два семейства на одном изображении.
track() вызывает ошибку во всей группе. Вместо этого запускайте predict()
покадрово. Об источниках, стриминге и обработке результатов см.
предсказание.
Обучение
Ни одно семейство в этой группе не обучается внутри LibreYOLO. train()
вызывает ошибку: дообучайте модель в исходном проекте и загружайте полученные
веса. Словарь, переданный в set_classes(), — единственная настройка, которая
меняет то, что детектирует загруженная модель.
Валидация
Валидатора для этой группы нет, и val() вызывает ошибку. Валидации с открытым
словарём нужен отдельный валидатор, потому что стандартный валидатор детекции
подаёт в модель тензоры изображений напрямую, а этим семействам нужны входы с
текстовым условием, которые строятся вместе с тензорами.
Экспорт
Экспорт выходит за рамки этой группы, и export() вызывает ошибку. Эти модели
работают через predict() в PyTorch.