안경잡이개발자

728x90
반응형

  우리가 일반적으로 파워포인트(Powerpoint)를 이용해 PPT를 만들 때는 "글머리 기호"가 굉장히 많이 사용된다. 다만 줄바꿈을 했을 때 글머리 기호를 추가하지 않고, 단순히 들여쓰기만 맞추려고 한다면 Shift + Enter를 입력하면 된다. 실제로 "Shift + Enter"를 사용한 예시는 다음과 같다.

 

728x90
반응형

Comment +0

728x90
반응형

  일반적으로 시맨틱 분할(semantic segmentation) 분야는 한 장의 이미지 내에 있는 각 물체(object)를 의미 있는(semantic) 단위로 분할(segmentation)하는 작업을 의미한다. 분할(segmentation) 문제에서는 각 픽셀마다 하나의 클래스로 분류한다. 예를 들어 다음과 같이 자전거를 타는 선수들이 있는 한 장의 이미지가 주어지면, 어디에 사람(person), 자전거(bicycle), 배경(background)이 있는지 픽셀 단위로 클래스를 부여한다.

 

https://www.jeremyjordan.me/semantic-segmentation/

 

  다만, 자신이 만든 semantic segmentation 모델이 얼마나 정확한 예측 결과를 보였는지 확인하려면, 평가 지표(evaluation metric)가 필요하다. 이 분야에서의 대표적인 평가 지표로는 IoU, Dice score와 같은 것들이 있다. 이러한 지표들은 "두 집합이 얼마나 유사한지" 평가하기 위한 방법으로 이해할 수 있는데, 사실 segmentation 결과는 "픽셀들의 집합"으로 이해할 수 있다는 점을 기억하자. 그래서 예측 이미지와 정답 이미지가 얼마나 차이나는지 계산할 수 있다.

 

1. IoU score

 

  IoU (Intersection over Union) 점수는 흔히 자카드 인덱스(Jaccard index)라고도 한다. IoU는 말 그대로 "교집합 / 합집합"이다. 그냥 교집합과 합집합을 계산한 뒤에, 그 비율을 구하면 된다. 그러면 두 집합이 얼마나 겹치는지 알 수 있다. 아래 그림을 참고하면 이해가 쉬울 것이다.

 

https://en.wikipedia.org/wiki/Jaccard_index

 

  실제로 IoU 혹은 Jaccard index를 계산하기 위한 PyTorch 소스 코드 예시는 다음과 같다. PyTorch는 [Batch Size, Channel, Height, Width] 순서대로 데이터가 구성되기 때문에, 아래 코드는 한 장의 이미지가 있을 때 각 클래스별로 [높이(height), 너비(width)]에 대하여 IoU를 계산하는 것으로 이해하면 쉽다.

 

def iou_coef(y_true, y_pred, thr=0.5, dim=(2, 3), epsilon=0.001):
    y_true = y_true.to(torch.float32)
    y_pred = (y_pred > thr).to(torch.float32)
    inter = (y_true * y_pred).sum(dim=dim)
    union = (y_true + y_pred - y_true * y_pred).sum(dim=dim)
    iou = ((inter + epsilon) / (union + epsilon)).mean(dim=(1, 0))
    return iou

 

2. Dice score

 

  Dice score는 F1 score라고도 한다. 이것은 쉽게 말하면 "교집합 * 2 / 두 이미지의 총 픽셀 개수"로 이해할 수 있다. 구체적인 공식은 아래와 같다.

 

https://stats.stackexchange.com/questions/195006/is-the-dice-coefficient-the-same-as-accuracy

 

  이것을 그림으로 쉽게 표현한 것은 다음과 같다.

 

https://towardsdatascience.com/metrics-to-evaluate-your-semantic-segmentation-model-6bcb99639aa2

 

  더욱 구체적으로 Dice Score를 계산하기 위한 PyTorch 소스 코드 예시는 다음과 같다.

 

def dice_coef(y_true, y_pred, thr=0.5, dim=(2, 3), epsilon=0.001):
    y_true = y_true.to(torch.float32)
    y_pred = (y_pred > thr).to(torch.float32)
    inter = (y_true * y_pred).sum(dim=dim)
    den = y_true.sum(dim=dim) + y_pred.sum(dim=dim)
    dice = ((2 * inter + epsilon) / (den + epsilon)).mean(dim=(1, 0))
    return dice

 

3. Hausdorff Distance

 

  이 지표도 실제 semantic segmentation 문제에서 많이 사용되는 평가 지표다. 직관적으로 "한 집합의 어떤 점에서 다른 집합까지 도달하기 위한 거리의 최댓값"으로 이해할 수 있다. 구체적인 공식은 다음과 같은데, 그냥 단순하게 하한(infimum)을 최소(min)로, 상한(supremum)을 최대(max)로 이해하면 쉽다.

 

https://en.wikipedia.org/wiki/Hausdorff_distance

 

  아래 그림을 보면 더욱 이해가 쉽다. 아래 그림에서는 두 개의 "거리"가 계산되어 있는데, 두 개 중에서 더 큰 "거리" 값이 최종적인 Hausdorff 거리가 된다.

 

https://en.wikipedia.org/wiki/Hausdorff_distance

 

  Hausdorff distance아웃라이어(outlier)에 그 값이 결정되는 경향이 있다는 단점이 있다. 예를 들어 집합 X에서 딱 하나의 데이터(point)가 집합 Y로부터 굉장히 멀리 떨어져 있다면, 해당 단 하나의 데이터로 인해서 매우 높은 Hausdorff distance가 나올 수 있다.

728x90
반응형

Comment +0