객체의 영역(BBox)을 찾아내고 모델이 인식한 결과를 평가하려는 metric이 필요한데, L1, L2로 정의하면 BBox의 면적에 따라 값이 달라지는 문제가 발생합니다.
IoU는 면적에 영향을 받지 않도록 두 개 박스의 차이를 상대적으로 평가하기 위한 방법이며, 식은 합집합 분의 교집합이라 생각하면 됩니다.
전체 영역 중 겹치는 영역이 얼마나 되는지를 따져 평가합니다.
def iou(box1, box2):
"""Implement the intersection over union (IoU) between box1 and box2
Arguments:
box1 -- first box, list object with coordinates (x1, y1, x2, y2)
box2 -- second box, list object with coordinates (x1, y1, x2, y2)
"""
# Calculate the (y1, x1, y2, x2) coordinates of the intersection of box1 and box2. Calculate its Area.
xi1 = max(box1[1], box2[0])
yi1 = max(box1[1], box2[1])
xi2 = min(box1[2], box2[2])
yi2 = min(box1[1], box2[2])
inter_area =(yi2 - yi1) * (xi2 - xi1)
# calculate the Union area by using Formula: Union(A,B) = A + B - Inter(A,B)
box1_area = (box1[2] - box1[0]) * (box1[3] * box1[1])
box2_area = (box2[2] - box2[0]) * (box2[3] * box2[1])
union_area = box1_area + box2_area - inter_area
# compute the IoU
iou = inter_area / union_area
return iou