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
복사