Детекция объектов: bounding box, YOLO и R-CNN

Детекция отвечает не только «что», но и «где»: находит объекты и обводит каждый рамкой.

Bounding box (ограничивающая рамка) — прямоугольник вокруг объекта, заданный координатами; вместе с классом это и есть результат детекции.

Чем детекция сложнее классификации

Классификатор знает: на картинке один объект, нужен один ярлык. Детектор сложнее: объектов может быть сколько угодно (или ни одного), они разного размера, перекрывают друг друга. Сеть должна выдать список: для каждого объекта — класс и координаты рамки (x1, y1, x2, y2).

Метрика IoU

Как понять, что предсказанная рамка «правильная»? Сравнивают её с истинной по IoU (Intersection over Union) — отношению площади пересечения к площади объединения. IoU = 1 — рамки совпали идеально, IoU = 0 — не пересекаются. Обычно срабатывание засчитывают при IoU больше 0.5.

def iou(a, b):
    # рамка = (x1, y1, x2, y2)
    ix1, iy1 = max(a[0], b[0]), max(a[1], b[1])
    ix2, iy2 = min(a[2], b[2]), min(a[3], b[3])
    iw, ih = max(0, ix2 - ix1), max(0, iy2 - iy1)
    inter = iw * ih
    area_a = (a[2] - a[0]) * (a[3] - a[1])
    area_b = (b[2] - b[0]) * (b[3] - b[1])
    union = area_a + area_b - inter
    return inter / union

pred = (10, 10, 50, 50)
true = (20, 20, 60, 60)
print("IoU =", round(iou(pred, true), 3))

Вывод:

IoU = 0.391

Рамки заметно пересекаются, но IoU = 0.39 ниже порога 0.5 — такое предсказание считалось бы неточным. IoU — главная «линейка» детекции.

Два семейства детекторов

ПодходКак работаетКомпромисс
Двухстадийные (R-CNN, Faster R-CNN)сначала предлагают области-кандидаты, потом классифицируют каждуюточнее, но медленнее
Одностадийные (YOLO, SSD)за один проход сразу предсказывают рамки и классы по всей картинкебыстрее (реальное время), чуть менее точны

R-CNN и его развитие (Fast/Faster R-CNN) сначала отбирают перспективные регионы, затем разбирают их по отдельности — отсюда высокая точность ценой скорости. YOLO (You Only Look Once) делит картинку сеткой и за один прогон предсказывает всё сразу. Поэтому YOLO работает в реальном времени и стоит в видеоаналитике, автопилотах, дронах.

Подавление лишних рамок

Детектор часто выдаёт несколько перекрывающихся рамок на один объект. Их прореживают алгоритмом NMS (Non-Maximum Suppression): оставляют самую уверенную рамку, а сильно пересекающиеся с ней (большой IoU) удаляют. Так на каждый объект остаётся одна рамка.

Итог

  • Детекция выдаёт список: класс + рамка для каждого объекта.
  • IoU (пересечение/объединение) измеряет точность рамки; порог обычно 0.5.
  • R-CNN — точнее, но медленнее; YOLO — быстрее, для реального времени.
  • NMS убирает дублирующие рамки, оставляя по одной на объект.
Проверьте себя
1. Что измеряет метрика IoU в детекции?
AЯркость рамки
BОтношение площади пересечения предсказанной и истинной рамок к площади их объединения
CЧисло объектов на картинке
DСкорость работы сети
2. Чем одностадийные детекторы вроде YOLO отличаются от двухстадийных R-CNN?
AYOLO не использует нейросети
BYOLO за один проход предсказывает рамки и классы сразу, поэтому быстрее (реальное время), но обычно чуть менее точен
CR-CNN работает только с видео
DМежду ними нет разницы
3. Зачем детектору нужен NMS (Non-Maximum Suppression)?
AЧтобы увеличить число рамок
BЧтобы убрать дублирующие перекрывающиеся рамки на один объект, оставив самую уверенную
CЧтобы перевести картинку в серый
DЧтобы ускорить обучение
Поддержать проект