Sobes.tech
Back to questions
Middle — Senior
8

Что является таргетом в задаче детекции и как формируется функция потерь?

Answer from AI

sobes.tech AI

Что хотят услышать интервьюеры:

В детекции таргет обычно состоит из двух частей: геометрии объекта и его класса. Функция потерь почти всегда тоже составная: отдельно штрафует ошибку локализации и ошибку классификации, а в некоторых постановках — ещё и objectness/наличие объекта. Важно понимать, что таргеты и лосс зависят от конкретной архитектуры, но общий принцип один.

Определение:

Таргет в задаче object detection — это разметка, к которой модель должна приблизить свои предсказания. Обычно для каждого объекта задаются координаты bounding box и класс объекта, а для одноэтапных детекторов дополнительно могут быть таргеты для якорей, objectness или распределения по сетке.

Функция потерь в детекции обычно комбинированная:

  • loss на координаты бокса, чтобы модель точно локализовала объект;
  • loss на класс, чтобы правильно определяла категорию;
  • иногда loss на objectness или качество совпадения предсказания с таргетом.

Итоговая loss часто выглядит как взвешенная сумма нескольких компонент.

Пример использования:

Например, если на изображении есть человек, то таргет может включать класс person и координаты бокса [x1, y1, x2, y2]. Модель предсказывает свой бокс и вероятность класса, после чего считаются две ошибки: насколько предсказанный бокс отличается от истинного и насколько уверенность по классу соответствует разметке.

# Упрощённый пример составной loss для детекции
import torch
import torch.nn.functional as F

# pred_box: [B, 4] - предсказанные координаты
# true_box: [B, 4] - истинные координаты
# pred_cls: [B, C] - logits по классам
# true_cls: [B]    - индекс истинного класса

box_loss = F.smooth_l1_loss(pred_box, true_box)
cls_loss = F.cross_entropy(pred_cls, true_cls)

alpha = 1.0
beta = 1.0
total_loss = alpha * box_loss + beta * cls_loss

В более реальных моделях к этому может добавляться loss на objectness, IoU-based loss, focal loss и дополнительные штрафы для якорей.

Пояснение кода:

Код показывает базовую идею, как собирается loss для детекции.
Smooth L1 используется для координат, потому что она обычно стабильнее обычной MSE при выбросах и небольших расхождениях.
CrossEntropy используется для классификации, потому что это стандартный лосс для многоклассовой задачи по logits.
Затем обе компоненты складываются с весами, чтобы можно было балансировать вклад локализации и классификации.

Если бы это была не кодовая задача, код не требуется: важно понимать, что на этапе обучения для каждого предсказания модели заранее строится target, а затем по нему считается ошибка отдельно за координаты и за класс, после чего ошибки агрегируются в общий loss.

Ключевые моменты:

  • Таргет в детекции обычно включает bbox + класс, а в некоторых моделях ещё objectness или дополнительные метки для anchors/points.
  • Loss почти всегда составной: локализация, классификация и иногда objectness.
  • Для координат часто используют Smooth L1, L1, IoU/GIoU/DIoU/CIoU-based loss.
  • Для классов обычно используют Cross Entropy или Focal Loss.
  • В anchor-based/anchor-free детекторах таргет формируется по-разному, но цель одна: сопоставить предсказания модели с истинными объектами.
  • Важно учитывать баланс весов между компонентами loss, иначе модель может хорошо классифицировать, но плохо локализовать, или наоборот.