-
[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에 대한 정의는 아래와 같다.
쉽게 이야기하면, "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.)
1234567891011121314151617181920212223242526272829303132333435363738def 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 cornerx2,y2 represent the lower right cornerIt 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 zeroReturns:(float) The Intersect of Union score."""# COORDINATES OF THE INTERSECTION BOXx1 = 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 intersectwidth = (x2 - x1)height = (y2 - y1)# handle case where there is NO overlapif (width<0) or (height <0):return 0.0area_overlap = width * height# COMBINED AREAarea_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 AREAiou = area_overlap / (area_combined+epsilon)return iouhttp://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter4-2. Batch Version
12345678910111213141516171819202122232425262728293031323334353637383940414243def batch_iou(a, b, epsilon=1e-5):""" Given two arrays `a` and `b` where each row contains a boundingbox defined as a list of four numbers:[x1,y1,x2,y2]where:x1,y1 represent the upper left cornerx2,y2 represent the lower right cornerIt returns the Intersect of Union scores for each correspondingpair of boxes.Args:a: (numpy array) each row containing [x1,y1,x2,y2] coordinatesb: (numpy array) each row containing [x1,y1,x2,y2] coordinatesepsilon: (float) Small value to prevent division by zeroReturns:(numpy array) The Intersect of Union scores for each pair of boundingboxes."""# COORDINATES OF THE INTERSECTION BOXESx1 = 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 intersectwidth = (x2 - x1)height = (y2 - y1)# handle case where there is NO overlapwidth[width < 0] = 0height[height < 0] = 0area_overlap = width * height# COMBINED AREASarea_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 AREAiou = area_overlap / (area_combined + epsilon)return iouhttp://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter5. Sample IoU Scores
아래의 그림은 IoU 값의 sample이다.
모델의 성능을 높여보고자 IoU threshold 값을 올려서 모델링을 해도 되기는 하는데, 모델 성능이라는 게 feature extractor, classifier, regressor, IoU, NMS 등등의 것들과 복합적으로 얽혀있는터라 threshold 값을 올려준다해서 무조건 성능이 올라가는 현상을 기대해서는 안된다.
'Deep-Learning > [Vision] 이론' 카테고리의 다른 글
[Semantic Segmentation] Semantic Segmentation 목적 (0) 2020.01.29 CNN(Convolution Neural Network) 구조 (0) 2020.01.29