Виявлення з відкритим словником
Виявлення з відкритим словником замінює фіксований список класів контрольної точки словами, які ви вибираєте під час виклику. У LibreYOLO це не окрема задача: це задача detect, яку обслуговує окремий рівень моделей, завантажений через фабрику LibreOpenVocab замість LibreYOLO.
Визначення
Виявлення з відкритим словником повертає звичайні Results виявлення:
рамки, значення впевненості й індекси класів, а result.names зіставляє
ці індекси з указаними рядками. Змінюється джерело списку класів. Звичайний
детектор навчається на фіксованому наборі категорій і не може повернути
категорію поза ним. Ці моделі приймають словник як текст під час інференсу,
тому set_classes(["forklift", "safety cone"]) достатньо, щоб зробити їх
класами.
LibreYOLO не має ключа задачі open-vocabulary. Ці моделі оголошують
SUPPORTED_TASKS = ("detect",), як будь-який інший детектор. Відрізняє
їх шлях завантаження: це знімки Hugging Face, а не контрольні точки словника
стану LibreYOLO, тому вони не входять до фабрики 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. Тексти всіх
трьох ліцензій постачаються в репозиторії ваг, а бібліотека реєструє такий
самий підсумок перед побудовою моделі, коли визначає ваги. Перед розгортанням
прочитайте 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() спричиняє
помилку: виконайте донавчання в upstream і завантажте отримані ваги. Словник,
переданий до set_classes(), є єдиним налаштуванням, яке змінює об'єкти,
що виявляє завантажена модель.
Валідація
Для цього рівня немає валідатора, і val() спричиняє помилку. Для
валідації з відкритим словником потрібен окремий валідатор, оскільки
стандартний валідатор виявлення передає тензори зображень прямо моделі,
тоді як цим сімействам потрібні одночасно створені входи з текстовими умовами.
Експорт
Експорт не підтримується на цьому рівні, і export() спричиняє помилку.
Ці моделі працюють через predict() у PyTorch.