Search

[Segmentation metric] mIOU

mIOU 는 각 class별 IOU의 평균값입니다
ground truth라벨을 가지고 있는 매트릭스와, 예측으로 나온 라벨을 가지고 있는 매트릭스로 계산됩니다.

1. 각 클래스별(라벨별) 빈도수 세기

GT 라벨 매트릭스와 pred 라벨 매트릭스에서 각각 클래스별 빈도수를 구해봅니다
TIP : np.bincount 활용하면 쉽게 구현 가능 - integer형 1차원 array에 대해 bin 개수를 count해준다
gt = np.array([[0, 0, 0, 0],[2, 1, 1, 2],[2, 1, 1, 2],[1, 1, 0, 0]]) pred = np.array([[0, 0, 1, 0],[2, 1, 1, 1],[2, 2, 1, 2],[2, 1, 1, 2]]) gt_bin = np.bincount(np.reshape(gt, gt.shape[0]*gt.shape[1])) pred_bin = np.bincount(np.reshape(pred, pred.shape[0]*pred.shape[1])) print(gt_bin) print(pred_bin)
Python
복사
gt_1d = np.reshape(gt, gt.shape[0]*gt.shape[1]) pred_1d = np.reshape(pred, pred.shape[0]*pred.shape[1]) print(gt_1d, '\n', pred_1d)
Python
복사

2. (GT, Pred) 쌍으로 카테고리 나누기

이렇게 하면 (GT픽셀 , pred픽셀) 쌍이 될 수 있는 경우는 3x3=9가지 입니다
(0,0)
category 0
(0,1)
category 1
(0.2)
category 2
(1,0)
category 3
(1,1)
category 4
(1,2)
category 5
(2,0)
category 6
(2,1)
category 7
(2,2)
category 8
category = GT x 3 + pred
ex) 0x3+0=0, 1x3+1=4
cats = gt_1d * 3 + pred_1d print(cats)
Python
복사
카테고리별로 몇개인지 알아보면
cats_cnt = np.bincount(cats) print(cats_cnt)
Python
복사
이를 class 개수 x class 개수 크기의 정사각행렬로 변환하면
conf_mat = np.reshape(cats_cnt, (3,3)) print(conf_mat)
Python
복사
색칠한 대각성분은 GT == Pred 즉 예측을 잘 한 카테고리의 위치가 됩니다

3. IOU, mIOU계산

ex. 0 클래스의 IOU 계산

이렇게 각 클래스별 IOU를 구하면
sum_col = np.sum(conf_mat, 0) sum_row = np.sum(conf_mat, 1) iou_list = [] for i in range(3): iou_list += [conf_mat[i][i] / (sum_col[i]+sum_row[i]-conf_mat[i][i])] print(iou_list)
Python
복사
이 IOU들의 평균을 구하면
miou = sum(iou_list)/len(iou_list) print(miou)
Python
복사