Что такое 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). Затем применяется:
-
Фильтрация по IoU — удаление дубликатов через non-maximum suppression (NMS): из перекрывающихся боксов оставляют только с максимальной уверенностью.
-
Оценка точности — считается, сколько предсказаний с IoU ≥ threshold совпали с ground truth.
-
Вычисление метрик:
-
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=IoU−C−UC\\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] | |
--- | --- |