Ultralytics YOLO27: Встать в лист ожидания.
Урокначинающий

Начни с бизнес-цели

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

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

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

Результат

Составь одностраничный план и преврати его метрику успеха в скрипт приемочного теста, который выводит PASS или FAIL для любой модели.

Ускоренное прохождение
Если ты уже освоился, вот краткая версия.
  1. Сформулируй бизнес-цель одним измеримым предложением с указанием срока.

  2. Выбери одну из семи задач компьютерного зрения — самую простую из тех, что решают эту задачу.

  3. Определи 3–10 классов, описав каждый одним предложением и указав похожий объект, который в этот класс не входит.

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

  5. Перечисли, с чем не будет работать версия v1.

Практические занятия

Одностраничный план#

Результаты задач Ultralytics YOLO рядом друг с другом: обнаружение объектов, оценка позы, сегментация, классификация, OBB, семантическая сегментация и глубина

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

СтрокаНа какой вопрос отвечаетПример для склада
Бизнес-цельЧто должно измениться для бизнеса и к какому сроку?Сократить число опасных сближений у погрузочных ворот на 30% за шесть месяцев.
Задача компьютерного зренияЧто выдает модель?Обнаружение объектов: рамки вокруг погрузчиков и людей.
КлассыЧто именно получает метку?forklift, person, pallet; все остальное считается фоном.
Приемочный тестКакое значение означает «можно запускать»?Полнота для person ≥ 0.95 при точности ≥ 0.85 на 500 кадрах с камер, не использованных при обучении.
За рамками задачиЧто не будет обещать версия v1?Совершенно темные погрузочные площадки, люди, полностью скрытые за стеллажами, ручные гидравлические тележки.

Закрепи эту страницу там, где ее увидит вся команда. Если позже кто-то из заинтересованных сторон оспорит какой-либо пункт, сначала измени страницу и только потом набор данных.

Выбери самую простую задачу, которая отвечает на вопрос#

Одна сцена с кошкой и собакой, рассмотренная тремя способами: классификация изображений определяет, кошка ли это, обнаружение объектов показывает, что и где находится, а сегментация изображений определяет, какие пиксели принадлежат каждому объекту

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

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

ЗадачаЧто создают аннотаторыТрудоемкость разметкиВыбирай, если
КлассификацияОдна метка на изображениеМинимальнаяДостаточно одного ответа на изображение
ДетекцияКласс и осеориентированная рамка для каждого объектаНизкаяНужно считать объекты или определять их местоположение
OBBКласс и повернутая рамка для каждого объектаСредняяОбъекты длинные и узкие или видны сверху
ПозаКласс и именованные ключевые точки для каждого объектаВысокаяВажно положение суставов или частей тела
Сегментация экземпляровКласс + полигон для каждого объектаВысокаяВажен контур каждого объекта
Семантическая сегментацияКласс для каждого пикселяНаивысшаяТебе нужны области, а не объекты, которые можно посчитать
Оценка глубиныНичего не размечается: карта глубины для каждого изображения, обычно полученная с датчика глубиныЗависит от оборудования для съёмкиТебе нужно знать расстояние для каждого пикселя

Типы разметки изображений на примере связки бананов: классификация показывает наличие бананов, детекция добавляет их местоположение и количество, семантическая сегментация показывает, какие пиксели относятся к бананам, а сегментация экземпляров добавляет размер и форму каждого банана

Воспринимай панель с бананами как прайс-лист: детекция уже определяет наличие, местоположение и количество, а размер и форму добавляют только две панели сегментации, причём стоимость разметки значительно выше. Если бизнесу нужно только знать, «сколько бананов», выбирай детекцию: полигоны — напрасная трата бюджета.

Сегментация по умолчанию быстро расходует бюджет

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

Опиши классы так, чтобы разметчик мог их применять#

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

  • forklift: механизированный вилочный погрузчик, включая вилы и мачту. Не включает ручные гидравлические тележки.
  • person: любой человек, в том числе частично видимый, сидящий или находящийся в кабине автомобиля. Не включает отражения и изображения на плакатах.
  • pallet: деревянный или пластиковый транспортный поддон, загруженный или пустой. Не включает штабели ящиков без основания-поддона.

Затем осознанно выбери степень детализации. Укрупнённые классы («транспортное средство») дешевле и позволяют быстрее получить результат; детализированные классы («седан», «пикап») полезнее для последующей обработки, но их сложнее размечать единообразно. Начни с того, что нужно бизнесу. Позже детализированные метки можно объединить в укрупнённые одной строкой кода, но укрупнённые метки нельзя разделить без повторной разметки.

Если правило нельзя записать, разметчики не смогут разметить данные

«Всё, что выглядит опасно» или «всё, что загромождает проход» — это не классы. Такие формулировки требуют от каждого разметчика самостоятельно принимать решение, а модель, обученная на противоречивых решениях, учится воспроизводить эти противоречия. Уточняй расплывчатый класс, пока новый разметчик не сможет применять его, опираясь только на определение, или преврати его в правило, которое применяется после детекции (например, «любой pallet внутри полигона прохода»).

