ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Semantic Segmentation] Mean Intersection over Union(MIoU)
    Deep-Learning/[Vision] 이론 2020. 3. 9. 16:50
    출처 : http://ronny.rest/tutorials/module/localization_001/iou/

     

    MIoU - Mean Intersection over Union

    세그멘테이션 분야에서 가장 흔하게 쓰이는 평가지표인 MIoU에 대해 설명하겠다.

     

    0. MIoU 정의

    Segmentation과 Object detection에서 가장 빈번하게 사용되는 성능척도인 MIoU(Mean Intersection over union)는 IoU 값에 대한 평균값이다.

     

    1. IoU - Intersection over Union

    IoU에 대한 정의는 아래와 같다.

    IoU = 교집합 영역 넓이 / 합집합 영역 넓이

     

     쉽게 이야기하면, "Segmentation된 한 장의 이미지에 대해 성능을 평가하고 싶다."라고 한다면 IoU 값을 계산하면 되고 "여러 장의 이미지에 대해 성능을 평가하고 싶다."라고 한다면 한 장마다의 IoU값을 평균내어 사용하면 되는 것이다.

     

    두 개의 box 크기가 동일할 경우, 2/3 정도는 겹쳐줘야 0.5의 값이 나오기 때문에 여러 곳에서 IoU의 threshold 값으로 0.5를 잡아서 사용하는 편인데 대게 AP50, AP75로 부르며 IoU의 threshold값이 0.5일 때와 0.75일 때의 Average Precision 값을 구하여 그 값을 평가 할 때 사용한다.

     

    2. Overlapping Region(교집합 영역의 넓이)

    교집합 영역의 넓이는 두 점 사이의 거리에 대해 안다는 가정 하에 아래를 참고하여 쉽게 구할 수 있다.

    교집합 영역 구하는 공식

    3. Combined Region(합집합 영역의 넓이)

     합집합 영역의 넓이는 두 개의 box 넓이를 더한 후, 교집합 영역을 빼주면 된다.(집합 공식을 잘 떠올려보자)

    합집합 영역 구하는 공식

     

    4. Sample Code

    4-1. Simple Ver.

     두 box에 대해 IoU 값을 계산할 수 있는 간단한 코드이다.(Python Ver.)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    def get_iou(a, b, epsilon=1e-5):
        """ Given two boxes `a` and `b` defined as a list of four numbers:
                [x1,y1,x2,y2]
            where:
                x1,y1 represent the upper left corner
                x2,y2 represent the lower right corner
            It returns the Intersect of Union score for these two boxes.
     
        Args:
            a:          (list of 4 numbers) [x1,y1,x2,y2]
            b:          (list of 4 numbers) [x1,y1,x2,y2]
            epsilon:    (float) Small value to prevent division by zero
     
        Returns:
            (float) The Intersect of Union score.
        """
        # COORDINATES OF THE INTERSECTION BOX
        x1 = max(a[0], b[0])
        y1 = max(a[1], b[1])
        x2 = min(a[2], b[2])
        y2 = min(a[3], b[3])
     
        # AREA OF OVERLAP - Area where the boxes intersect
        width = (x2 - x1)
        height = (y2 - y1)
        # handle case where there is NO overlap
        if (width<0or (height <0):
            return 0.0
        area_overlap = width * height
     
        # COMBINED AREA
        area_a = (a[2- a[0]) * (a[3- a[1])
        area_b = (b[2- b[0]) * (b[3- b[1])
        area_combined = area_a + area_b - area_overlap
     
        # RATIO OF AREA OF OVERLAP OVER COMBINED AREA
        iou = area_overlap / (area_combined+epsilon)
        return iou
    http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
     

     

    4-2. Batch Version

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    def batch_iou(a, b, epsilon=1e-5):
        """ Given two arrays `a` and `b` where each row contains a bounding
            box defined as a list of four numbers:
                [x1,y1,x2,y2]
            where:
                x1,y1 represent the upper left corner
                x2,y2 represent the lower right corner
            It returns the Intersect of Union scores for each corresponding
            pair of boxes.
     
        Args:
            a:          (numpy array) each row containing [x1,y1,x2,y2] coordinates
            b:          (numpy array) each row containing [x1,y1,x2,y2] coordinates
            epsilon:    (float) Small value to prevent division by zero
     
        Returns:
            (numpy array) The Intersect of Union scores for each pair of bounding
            boxes.
        """
        # COORDINATES OF THE INTERSECTION BOXES
        x1 = np.array([a[:, 0], b[:, 0]]).max(axis=0)
        y1 = np.array([a[:, 1], b[:, 1]]).max(axis=0)
        x2 = np.array([a[:, 2], b[:, 2]]).min(axis=0)
        y2 = np.array([a[:, 3], b[:, 3]]).min(axis=0)
     
        # AREAS OF OVERLAP - Area where the boxes intersect
        width = (x2 - x1)
        height = (y2 - y1)
     
        # handle case where there is NO overlap
        width[width < 0= 0
        height[height < 0= 0
     
        area_overlap = width * height
     
        # COMBINED AREAS
        area_a = (a[:, 2- a[:, 0]) * (a[:, 3- a[:, 1])
        area_b = (b[:, 2- b[:, 0]) * (b[:, 3- b[:, 1])
        area_combined = area_a + area_b - area_overlap
     
        # RATIO OF AREA OF OVERLAP OVER COMBINED AREA
        iou = area_overlap / (area_combined + epsilon)
        return iou
    http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
     

     

    5. Sample IoU Scores

     아래의 그림은 IoU 값의 sample이다.

     

     모델의 성능을 높여보고자 IoU threshold 값을 올려서 모델링을 해도 되기는 하는데, 모델 성능이라는 게 feature extractor, classifier, regressor, IoU, NMS 등등의 것들과 복합적으로 얽혀있는터라  threshold 값을 올려준다해서 무조건 성능이 올라가는 현상을 기대해서는 안된다.

    댓글

by KUKLIFE