[머신러닝] image segmentation metrics

Updated:

Image segmentation(이미지 분할)에서 자주 쓰이는 성능 평가 지표(metrics)들을 알아보자.

Precision/Recall/F1-score

Precision, Recall, F1-score는 classification(분류) task 뿐만 아니라 segmentation task에서도 성능을 평가할 때 자주 쓰이는 애들이다.

편의를 위해 각각의 지표를 정의할 때 축약어를 사용하겠다.

  예측 실제
TP(True positive) + +
FP(False positive) + -
TN(True negative) - +
FN(False negative) - -

TP: 모델이 positive라고 예측한 값들 중에서 실제로도 positive인 값.
FP: 모델이 positive라고 예측한 값들 중에서 실제로는 negative인 값.
TN: 모델이 negative라고 예측한 값들 중에서 실제로는 positive인 값.
FN: 모델이 negative라고 예측한 값들 중에서 실제로도 negative인 값.

Precision (정밀도) = PPV (Positive Predictive Value)

모델이 positive라고 답한 데이터 중에서 정답이 positive인 것들의 비율로, 0 ~ 1 사이 값을 가지며 1에 가까울수록 좋다.

$ Precision = \frac{TP}{TP + FP} $

Precision을 높이려면 FP를 낮춰야 한다.

Recall (재현율) = Sensitivity (민감도) = TPR (True Positive Rate)

정답이 positive인 데이터 중에서 모델이 positive라고 예측한 것들의 비율로, 0 ~ 1 사이 값을 가지며 1에 가까울수록 좋다.

$ Recall = \frac{TP}{TP + FN} $

Recall을 높이려면 FN을 낮춰야 한다.

F1-score

일반적으로는 precision과 recall을 combine한 형태인 F1-score를 많이 쓴다.
F1-score는 precision과 recall의 조화 평균이고, 0 ~ 1 사이 값을 가지며 1에 가까울수록 좋다.

$ F1-score = \frac{2 * Precision * Recall}{Precision + Recall} $

Specificity (특이도) = TNR (True Negative Rate)

정답이 negative인 데이터 중에서 모델이 negative라고 예측한 것들의 비율로, 0 ~ 1 사이 값을 가지며 1에 가까울수록 좋다.

$ Specificity = \frac{TN}{TN + FP} $

Dice Similarity Coefficient (DSC), Dice Coefficient, Dice Score

DSC는 의료 영상 segmentation에서 성능 평가 지표로 흔히 쓰인다.
예측된 map(Pred)과 정답 map(GT; ground-truth) 간 겹친 영역의 크기의 2배를, 두 map의 총 픽셀(pixel) 수로 나눈 값으로 정의할 수 있다.

$ DSC = \frac{2 \sum^N Pred GT}{\sum^N Pred^2 + \sum^N GT^2} $ (1)

DSC는 실제 값(GT)와 예측 값(Pred)이 얼마나 겹치는지 평가하는 IoU(intersection over union)와도 유사하다.

$ IoU = \frac{2 \vert{Pred \cap GT}\vert }{\vert{Pred}\vert + \vert{GT}\vert} $

또한 DSC가 boolean data에 적용될 경우에는 분할을 수행할 영역(mask)을 positive class로 뒀을 때의 F1-score 식과 DSC 식이 본질적으로 같다.

$ DSC = \frac{2TP}{2TP + FP + FN} $ (2)

Pixel Accuracy

Pixel Accuracy는 픽셀에 따른 정확도이다. pixel별로 정답 class를 맞췄는지의 여부(True/False)를 통해 계산한다.

$ Pixel Accuracy = \frac{TP + TN}{TP + TN + FP + FN} $

3D image segmentation metrics Pytorch 코드

from torch import nn


class SegMetrics(nn.Module):
    def forward(self, inputs, targets, eps=0.0001):
        tp = (inputs * targets).sum(dim=4, keepdim=True).sum(dim=3, keepdim=True).sum(dim=2, keepdim=True)
        fp = (inputs * (1 - targets)).sum(dim=4, keepdim=True).sum(dim=3, keepdim=True).sum(dim=2, keepdim=True)
        fn = ((1 - inputs) * targets).sum(dim=4, keepdim=True).sum(dim=3, keepdim=True).sum(dim=2, keepdim=True)
        tn = ((1 - inputs) * (1 - targets)).sum(dim=4, keepdim=True).sum(dim=3, keepdim=True).sum(dim=2, keepdim=True)

        den1 = inputs.pow(index).sum(dim=4, keepdim=True).sum(dim=3, keepdim=True).sum(dim=2, keepdim=True)
        den2 = targets.pow(index).sum(dim=4, keepdim=True).sum(dim=3, keepdim=True).sum(dim=2, keepdim=True)

        pixel_acc = (tp + tn) / (tp + tn + fp + fn + eps)
        dice = (2 * tp / (den1 + den2 + eps))  # (1)
        dice = (2 * tp) / (2 * tp + fp + fn + eps)  # (2)
        precision = tp / (tp + fp + eps)
        recall = tp / (tp + fn + eps)
        specificity = tn / (tn + fp + eps)

        return pixel_acc.mean(), dice.mean(), precision.mean(), recall.mean(), specificity.mean()

참고. Dice Loss

3D medical image segmentation task를 수행할 때 DSC를 1에서 뺀 값($ Dice Loss = 1 - DSC $)인 Dice Loss를 사용하여 모델을 최적화 할 수 있다.


참고. [1] Minaee, S., Boykov, Y., Porikli, F., Plaza, A., Kehtarnavaz, N., & Terzopoulos, D. (2021). Image segmentation using deep learning: A survey. IEEE transactions on pattern analysis and machine intelligence, 44(7), 3523-3542.
[2] 분류 모델 성능 평가 지표(Accuracy, Precision, Recall, F1 score 등)
[3] 딥러닝 Segmentation(6) - segmentation 평가(Pixel Accuracy, Mean IOU)
[4] Milletari, F., Navab, N., & Ahmadi, S. A. (2016, October). V-net: Fully convolutional neural networks for volumetric medical image segmentation. In 2016 fourth international conference on 3D vision (3DV) (pp. 565-571). Ieee.

Leave a comment