Deep Learning

Multi class Segmentation Loss function 정리

Kimhj 2024. 1. 15. 15:56
  • Segmentation 에 적용할 수 있는 Loss function은 아래와 같다. 
    • BCE Loss
      • 이진분류에 사용되는 Loss
    • Focal Loss
      • 불균형한 클래스 분포를 가진 데이터셋에서 Classification 할 때 주로 사용
      • 희소한 class에 대해 더 집중되는 효과가 있음.
      ALPHA = 0.8
      GAMMA = 2
      
      def FocalLoss(targets, inputs, alpha=ALPHA, gamma=GAMMA):
        inputs = K.flatten(inputs)
        targets = K.flatten(targets)
        
        BCE = K.binary_crossentropy(targets, inputs)
        BCE_EXP = K.exp(-BCE)  
        focal_loss = K.mean(alpha * K.pow((1-BCE_EXP), gamma) * BCE)
        
        return focal_loss
      
      
    • DICE Loss
      • IoU(Intersection over Union)을 기반으로 하는 Loss function. 예측된 결과와 실제 레이블간의 겹치는 부분을 계산해서 산출함.
      • 라벨링된 영역과 예측된 영역이 정확히 같으면 1, 그렇지 않으면 0을 반환함.
      # Keras
      def DiceLoss(targets, inputs, smooth=1e-6):
        # flatten label and prediction tensors
        inputs = K.flatten(inputs)
        targets = K.flatten(targets)
        
        intersection = K.sum(K.dot(targets, inputs))
        dice = (2*intersection + smooth) / (K.sum(targets) + K.sum(inputs) + smooth)
        
        return 1 - dice
      
      
    • BCE with DICE Loss
      • BCE Loss와 DICE Loss를 결합한 함수로, 주로 불균형한 클래스 분포에 대한 robust한 학습이 이루어짐.
      def DiceBCELoss(targets, inputs, smooth=1e-6):
        # flatten label and prediction tensors
        inputs = K.flatten(inputs)
        targets = K.flatten(targets)
      
        BCE = binary_crossentropy(targets, inputs)
        intersection = K.sum(K.dot(targets, inputs))
        dice_loss = 1 - (2*intersection + smooth) / (K.sum(targets) + K.sum(inputs) + smooth)
        Dice_BCE = BCE + dice_loss
        
        return Dice_BCE
      
      • Ground Truth와 Prediction 간의 IoU 예시Jaccard(IoU) Loss
        • IoU를 측정하는 방법으로, IoU는 예측된 영역과 실제 영역의 교차영역을 전체 영역으로 나눈 비율임.
      • Tversky Loss
        • DICE Loss의 일반화된 버전으로, 정확도와 재현율간의 균형을 맞추는 역할을 함.
        • 파라미터인 alpha값과 beta 값을 통해 가중치 규제가 이루어지고, False Positive와 False Negative에 더 큰 가중치를 줌. Alpha와 Beta값은 구현하고자 하는 바에 따라 최적의 값을 찾아야함.
        ALPHA = 0.5
        BETA = 0.5
        
        def TverskyLoss(targets, inputs, alpha=ALPHA, beta=BETA, smooth=1e-6):
          # flatten label and prediction tensors
          inputs = K.flatten(inputs)
          targets = K.flatten(targets)
          
          # True Positives, False Positives & False Negatives
          TP = K.sum((inputs * targets))
          FP = K.sum(((1-targets) * inputs))
          FN = K.sum((targets * (1-inputs)))
        
          Tversky = (TP + smooth) / (TP + alpha*FP + beta*FN + smooth)
          
          return 1 - Tversky
        

IoU : Ground Truth와 Prediction 결과 예시