Глава 7b. Голова и функция потерь: где детекция становится честной
Можно иметь отличный backbone и шею —
и всё равно учить модель «угадывать числа», которые не совпадают с тем, что важно продукту.
Детектор в конце концов делает две вещи:
говорит класс и рисует прямоугольник.
Голова — как эти ответы разведены по веткам.
Loss — за что именно модель получает пощёчину.
7b.1. Coupled head: один путь на всё
Ранние одностадийники часто кормили общую башню признаков в одну голову, которая сразу выдаёт и класс, и геометрию (и objectness).
Плюс: дёшево, просто, быстро собрать.
Минус: задачи конфликтуют.
Классификации полезны текстуры и семантика («есть перья»).
Регрессии бокса полезны края и геометрия («где кончается крыло»).
Общие признаки вынуждены быть компромиссом внутри одних и тех же каналов на последних слоях.
7b.2. Decoupled head: развести конфликтующие задачи
Гипотеза, которая стабильно отыгрывалась в современных YOLO-линиях:
После общей шеи разделим голову на две (или три) ветки
с небольшими отдельными свёртками.
Обмен:
| Получили | Чем заплатили |
|---|---|
| + качество за счёт специализации | Чуть больше 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)
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. Мини-лаборатория мышления
Проживите один баг продуктово:
Модель хорошо классифицирует автобус, но бокс систематически «короче» снизу.
Возможные гипотезы (проверяемые):
- Loss почти не штрафует aspect (слабый C-член / старый IoU).
- Assign даёт positive якорям/точкам, которым удобнее короткая форма.
- На этом уровне FPN мало нижней границы объекта (обрезка, аугментации).
- Coupled head отдаёт каналы классификации в ущерб краям.
Заметьте: ни одна гипотеза сразу не кричит «замените backbone».
Углубление детекции как раз учит искать поломку ближе к голове и loss.
Если бы вы были автором статьи…
-
Абляции головы: coupled vs decoupled при одинаковом backbone/neck.
Разложите выигрыш по мелким/средним/крупным объектам. -
Замените CIoU на IoU и нарисуйте распределение ошибок центра и aspect.
Какой хвост отрастает? -
Сделайте quality-aware cls (умножение/ветка на IoU).
Где это поможет NMS, а где навредит калибровке уверенности?
Теперь Часть III умеет отвечать не только «почему шея», но и «почему именно так учат бокс».
Осталась бюрократия кандидатов: assign на обучении и NMS на инференсе — глава 7c.