Глава 8. Сдвигая горы: Пирамиды признаков (FPN / PAN)
На глубоких слоях сеть знает, что перед ней, но забыла, где это.
На ранних слоях она знает, где, но ещё не поняла, что.
Одностадийный детектор из главы 7 смотрит один раз.
Но «один раз» на каком масштабе признаков?
Если только на самом глубоком тензоре после ×32 downsampling, мелкие объекты превращаются в один «пиксель смысла».
Если только на ранних картах — есть координаты, нет семантики.
Нужен механизм, который сшивает масштабы.
8.1. Семантика против локализации
Типичный backbone после стека stride-2:
Конфликт:
| Уровень | Плюс | Минус |
|---|---|---|
| Ранний | Острые края, мелкие объекты | Слабый контекст, «глупые» признаки |
| Глубокий | Классово богатые признаки | Плохая геометрия, смерть мелочи |
Детектору нужны оба мира сразу.
8.2. Путь сверху вниз: FPN
Идея Feature Pyramid Network (упрощённо):
- взять самый глубокий признак (много смысла);
- увеличить его пространственно (upsample);
- сложить/слить с более ранней картой того же размера;
- повторить вниз по пирамиде.
Смысл операции FPN:
Глубокий слой говорит: «здесь примерно машина».
Ранний слой говорит: «края вот тут».
Слияние даёт карту, где есть и класс, и геометрия.
Это и есть top-down путь: семантика стекает вниз на более высокое разрешение.
Обмен:
| Получили | Чем заплатили |
|---|---|
| Многомасштабные головы | Доп. память и latency на шее |
| Лучше мелкие объекты | Нужно аккуратно сливать каналы |
| Единый язык признаков по уровням | Сложнее отлаживать, чем один выход |
8.3. Путь снизу вверх: PAN
FPN отлично раздаёт смысл вниз.
Но точная локализация, родившаяся внизу, не всегда достаточно сильно возвращается наверх.
YOLO-семейство (начиная с линии v4 и дальше) усиливает шею вторым проходом — bottom-up aggregation (PAN и родственники):
После top-down делаем ещё один подъём: детали и точные границы помогают более глубоким уровням.
Интуиция:
FPN: «умное» → подтягиваем к «чёткому»
PAN: «чёткое» → подтягиваем обратно к «умному»
В сумме шея (Neck) становится не тонкой трубочкой, а двусторонней развязкой масштабов.
flowchart TD
B[Backbone C3/C4/C5] --> FPN[FPN top-down]
FPN --> PAN[PAN bottom-up]
PAN --> H1[Head /8]
PAN --> H2[Head /16]
PAN --> H3[Head /32]
Именно поэтому в современных детекторах так много линий со стрелками между уровнями: это не украшение схемы, а плата за одновременную жизнь муравья и грузовика в одном кадре.
8.4. SPP/SPPF: ещё один ответ на масштаб — внутри уровня
Пока мы сшивали разные уровни пирамиды.
Есть родственная боль: даже на одном тензоре рецептивное поле фиксировано.
Spatial Pyramid Pooling (и быстрый SPPF) агрегирует контекст разными окнами pooling и склеивает:
Это не замена FPN.
Это усилитель «разного зрения» на самом глубоком (или выбранном) уровне перед раздачей по шее.
В книге про мышление архитектора важно разделить:
| Инструмент | Какую боль лечит |
|---|---|
| SPP/SPPF | Мало контекста при фиксированном поле зрения |
| FPN | Семантика не доходит до высокого разрешения |
| PAN | Детали/локализация слабо идут обратно наверх |
| Много голов | Разным размерам объектов нужны разные ответы |
8.5. Итог главы
Один проход ≠ один масштаб
- Backbone даёт башню признаков
- FPN раздаёт смысл вниз
- PAN возвращает геометрию вверх
- Головы читают несколько уровней параллельно
Мы почти собрали современный детектор логически.
Не хватает последнего большого ускорителя внутри самого хребта: зачем прогонять все каналы через все тяжёлые блоки, если часть информации можно провести транзитом.
Если бы вы были автором статьи…
-
Уберите PAN, оставьте FPN. Каких объектов станет больше в ошибках — крупных или мелких? Как измерите?
-
Три головы против одной. Придумайте критерий, когда третья голова (например /8) не окупает latency.
-
Вместо сложения признаков на слиянии поставьте attention.
Какую гипотезу вы проверяете? Чем ваш эксперимент отличается от «просто RT-DETR»?
Следующая глава — CSP и C2f: экономия вычислений без обнуления глубины.