Глава 7b. Голова и loss

Глава 7b. Голова и функция потерь: где детекция становится честной

Можно иметь отличный backbone и шею —
и всё равно учить модель «угадывать числа», которые не совпадают с тем, что важно продукту.

Детектор в конце концов делает две вещи:
говорит класс и рисует прямоугольник.
Голова — как эти ответы разведены по веткам.
Loss — за что именно модель получает пощёчину.


7b.1. Coupled head: один путь на всё

Ранние одностадийники часто кормили общую башню признаков в одну голову, которая сразу выдаёт и класс, и геометрию (и objectness).

Coupled head

Плюс: дёшево, просто, быстро собрать.
Минус: задачи конфликтуют.

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


7b.2. Decoupled head: развести конфликтующие задачи

Гипотеза, которая стабильно отыгрывалась в современных YOLO-линиях:

После общей шеи разделим голову на две (или три) ветки
с небольшими отдельными свёртками.

Decoupled head

Обмен:

Получили Чем заплатили
+ качество за счёт специализации Чуть больше FLOPs/параметров на голову
Проще отлаживать ветки Нужно балансировать веса loss между ветками
Меньше «перетягивания» признаков Риск, что одна ветка недообучится

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


7b.3. Почему MSE по координатам — плохой учитель

Представим loss «как регрессию чисел»:

L = (x − x*)² + (y − y*)² + (w − w*)² + (h − h*)²

Инженерные дыры:

1. Одинаковый сдвиг в пикселях ≠ одинаковая беда.
5 пикселей на грузовике — мелочь. 5 пикселей на спичке — провал.

2. Координаты коррелируют.
Ошибка по w и h меняет перекрытие с GT нелинейно. MSE этого не видит.

3. Продуктовая метрика — про перекрытие и детект, не про L2 в координатах.
Мы оптимизируем одно, а рапортуем другое.

Отсюда переход к геометрии пересечения.


7b.4. IoU как язык боксов

IoU (Intersection over Union):

IoU = area(Pred ∩ GT) / area(Pred ∪ GT)

IoU пересечение

Loss вида 1 − IoU уже ближе к задаче.
Но у чистого IoU есть слепые зоны:

Случай Проблема чистого IoU
Нет пересечения IoU = 0, нет градиента «с какой стороны подтянуть»
Одинаковый IoU, разные центры Не различает «рядом» и «далеко»
Одинаковый IoU, разные пропорции Не штрафует aspect mismatch явно

Поэтому семейство наращивало члены:

IoU  →  GIoU  →  DIoU  →  CIoU  →  … (SIoU и др.)

Смысл эволюции важнее аббревиатур:

  • GIoU — добавить сигнал, когда пересечения нет (через наименьший охватывающий прямоугольник);
  • DIoU — явно тянуть центры друг к другу;
  • CIoU — ещё и согласовывать соотношение сторон.
flowchart TD
    A[MSE по x,y,w,h] --> B[Не совпадает с метрикой перекрытия]
    B --> C[IoU loss]
    C --> D[Нет пересечения / слабый сигнал]
    D --> E[GIoU/DIoU/CIoU: добавить геометрические штрафы]

7b.5. Не только бокс: баланс потерь

Реальная голова оптимизирует сумму:

L = λ_cls · L_cls  +  λ_box · L_box  +  λ_obj · L_obj  (+ …)

Типичные напряжения:

  • классификация хочет уверенности на трудных негативах (focal / varifocal и т.п.);
  • бокс хочет IoU;
  • objectness / IoU-aware quality пытается ответить: «насколько этому детектy верить» — мост между cls и reg;
  • assigner решает, какие предсказания вообще получают box-loss.

Поэтому «поставили CIoU» без настройки assign и весов часто даёт меньше, чем обещает абзац в README.

Качество детектора = признаки × assign × head × loss × postprocess.
Улучшение одного множителя легко съедается другим.


7b.6. Мини-лаборатория мышления

Проживите один баг продуктово:

Модель хорошо классифицирует автобус, но бокс систематически «короче» снизу.

Возможные гипотезы (проверяемые):

  1. Loss почти не штрафует aspect (слабый C-член / старый IoU).
  2. Assign даёт positive якорям/точкам, которым удобнее короткая форма.
  3. На этом уровне FPN мало нижней границы объекта (обрезка, аугментации).
  4. Coupled head отдаёт каналы классификации в ущерб краям.

Заметьте: ни одна гипотеза сразу не кричит «замените backbone».
Углубление детекции как раз учит искать поломку ближе к голове и loss.


Если бы вы были автором статьи…

  1. Абляции головы: coupled vs decoupled при одинаковом backbone/neck.
    Разложите выигрыш по мелким/средним/крупным объектам.

  2. Замените CIoU на IoU и нарисуйте распределение ошибок центра и aspect.
    Какой хвост отрастает?

  3. Сделайте quality-aware cls (умножение/ветка на IoU).
    Где это поможет NMS, а где навредит калибровке уверенности?

Теперь Часть III умеет отвечать не только «почему шея», но и «почему именно так учат бокс».
Осталась бюрократия кандидатов: assign на обучении и NMS на инференсе — глава 7c.