mIOU 는 각 class별 IOU의 평균값입니다

ground truth라벨을 가지고 있는 매트릭스와, 예측으로 나온 라벨을 가지고 있는 매트릭스로 계산됩니다.

00432A12-6C6E-400C-A092-52CF237727DF.jpeg

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)

Untitled

D00A306D-EE28-4E21-8F6C-8C8D74D07CB7.jpeg

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)

407BDD95-3C71-4C9A-949C-375D2B866CF7.jpeg

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)

Untitled

카테고리별로 몇개인지 알아보면

cats_cnt = np.bincount(cats)
print(cats_cnt)

Untitled