Детекция объектов: 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 убирает дублирующие рамки, оставляя по одной на объект.