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

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

Пять строк отвечают на вопросы, от которых зависит каждый дальнейший шаг. В руководстве по определению целей проекта те же вопросы рассматриваются подробнее. Вот заполненный пример для склада, на который опирается этот курс:
| Строка | На какой вопрос отвечает | Пример для склада |
|---|---|---|
| Бизнес-цель | Что должно измениться для бизнеса и к какому сроку? | Сократить число опасных сближений у погрузочных ворот на 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% и подскажет команде по сбору данных, на что пока не стоит тратить усилия.
Показать решение
Пример формулировки цели для другого проекта: сеть продуктовых магазинов обнаруживает пустые места на полках.
| Строка | Ответ |
|---|---|
| Бизнес-цель | Сократить суммарное время отсутствия 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.