[Object Detection]

1. IoU(Intersection over Union)란 무엇입니까?

오늘은 IoU에 대해 알아보겠습니다.

IoU는 Intersection over Union의 약어이며 객체 감지 영역에서 모델이 객체를 얼마나 잘 인식하는지를 나타내는 지표입니다.
지표는 0과 1 사이의 값을 가지며, 모델의 예측값이 실제 물체 영역과 얼마나 겹치는지 척도로 모델의 성능이 좋은지 나쁜지를 평가합니다.

아래 그림을 참조하십시오. 녹색 상자는 실제 값이고 파란색 상자는 모델의 예측 값입니다.


IoU 예

모델은 약 2/3의 시간 동안 고양이 범위를 성공적으로 예측했으며 이는 그리 나쁘지 않습니다.

개체 감지의 궁극적인 목표는 모델이 파란색 및 녹색 상자와 완벽하게 겹칠 때까지 예측을 개선하는 것입니다.
즉, 두 박스의 IoU가 1이 될 때까지입니다.

IoU를 이해하려면 먼저 두 가지 개념을 이해해야 합니다.

  • Ground Truth 경계 나무 상자: 테스트 세트에서 개체 위치의 레이블 값(일반적으로 사람이 레이블 지정)
  • 예측된 경계 상자: 물체의 위치에 대한 모델 예측 값

물체 감지기가 물체를 얼마나 정확하게 예측했는지 IoU를 계산해 봅시다.


시각화된 IoU 계산

중첩 영역 ground truth bounding box와 예측된 bounding box의 중첩 면적이다.

연합의 영역 ground truth 경계 상자와 예측 경계 상자의 총 면적입니다.

계산을 위해 Box1은 (x1, y1, x2, y2)로, Box2는 (x3, y3, x4, y4)로 표현됩니다.

이해하기 쉽도록 Y축의 위치를 ​​아래 방향이 양수, 위 방향이 음수로 변경되었습니다.


세 가지 항목을 계산해야 합니다.

1. 중첩 영역

두 상자의 겹치는 영역을 찾는 방법 (왼쪽 위 모서리, 오른쪽 아래 모서리, 높이, 너비) 저장해야


교차점의 왼쪽 위 모서리를 계산합니다.


교차점의 오른쪽 하단 모서리를 계산합니다.


절단 면적 계산

2. 연합 영토

두 상자의 총 면적은 다음 공식을 사용하여 쉽게 찾을 수 있습니다.


직사각형 면적 공식: 길이 x 너비

각 박스의 넓이는 계산이 되어 있는데 그냥 합산하면 겹치는 넓이도 계산에 포함되기 때문에 겹치는 넓이는 빼줍니다.


3.IoU

마지막으로 이 기사의 시작 부분에서 본 공식을 사용하여 계산하면 최종 IoU 값을 얻게 됩니다.


2. IoU 구현

def compute_iot(predicted_box, gt_box):
    """
    predicted_box list : (x1, y1, x2, y2)
    gt_box list : (x3, y3, x4, y4)
    """

    # top-left corner of the intersection
    x1 = max(predicted_box(0), gt_box(0))
    y1 = max(predicted_box(1), gt_box(1))
    
    # bottom-right corner of the intersection
    x2 = min(predicted_box(2), gt_box(2))
    y2 = min(predicted_box(3), gt_box(3))
    
    width_intersection = abs(x2 - x1)
    height_intersection = abs(y2 - y1)
    area_intersection = width_intersection * height_intersection
    
    # area = width * height
    predicted_box_area = abs(predicted_box(2) - predicted_box(0)) * abs(predicted_box(3) - predicted_box(1))
    gt_box_area = abs(gt_box(2) - gt_box(0)) * abs(gt_box(3) - gt_box(1))
    area_union = predicted_box_area + gt_box_area - area_intersection

    iou = area_intersection / area_union

    return iou