MATLAB code: 

toy_example_intersection_area.m


Object detection과 같은 과제를 수행할 때 algorithm의 성능을 평가하기 위해 IOU (intersection over union)이라는 지표를 사용한다.

일반적으로 2D image에서 사용되는 IOU는 다음과 같이 구한다.


붉은색 상자(A1): 실제 물체의 bounding box (ground truth) 

파란색 상자(A2): object detection 결과 bounding box

노란색 점선: overlapped area


A1 = [x1  y1  x2  y2] % [xmin, ymin, xmax, ymax]

A2 = [x1' y1' x2' y2']

S(A1) = area of red box = (x2-x1) * (y2-y1)

S(A2) = area of blue box = (x2'-x1') * (y2'-y1')

A_Inter = intersection area of two boxes = ( min(x2,x2') - max(x1,x1') ) * ( min(y2,y2') - max(y1,y1') ) 

A_Union = union area of two boxes = A1 + A2 - A_inter


IOU = (A_Inter) / (A_Union)


PASCAL VOC 기준으로 IOU > 0.5 인 경우에 detection이 성공했다고 할 수 있다.

% 사족으로 IOU > 0.5 라는 것은 두 박스의 크기가 동일하다고 할 때, intersection area가 2/3 이상이 겹쳐야 한다는 뜻으로, 꽤 엄격한 기준이다.



위 방법은 사각형의 rotation을 고려하지 않는다. 

좀 더 일반적인 경우로, 사각형의 rotation이 존재할 때 겹치는 영역의 면적을 구하는 방법을 알아보자.


ㅇㅇ            

(A) Two overlapping boxes                                                 (B) Intersecting Edge Points


            

(C)  Inside Box points                                                            (D) Intersection Polygon


(B) Intersecting Edge Points 구하기 (marker: o)

두 사각형의 변(edge)들의 intersecting point를 구한다.

[xi, zi] = polyxpoly(gt_x, gt_z, this_x, this_z);


(C) Inside Box Points 구하기 (marker: *)

in_gt   = inpolygon(gt_x(1:4),gt_z(1:4), this_x,this_z);

in_this = inpolygon(this_x(1:4),this_z(1:4), gt_x,gt_z);

xi = [xi; gt_x(in_gt)'; this_x(in_this)'];

zi = [zi; gt_z(in_gt)'; this_z(in_this)'];


(D) (B)~(C)에서 구한 points 의 convex hull을 구하고, 내부 area를 구한다. (intersection area: inside green lines)

cv = convhull(double(xi), double(zi));

xi = xi(cv);

zi = zi(cv);

xz_area = polyarea(xi, zi);



Posted by 헬벨

댓글을 달아 주세요

  1. Agile- 2015.05.15 11:42 신고  댓글주소  수정/삭제  댓글쓰기

    성실하군염 ㅋ 나도 블로그로 정리해야겠다.

  2. jj 2018.02.22 09:32  댓글주소  수정/삭제  댓글쓰기

    감사합니다.

    다만 한가지 버그가 있는데

    사각형이 겹치지 않을 상태에서 변이 일치 하게 되면 오류가 뜹니다.

  3. fdsafaf 2019.01.16 13:46  댓글주소  수정/삭제  댓글쓰기

    초보 인공지능 개발자입니다 정말 감사합니다