Что такое IoU (Intersection over Union)?

IoU (Intersection over Union) — это метрика, широко применяемая в задачах обнаружения объектов (object detection), семантической сегментации и других областях компьютерного зрения, где необходимо сравнить предсказанную область с эталонной (истинной) областью. IoU измеряет степень совпадения между двумя областями — обычно это прямоугольники (bounding boxes) или маски сегментации.

Формальное определение

IoU — это отношение площади пересечения (intersection) двух областей к площади их объединения (union).

IoU=Площадь пересеченияПлощадь объединения=A∩BA∪B\text{IoU} = \frac{\text{Площадь пересечения}}{\text{Площадь объединения}} = \frac{A \cap B}{A \cup B}

  • A — предсказанная область (prediction)

  • B — истинная (разметка, ground truth)

Значение IoU всегда находится в диапазоне от 0 до 1:

  • 0 — нет пересечения

  • 1 — полное совпадение областей

Пример для bounding boxes (прямоугольников)

Пусть:

  • Истинный бокс (ground truth):
    x1 = 50, y1 = 50, x2 = 150, y2 = 150 → размер 100×100

  • Предсказанный бокс:
    x1 = 100, y1 = 100, x2 = 200, y2 = 200 → размер тоже 100×100

Пересечение: квадрат со сторонами от (100,100) до (150,150) → площадь 50×50 = 2500
Объединение: площадь обоих прямоугольников = 10000 + 10000 - 2500 = 17500

IoU=250017500=0.142857≈0.143\text{IoU} = \frac{2500}{17500} = 0.142857 \approx 0.143 Интерпретация значений IoU

IoU значение Интерпретация
0 Нет пересечения
--- ---
0–0.3 Плохое совпадение
--- ---
0.5 Минимум для корректного обнаружения
--- ---
> 0.7 Хорошее совпадение
--- ---
1.0 Идеальное совпадение
--- ---

Во многих задачах object detection, например, в COCO или PASCAL VOC, детекция считается успешной, если IoU ≥ 0.5 или IoU ≥ 0.75, в зависимости от настроек метрики.

Расчёт IoU для прямоугольников

В практических реализациях IoU рассчитывается по координатам:

Пусть:

  • Прямоугольник A: (x1_A, y1_A, x2_A, y2_A)

  • Прямоугольник B: (x1_B, y1_B, x2_B, y2_B)

Пересечение:

x1_inter = max(x1_A, x1_B)

y1_inter = max(y1_A, y1_B)

x2_inter = min(x2_A, x2_B)

y2_inter = min(y2_A, y2_B)

Если x2_inter < x1_inter или y2_inter < y1_inter, значит пересечения нет.

inter_area = max(0, x2_inter - x1_inter) \* max(0, y2_inter - y1_inter)

Площади:

area_A = (x2_A - x1_A) \* (y2_A - y1_A)
area_B = (x2_B - x1_B) \* (y2_B - y1_B)
union_area = area_A + area_B - inter_area

IoU:

iou = inter_area / union_area

IoU в задаче object detection

В задачах обнаружения объектов (например, YOLO, SSD, Faster R-CNN), модель выдает множество прямоугольников (bounding boxes) с разной уверенностью (confidence score). Затем применяется:

  1. Фильтрация по IoU — удаление дубликатов через non-maximum suppression (NMS): из перекрывающихся боксов оставляют только с максимальной уверенностью.

  2. Оценка точности — считается, сколько предсказаний с IoU ≥ threshold совпали с ground truth.

  3. Вычисление метрик:

    • Precision: доля корректных предсказаний

    • Recall: доля найденных истинных объектов

    • mAP (mean Average Precision): средняя точность при разных значениях IoU

IoU в сегментации

В задаче семантической или instance-сегментации, IoU применяется не к прямоугольникам, а к маскам (массивам пикселей):

IoU=Число общих белых пикселейЧисло всех белых пикселей на масках\text{IoU} = \frac{\text{Число общих белых пикселей}}{\text{Число всех белых пикселей на масках}}

Пример (в бинарных масках):

  • Предсказанная маска: 120 пикселей белые

  • Истинная маска: 100 пикселей белые

  • Общих белых: 80

IoU=80(100+120−80)=80140≈0.571\text{IoU} = \frac{80}{(100 + 120 - 80)} = \frac{80}{140} \approx 0.571

Расширенные версии IoU

Для улучшения качества оценки и решения особых случаев разработаны модификации IoU:

1. GIoU (Generalized IoU)

Добавляет штраф за несовпадающие прямоугольники, даже если пересечения нет.

GIoU=IoUCUC\\text{GIoU} = \\text{IoU} - \\frac{C - U}{C}  

где:

  • C — площадь минимального охватывающего прямоугольника

  • U — площадь объединения

Используется в loss-функциях при обучении object detection.

2. DIoU / CIoU

Учитывают расстояние между центрами, а также соотношение сторон прямоугольников. Более точны при обучении моделей, чувствительных к форме объектов.

Использование в библиотеках Python

OpenCV: прямой поддержки нет, но можно реализовать вручную

def compute_iou(boxA, boxB):
xA = max(boxA\[0\], boxB\[0\])
yA = max(boxA\[1\], boxB\[1\])
xB = min(boxA\[2\], boxB\[2\])
yB = min(boxA\[3\], boxB\[3\])
interArea = max(0, xB - xA) \* max(0, yB - yA)
boxAArea = (boxA\[2\] - boxA\[0\]) \* (boxA\[3\] - boxA\[1\])
boxBArea = (boxB\[2\] - boxB\[0\]) \* (boxB\[3\] - boxB\[1\])
iou = interArea / float(boxAArea + boxBArea - interArea)
return iou

PyTorch и torchvision

import torchvision.ops as ops
boxes1 = torch.tensor(\[\[0, 0, 100, 100\]\], dtype=torch.float)
boxes2 = torch.tensor(\[\[50, 50, 150, 150\]\], dtype=torch.float)
ious = ops.box_iou(boxes1, boxes2)

TensorFlow / Keras

import tensorflow as tf
iou = tf.image.iou(
boxes1, boxes2 # Должны быть нормализованы \[0,1\]
)

Применение IoU в реальных задачах

Область применения Как используется IoU
Object Detection Оценка качества предсказанных bounding boxes
--- ---
Instance Segmentation Сравнение предсказанных и истинных масок
--- ---
Non-Maximum Suppression (NMS) Удаление перекрывающихся боксов
--- ---
Обучение нейросетей В loss-функциях (IoU loss, GIoU loss и др.)
--- ---
Benchmark датасеты PASCAL VOC: точность при IoU ≥ 0.5
--- ---
COCO: mAP@[IoU=0.5:0.95]
--- ---