본문 바로가기
About AI (인공지능)/Computer Vision

[Segmentation and Detection Score] IoU (Intersection over Union) vs Dice Coefficient

by 용스토리랜드 2023. 4. 21.

IoU (Intersection over Union)와 Dice Score는 두 가지 다른 이미지 분할 성능 지표입니다. 두 지표 모두 정답 영역과 예측 영역 간의 유사성을 측정하지만, 계산 방식에 약간의 차이가 있습니다.

IoU (Intersection over Union):
IoU는 교집합(Intersection)을 합집합(Union)으로 나눈 값으로 계산됩니다. 즉, 두 영역이 얼마나 겹치는지를 나타내는 지표입니다. IoU의 값은 0(전혀 겹치지 않음)부터 1(완전히 일치)까지의 범위를 가집니다.
IoU = (예측 영역과 정답 영역의 교집합) / (예측 영역과 정답 영역의 합집합)

https://www.waytoliah.com/1491


Dice Score (Dice Coefficient):
Dice Score는 2 * 교집합을 두 영역의 크기 합으로 나눈 값으로 계산됩니다. 이 지표는 불균형한 데이터셋에 대해 더 강인한 성능을 보이는 경향이 있습니다. Dice Score 역시 0(전혀 겹치지 않음)부터 1(완전히 일치)까지의 범위를 가집니다.
Dice Score = (2 * 예측 영역과 정답 영역의 교집합) / (예측 영역의 크기 + 정답 영역의 크기)

https://www.google.com/imgres?imgurl=https%3A%2F%2Fimg1.daumcdn.net%2Fthumb%2FR800x0%2F%3Fscode%3Dmtistory2%26fname%3Dhttps%253A%252F%252Fblog.kakaocdn.net%252Fdn%252Fdl4wT6%252FbtrExHIjSMg%252FtpwT1gPL0yFzAPZWNDk8WK%252Fimg.png&tbnid=GSBWC3l4rl6ZDM&vet=12ahUKEwi25t-Nsrr-AhUTDN4KHXZYDF4QMygBegUIARCyAQ..i&imgrefurl=https%3A%2F%2Fminimin2.tistory.com%2F179&docid=zey46eqNR9jZUM&w=800&h=688&q=dice%20score&ved=2ahUKEwi25t-Nsrr-AhUTDN4KHXZYDF4QMygBegUIARCyAQ



요약하면, IoU와 Dice Score는 두 영역 간의 유사성을 측정하는 지표이지만, 계산 방식에 차이가 있습니다. IoU는 교집합을 합집합으로 나눈 값이고, Dice Score는 2 * 교집합을 두 영역의 크기 합으로 나눈 값입니다.

 

# iou
# ioU : Intersection over Union
def iou_score(y_pred, y_true):
    y_pred = y_pred.view(-1)
    y_true = y_true.view(-1)

    y_pred = (y_pred == 1).float()
    y_true = (y_true == 1).float()

    intersection = (y_pred * y_true).sum()
    union = y_pred.sum() + y_true.sum() - intersection

    iou = (intersection + 1e-7) / (union + 1e-7)

    return iou.item()

# dice coefficient 
def dice_coef(pred, target, smooth = 1e-5):
    intersection = (pred * target).sum(axis=(1, 2))
    union = pred.sum(axis=(1, 2)) + target.sum(axis=(1, 2))
    # dice coefficient
    dice = ((2.0 * intersection) + smooth) / (union + smooth)
    return dice

def dice_loss(pred, target, smooth=1e-5):
    # dice loss
    dice = dice_coef(pred, target).mean()    
    dice_loss = 1.0 - dice
    return dice_loss
반응형