무효 클릭 IP 추적 중...
머신러닝,딥러닝/computer vision

Iou(intersection over Union) 개념 | 밑바닥 코딩

꼬예 2022. 8. 31.

 

 

이번 포스팅에서는 객체 탐지 모델객체를 얼마나 잘 탐지하였는지 측정하는 지표로 사용되는 것중 하나인 iou에 대해 알아보도록 하겠습니다.

 

1) IOU 개념

아래 개 그림에서 파란색 사각형Ground Truth(정답) 가리키는 바운딩박스이고,

 

개그림

 

 

노란색 우리 모델이 예측한 바운딩박스 입니다.

 

이를 단순하게 도식화 해보자면, 아래와 같이 표현할 수 있는데요.

 

 

Ground Truth예측의 겹친부분을 살구색으로 표현하였습니다. 

이 부분을 교집합 즉 intersection 부분이라고 부릅니다.

 

iou를 수식으로 표현 하면 아래와 같습니다.

 

 

iou수식

 

정답 바운딩 박스예측 바운딩 박스의 합집합(union)을 분모에 위치시키고, 교집합(intersection)을 분자로 계산합니다.

 

만약 예측 바운딩박스정답 바운딩박스의 모습이 아래와 같다면,

 

 

수식으로는 아래와 같이 표현할 수있을 것이고,

 

 

이전보다 iou의 값은커질 것입니다. 

 

왜냐하면 합집합인 분모의 값은 고정되어 있는데 겹치는부분(intersection)이 커짐으로, 결과적으로 iou가 상승하기 때문입니다.

 

만약 아래와 같이 겹치는 부분이 아예 없다면  분자의 값이 0이기 때문에 iou 값은 0으로 수렴합니다.

 

 

이를 통해 우리가 알 수 있는건 iou의 밤위가 0부터 1사이 라는것을 알 수 있습니다.

 

 

지금 까지 배운 개념을 토대로 iou값을 실제 어떻게 계산하는지 알아보겠습니다.

 

2) iou 실제 계산

실제로 iou를 구하기 위해선 예측 바운딩 박스의 크기와, 정답 바운딩박스의 크기, 마지막으로 intersection의 크기를 알야 합니다.

 

문제는 일반적으로 우리에게 주어진 것은 예측 바운딩박스의 좌표값, 정답 바운딩박스의 좌표값 뿐입니다.

 

즉, 좌표값의 조합을 통해서 intersection의 좌표를 찾고,  나아가 넓이를 구해야 합니다.

 

(1) intersection 좌표 구하기

 

먼저 아래와 같은 예측 바운딩박스정답 바운딩박스가 있다고 가정 해볼게요.

 

 

두 바운딩박스의 겹치는 부분, 즉 intersection좌상단점우하단점빨간원으로 표시했습니다.

이 두점을 어떻게 알 수 있을까요?

 

먼저 두 바운딩 박스의 좌상단 좌표끼리 비교를 통해 더 큰좌표를 찾아냅니다.

 

 

 x, y좌표 각각을 쌍으로 비교해줘야 하는데요. 이때 넘파이 maximum 함수를 쓰면 쉽게 구할 수 있습니다.

 

위와 같은 방법으로 intersection 좌상단점을 구했습니다.

 

이어서 이전과 같은 방식으로 두 바운딩박스의 우하단 좌표 끼리 비교를 합니다.

 

 

이전과 다른점이 있다면 이번에는 더 작은 값을 찾아내는건데요.

넘파이 minimum함수를 통해 쉽게 구할 수 있습니다.

 

이렇게 필요한 좌표를 다 알아 냈으니까, 이를 통해 각 구역의 넓이를 구해보겠습니다.

 

(2) 넓이 구하기 

 

 

각 구역의 좌상단, 우하단 좌표를 통해 넓이를 구하고, 이를 통해 iou값을 계산할 준비를 완료하였습니다.

 

3) 밑바닥 부터 작성

일반적으로 detection 모델이 예측한 바운딩 박스들은 아래와 같이 많은 바운딩박스를 만들어 냅니다.

 

 

일단 마구잡이로 예측하고, 아닌 것들은 하나씩 쳐내는 느낌인거죠.

 

일단 cand_boxes라는 변수에 위에서 예측한 바운딩박스의 좌표값들을 저장해놓았습니다.

 

 

그리고 정답 바운딩박스 좌표 하나를 gt_box라는 변수에 담았습니다.

 

 

참고로 바운딩 박스는 리스트형태로 [좌상단x좌표, 좌상단y좌표, 우하단x좌표, 우하단y좌표] 형태로 구성되어 있습니다.

 

이제 cand_boxes변수에 들어있는 예측 바운딩박스들의 iou를 구해볼텐데요.

 

그 전에 iou를 계산하는 함수를 따로 만들어 보겠습니다.

 

 

우리가 앞서 그림으로 학습한 내용을 그대로 코드로 구현한 것입니다.

앞에서 설명했으니 자세한 설명은 생략하도록 하겠습니다.

 

for loop를 통해 각 예측 바운딩 박스들을 하나씩 뽑아내어, 바운딩 박스의 iou를 구하고, 그 값들을 리스트에 담았습니다.

 

 

리스트를 iou값 기준으로 내림차순 정렬합니다.

 

output:

 

여기서 iou가 가장 높은 것은 4번 인덱스의 값입니다.

 

 

이 인덱스값을 앞서 정의 cand_boxes에 넣어 해당 인덱스의 좌표를 추출합니다.

 

 

해당 좌표를 기준으로 사각형을 그려보면 아래와 같습니다.

 

 

이번에는 반대로 iou값이 제일 낮은 인덱스 13의 좌표를 추출해보겠습니다.

 

 

그리고 해당 좌표를 기준으로 그림을 그려보면 전혀 엉뚱한 곳에 바운딩박스가 위치한것을 확인할 수 있습니다.

 

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글