본문 바로가기

AI/Computer Vision

[Computer Vision] IoU(Intersection over Union)

728x90
반응형

IoU(Intersection over Union)는 주로 객체 탐지 및 세그멘테이션 평가에 사용되는 지표이다.

 

예측한 영역과 실제 영역 간의 겹치는 부분의 비율을 나타낸다.

  • x : 영역 중심의 x좌표
  • y : 영역 중심의 y좌표
  • w : 영역의 폭
  • h : 영역의 높이

 

  • Area of Intersection : 예측된 영역과 실제 영역의 겹치는 부분의 면적이다.
  • Area of Union : 예측된 영역과 실제 영역의 합집합 면적이다.

 

IoU 값은 0 ~ 1 사이의 값을 가지며, 1에 가까울 수록 예측이 정확하다는 것을 의미한다. 

일반적으로 IoU가 0.5 이상이면 긍정적인 예측으로 간주 된다.

import cv2
import numpy as np
def IoU(image:np.ndarray,mask:np.ndarray)->float:
    # 마스크를 이진형태로 변환
    _,bin_mask = cv2.threshold(mask,127,255,cv2.THRESH_BINARY)

    # Intersection과 Union
    intersection = np.logical_and(bin_mask,bin_mask).sum()
    union = np.logical_or(bin_mask,bin_mask).sum()
    # IoU
    iou = intersection / (union + 1e-6) # zero division을 방지하기 위해 작은 값 추가
    return iou

img = cv2.imread("cat.png")
h,w,_ = img.shape
img = cv2.resize(img,(int(w//2),int(h//2)),interpolation=cv2.INTER_LANCZOS4)
mask_im = cv2.imread("cat_mask.png")
mask_im = cv2.resize(mask_im,(int(w//2),int(h//2)),interpolation=cv2.INTER_LANCZOS4)
mask = cv2.cvtColor(mask_im,cv2.COLOR_BGR2GRAY)
mask[mask!=255] = 0
mask = ~mask


print(IoU(img,mask))

cv2.imshow("original",img)
cv2.imshow("mask_im",mask_im)
cv2.imshow("mask",mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

 

728x90
반응형