Посмотреть как Markdown

Детекция с открытым словарём

Детекция с открытым словарём заменяет фиксированный список классов чекпойнта словами, которые вы выбираете в момент вызова. В 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, прежде чем разворачивать его.

Группе нужна одна дополнительная зависимость:

bash
pip install "libreyolo[openvocab]"

Она закрывает transformers и timm для трёх обёрнутых семейств, а также пакеты huggingface_hub, safetensors, regex и ftfy, которые нужны OV-DEIM как нативному порту.

Текстовый словарь принимает и вторая группа: LibreVLM() загружает генеративные визуально-языковые модели, такие как Qwen3-VL и Florence-2, и превращает их вывод в те же Results. У неё тот же интерфейс set_classes(). Разница в том, что порождает рамки: семейства на этой странице — дискриминативные детекторы, которые выдают оценки напрямую, а группа VLM их генерирует.

Предсказание

Python
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)
Текстовый порог Grounding DINO
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.

Проверено с LibreYOLO v1.5.0.