Глава 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+):
Пусть точка/ячейка предсказывает бокс напрямую
(расстояния до сторон, центр+размер и т.п.)
без дискретного меню якорей.
Что меняется в голове архитектора:
- меньше «магии» кластеризации 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 как часть модели.
Если бы вы были автором статьи…
-
Пересчитайте якоря k-means на своём датасете vs COCO-defaults.
На сколько сдвинется mAP без смены архитектуры? -
Абляции числа якорей: 1 / 3 / 9 на ячейку при фиксированном FLOPs.
Где начинается режим «больше мусора, чем сигнала»? -
Спроектируйте переходный вариант: один «якорь» = просто stride-зависимый prior размера уровня FPN.
Это ещё anchor-based или уже почти free?
В следующей углубляющей главе разберём голову и функцию потерь: даже идеальный кодировщик бокса бесполезен, если сеть штрафуется за ошибку «не в тех единицах».