Преврати метрику в приёмочный тест, который можно запустить#

Выбери метрику, соответствующую цене ошибки:

  • Пропуск обходится дорого (безопасность, дефекты): задай порог по полноте для этого класса.
  • Ложное срабатывание обходится дорого (автоматическая отбраковка деталей, оповещение сотрудников): задай порог по точности.
  • Все классы одинаково важны (подсчёт, инвентаризация): задай порог по AP для каждого класса, чтобы усреднение не скрывало результаты отдельных классов.

В руководстве по метрикам производительности YOLO разобрана каждая метрика. Затем запиши тест в виде кода, чтобы вопрос «достаточно ли это хорошо?» перестал быть предметом споров. Этот скрипт можно запустить уже сейчас с предварительно обученной моделью на демонстрационном наборе COCO8, а позже — со своим чекпойнтом и отложенной выборкой:

from ultralytics import YOLO

model = YOLO("yolo26n.pt")  # later: your fine-tuned runs/detect/train/weights/best.pt
metrics = model.val(data="coco8.yaml", classes=[0], verbose=False)  # 0 = person; later: your holdout YAML

precision, recall = metrics.box.mp, metrics.box.mr
print(f"person: precision={precision:.2f} recall={recall:.2f}")
print("PASS" if recall >= 0.95 and precision >= 0.85 else "FAIL: below the acceptance test")
                   all          4         10      0.939        0.8      0.848      0.387
person: precision=0.94 recall=0.80
FAIL: below the acceptance test

Что показывает каждая строка:

  • classes=[0] оценивает только person, поэтому другие классы не могут завысить результат. Укажи ID своего класса безопасности.
  • В строке валидатора указаны 4 изображения с 10 размеченными людьми. mp и mr — это точность и полнота при пороге уверенности, на котором они лучше всего сбалансированы (максимальный F1).
  • Предварительно обученная модель COCO обнаруживает 8 из 10 человек, поэтому полнота равна 0,80: результат точный, но недостаточно надёжный. Именно для этого тест и выдаёт FAIL. В этом курсе FAIL означает, что нужно вернуться к данным, а не к гиперпараметрам.
Условие отложенной выборки не менее важно, чем её размер

Тестовая выборка, снятая теми же камерами и в те же дни, что и обучающие данные, проверяет запоминание, а не готовность модели. Укажи отложенную выборку в цели («камеры, не использованные при обучении», «последние две недели видеозаписей») и сформируй её согласно руководству Как правильно разделить набор данных.

Запиши, чего не будет делать v1#

Идеальных моделей не бывает, поэтому заранее укажи допустимые пропуски: условия, на которые ты не будешь давать гарантий (сильный туман, полная темнота), похожие объекты, которые модель может путать, и редкие классы, отложенные до v2. Этот пункт не позволит оценивать модель, достигшую целевого показателя, по негласному требованию 100% и подскажет команде по сбору данных, на что пока не стоит тратить усилия.

Попробовать

Заполни таблицу целей из пяти строк для своего проекта и отправь её человеку, отвечающему за бизнес-результат. Пересмотри каждую строку, которую он поставит под вопрос. Затем скопируй acceptance_test.py, укажи ID класса и пороговые значения и запусти скрипт с предварительно обученной моделью, чтобы тест был готов ещё до появления набора данных. Результат: objective.md и рабочий acceptance_test.py.

Критерии готовности
Урок считается завершённым, если выполнены все условия ниже.
  • Бизнес-цель сформулирована одним измеримым предложением с указанием срока, и ответственный за неё согласился с этой целью.

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

  • acceptance_test.py запускается и выводит PASS или FAIL для метрики, порога и указанной отложенной выборки.

Показать решение

Пример формулировки цели для другого проекта: сеть продуктовых магазинов обнаруживает пустые места на полках.

СтрокаОтвет
Бизнес-цельСократить суммарное время отсутствия 200 самых продаваемых товаров на полках на 25% за один квартал.
Задача компьютерного зренияДетекция. Магазину нужно местоположение каждого пустого места, а не его контур, поэтому ограничивающие рамки лучше полигонов.
Классыgap: пустое место на полке шириной не менее одного товара; не включает места, закрытые покупателем или тележкой. price_tag: ценник на кромке полки; не включает рекламные наклейки.
Приемочный тестПолнота для gap ≥ 0.90 при точности ≥ 0.80 на 400 изображениях из 5 магазинов, не использованных при обучении.
За рамками задачиДверцы морозильников с бликами, торцевые стеллажи, отдел овощей и фруктов.

Полнота важнее, потому что пропущенное пустое место означает потерю продажи, а ложное срабатывание — лишь короткую прогулку сотрудника. В acceptance_test.py нужно изменить только три места: data="holdout_stores.yaml" (пять неизвестных модели магазинов), classes=[0] (теперь 0 — это gap) и пороги recall >= 0.90 and precision >= 0.80.

Что дальше

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

Войди, чтобы сохранять прогресс