Всем привет! Представьте, сколько всего нужно сделать, чтобы дотренировать модель компьютерного зрения:

  • Поиск и сборка датасетов. Хорошо, если есть открытые и с допустимой лицензией. Но часто приходится собирать «с миру по нитке», дополнять и балансировать данные самостоятельно.

  • Разметка и аугментация. Качественный датасет — залог хороших метрик. Придётся корпеть над точными detection-боксами, перепроверять, думать над нестандартными ситуациями во входных данных.

  • Обучение и валидация. Потратим мощности, время, деньги, протестируем. Хорошо, если с первых попыток удастся найти достойный баланс между точностью и временем тренировки. В реальности нужно хотя бы несколько итераций.

Но есть и другой путь. Сегодня расскажу о YOLOE — это модель, которая помогает решить эти проблемы.

Как устроен обычный YOLO и в чём ограничение

Пример архитектуры модели YOLOv8
Пример архитектуры модели YOLOv8

Чтобы понять, что нового в YOLOE, вспомним, как работает стандартный детектор.

Изображение проходит через backbone — свёрточную сеть, которая извлекает признаки: края, текстуры, формы на разных масштабах. Затем признаки агрегируются в PAN (Pyramid Attention Network), объединяющей информацию с разных уровней детализации. Наконец, голова детектора предсказывает, есть ли здесь объект и с какой вероятностью, где именно (bounding box), к какому классу он относится.

В зависимости от поколения YOLO (v5, v8, ..., vN) архитектура меняется, но ограничение одно: классы жёстко заданы датасетом. Хочешь найти что-то новое — собирай датасет, размечай, переобучай.

Что такое YOLOE и как модель обходит «вшитый» лейблинг

Овервью YOLOE
Овервью YOLOE

В YOLOE (You Only Look Once - Everything) backbone и PAN остаются теми же, что в обычном YOLO. За небольшим исключением, это та же самая модель.

Меняется только то, с чем сравнивается эмбеддинг обнаруженного объекта в голове детектора. Вместо фиксированных классов туда подаются векторы из текстового энкодера, запущенного один раз перед инференсом.

Для этого авторы предложили RepRTA (Re-parameterizable Region-Text Alignment): лёгкая вспомогательная сеть уточняет предобученные текстовые эмбеддинги и улучшает согласование визуальных и текстовых признаков. При инференсе текстовый энкодер убирается, а его результаты складываются обратно в веса основной сети через ре-параметризацию. Скорость остаётся как у обычной YOLO. Никакого оверхеда в рантайме.

Итого, вместо разметки данных, дотренировок и классического флоу разработки YOLO-модели можно взять YOLOE:

from ultralytics import YOLOE

model = YOLOE("yoloe-26m-seg.pt")  # инициализируем модель

model.set_classes(["person", "bus"])  # вместо классов из тренировки -

# текстовым энкодером через RepRTA задаём новые, произвольные!

results = model.predict("path/to/image.jpg")  # текстовый энкодер уже

# не участвует в инференсе - векторы классов сохранены в архитектуре

Помимо текстовых подсказок, YOLOE поддерживает визуальные промпты через модуль SAVPE (Semantic-Activated Visual Prompt Encoder). Можно показать модели изображение-пример, и она начнёт искать похожие объекты без текстового описания вообще. Полезно там, где объект проще показать, чем описать: нестандартный дефект, редкая деталь, специфическая упаковка.

import numpy as np

from ultralytics import YOLOE

from ultralytics.models.yolo.yoloe import YOLOEVPSegPredictor

model = YOLOE("yoloe-26m-seg.pt")

# Боксы объектов на референсном изображении и их ID классов

visual_prompts = dict(

    bboxes=np.array([

        [221.52, 405.8, 344.98, 857.54],  # Person

        [120, 425, 160, 445],              # Bus

    ]),

    cls=np.array([0, 1]),

)

results = model.predict(

    "ultralytics/assets/bus.jpg",

    refer_image="reference.jpg",

    visual_prompts=visual_prompts,

    predictor=YOLOEVPSegPredictor,

)

results[0].show()

Наконец, есть режим без подсказок: модель автоматически распознаёт более 1200 категорий из встроенного словаря. Запускаете на изображении, не описывая ничего.

from ultralytics import YOLOE

model = YOLOE("yoloe-26m-seg-pf.pt")

results = model.predict("path/to/image.jpg")  # best guess из открытого словаря

results[0].show()

Когда YOLOE работает, а когда нет

Честно говоря — это не серебряная пуля. Мы успели испытать подход на нескольких задачах, где-то перешли обратно на стандартные YOLO, где-то оставили YOLOE.
Выводы такие:

Работает хорошо, когда задача чётко описывается словами или визуальным примером, объекты визуально различимы и не требуют узкоспециализированного контекста.

Работает хуже, когда классы визуально похожи и различаются тонкими деталями, объект настолько специфичен, что предобученная модель его «не видела», или нужна точность выше 95-98% на нестандартных данных.

В таких случаях YOLOE можно использовать как отправную точку: запустить, посмотреть на качество, и уже по результатам решать хватит ли настройки энкодеров или всё-таки тренировать.

Примеры задач без дотренировки

Несколько практических сценариев, где текстовых промптов, как правило, достаточно.

Контроль маркировки и упаковки. Обнаружение QR-кода, повреждённой этикетки или неправильно ориентированной упаковки на конвейере. Классы формулируются прямолинейно, объекты визуально различимы. Нам это помогло в кейсе с распознаванием корректной маркировки мясной продукции, которая недавно это стала обязательным требованием к производствам.

Контроль рабочей зоны. Обнаружение посторонних предметов в зоне, которая должна быть пустой, или отсутствия нужного инструмента на рабочем месте.

Подсчёт и классификация объектов на складе. Склады постоянно имеют дело с меняющейся продукцией. Свободный промптинг серьёзно сокращает затраты на обучение модели.

Детекция очевидных дефектов. Царапины, сколы, грубые деформации на поверхности - если дефект визуально выражен и хорошо описывается словами.

YOLOE не заменяет дообучение там, где нужна высокая точность на специфических данных. Но убирает порог входа и меняет сам подход к задачам компьютерного зрения.

Если интересно обсудить похожую задачу — пишите. Расскажу подробнее, как можно внедрить детекцию на вашем объекте.