Fork me on GitHub

交并比IOU(Intersection over Union)

基本原理

IOU是在目标检测中使用的一个概念,是产生的预测框(Predicted bounding box)与标注框(Ground-truth bounding box)的重叠率;简单来说,即两个矩形框面积的交集和并集的比值;它是一个在特定数据集中检测相应物体准确度的测量标准。通常会在HOG + Linear SVM object detectorsConvolutional Neural Network detectors (R-CNN, Faster R-CNN, YOLO 等)中使用该方法检测其性能。
IOU是一个简单的测量标准,在输出中得出一个预测范围(bounding box)的任务都可以用IOU来测量。其用于测量真实和预测之间的相关度,相关度越高,该值越高。

上图展示了ground-truthpredicted的结果,绿色标线是人为标记的正确结果,红色标线是算法预测出来的结果,IOU要做的就是在这两个结果中测量算法的准确度。


一般来说,这个比值 > 0.5 就可以认为是一个不错的结果了。

Python源码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import numpy as np
def compute_iou(box1, box2, wh=False):
"""
compute the iou of two boxes.
args:
box1, box2: [xmin, ymin, xmax, ymax] (wh=False) or [xcenter, ycenter, w, h] (wh=True)
wh: the format of coordinate.
return:
iou: iou of box1 and box2.
"""
if wh == False:
xmin1, ymin1, xmax1, ymax1 = box1
xmin2, ymin2, xmax2, ymax2 = box2
else:
xmin1, ymin1 = int(box1[0] - box1[2] / 2.0), int(box1[1] - box1[3] / 2.0)
xmax1, ymax1 = int(box1[0] + box1[2] / 2.0), int(box1[1] + box1[3] / 2.0)
xmin2, ymin2 = int(box2[0] - box2[2] / 2.0), int(box2[1] - box2[3] / 2.0)
xmax2, ymax2 = int(box2[0] + box2[2] / 2.0), int(box2[1] + box2[3] / 2.0)

## 计算两个矩形框面积
area1 = (xmax1 - xmin1) * (ymax1 - ymin1)
area2 = (xmax2 - xmin2) * (ymax2 - ymin2)

## 获取矩形框交集对应的左上角和右下角的坐标(intersection)
inter_x1 = np.max([xmin1, xmin2])
inter_y1 = np.max([ymin1, ymin2])
inter_x2 = np.min([xmax1, xmax2])
inter_y2 = np.min([ymax1, ymax2])

inter_area = (np.max([0, inter_x2 - inter_x1])) * (np.max([0, inter_y2 - inter_y1])) # 计算交集面积
iou = inter_area / (area1 + area2 - inter_area + 1e-6) # 计算交并比

return iou
0%