Глава 7a. Якоря

Глава 7a. Якоря: зачем придумали и почему потом выкинули

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

В главе 7 сетка взяла на себя ответственность за объекты.
Но остался практический вопрос: в каком виде предсказывать геометрию бокса?

Долгое время ответ индустрии звучал: через anchor boxes (priors).


7a.1. Боль: произвольный бокс — неудобная мишень

Бокс можно кодировать как (x, y, w, h) или углы (x1, y1, x2, y2).
Для одностадийного детектора на сетке наивная регрессия «с нуля» сталкивается с тем, что:

  • объекты сильно различаются по масштабу и пропорциям;
  • распределение ширин/высот в датасете далеко не равномерное;
  • одной ячейке часто приходится объяснять несколько форм (человек vs машина vs спичка).

Инженерная гипотеза эпохи Faster R-CNN / YOLOv2–v5:

Зафиксируем набор типовых прямоугольников-заготовок.
Сеть предсказывает не абсолютный бокс, а дельта относительно якоря: сдвиг центра, масштаб ширины/высоты.

Якорь и дельта

На каждой ячейке — несколько якорей (разные aspect ratio / площади).
Получается веер гипотез «из коробки».


7a.2. Что якоря реально купили

Плюс Смысл
Лучший старт регрессии Учить поправку проще, чем абсолют
Покрытие форм Высокие/широкие объекты получают «своего» кандидата
Совместимость с assign Можно сказать: якорь отвечает за GT, если IoU высокий

Схема ответственности:

Сопоставление с якорем

Это уже целая подсистема: пороги IoU, ignore-зоны, баланс pos/neg.
Детекция начинает напоминать не «одну голову», а бюро распределения задач.


7a.3. Счёт за якоря

Якоря — классический prior. Как любой prior, они мстят вне своего распределения.

1. Гиперпараметры датасета.
Кластеризация якорей на COCO не обязана быть идеальной для ваших камер и аспектов. Плохие priors = лишняя борьба регрессии.

2. Комбинаторный мусор.
Много якорей × много ячеек × много уровней = море негативов. Нужны sampling / focal loss / сложные assigners.

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

4. Неловкость на необычных формах.
Очень тонкие, повёрнутые, экстремальные боксы плохо ложатся на фиксированный набор.

Якорь = сильный prior на форму.
Помогает, пока мир похож на priors.
Мешает, когда мир другой или priors устарели.


7a.4. Anchor-free: убрать заготовки, оставить геометрию

Контр-гипотеза, которая победила во многих современных одностадийниках (включая линию YOLOv8+):

Пусть точка/ячейка предсказывает бокс напрямую
(расстояния до сторон, центр+размер и т.п.)
без дискретного меню якорей.

Anchor-based и anchor-free

Что меняется в голове архитектора:

  • меньше «магии» кластеризации priors;
  • assigner всё равно нужен (кто positive?), но он уже про положение и качество совпадения, а не про меню форм;
  • качество сильнее опирается на loss (IoU-семейство) и на многомасштабную шею.

Не путать: anchor-free ≠ без индуктивных смещений.
Сетка, уровни FPN, диапазоны объектов по stride — это тоже priors. Просто другой формы.

flowchart TD
    A[Как кодировать бокс?] --> B[Через якоря + дельты]
    A --> C[Напрямую от точки/ячейки]
    B --> B1[Сильный shape prior]
    B --> B2[Кластеры / много гипотез]
    C --> C1[Меньше shape prior]
    C --> C2[Жёстче спрос к loss и assign]

7a.5. Когда якоря всё ещё имеют смысл

Честный остаток:

  • мало данных и стабильные формы объектов (детали на конвейере одного типа);
  • двухстадийные пайплайны, где anchors/proposals — родной язык;
  • задачи с сильным доменным знанием размеров (лица на фиксированной камере).

Правило обмена:

Якоря выгодны, когда распределение форм узкое и известное.
Anchor-free выгоднее, когда форм много, домен плывёт,
а вы не хотите таскать кластеры priors как часть модели.


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

  1. Пересчитайте якоря k-means на своём датасете vs COCO-defaults.
    На сколько сдвинется mAP без смены архитектуры?

  2. Абляции числа якорей: 1 / 3 / 9 на ячейку при фиксированном FLOPs.
    Где начинается режим «больше мусора, чем сигнала»?

  3. Спроектируйте переходный вариант: один «якорь» = просто stride-зависимый prior размера уровня FPN.
    Это ещё anchor-based или уже почти free?

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