9/20/2019

IOU (Intersection over Union)

1. IOU 관련사항 


  • IOU (Intersection over Union)

아래와 같이 두개의 Box가 겹칠 경우 Intersection의 부분의 비율을 알아보는 것이다.




출처
  https://medium.com/@ageitgey/snagging-parking-spaces-with-mask-r-cnn-and-python-955f2231c400


NVIDIA-DeepStream 
  https://ahyuo79.blogspot.com/search/label/NVIDIA-DeepStream


1.1 IOU 계산 방법 

  • IOU 계산방법 
  https://inspace4u.github.io/dllab/lecture/2017/09/28/IoU.html

상위 방법은 Python으로 사용하면 쉽게 구할 수 있을 것 같은데, 소스의 동작원리를 정확하게 모르겠다.
일반적인 좌표를 사용하게 되면 어떻게 구현이 될까라는 것도 궁금하다

  • 좌표로만 IOU 직접 계산방법
좌표구조로 구성되고 BBOX가 사각형이라고 하면 아래와 같이 구성이 될 것 같다.
Left(X), Top(Y) , Width, Height

이때 사각형의 대각선 좌표값으로,  X, Y 좌표와   (X+Width) , ( Y+Height) 좌표 두개로 쉽게 IOU를 감지하고 이를 계산가능

ex) A-BBOX의 좌표   X(3) , Y (3) , widht (3)  ,height(4) 이라고 하면 아래 두 좌표로 4각형을 인지가능

  1. A-BBOX의  A-MIN 좌표  (3,3)
  2. A-BBOX의  A-MAX 좌표 (6,7) 

  • B-BBOX 의 B-MIN 좌표  X >=3  &&  Y>=3 일 때  
    1. B-MIN 좌표의 X, Y가 아래 두 조건 충족시 IOU 계산 
      1. 3 <  X <  6  (3+width)
      2. 3  < Y  < 7  (3+height)
    2. InterSection Size  =  A-MAX - B-MIN   (각각의 크기나옴)

  • B-BBOX의 B-MIN 좌표   X < 3  || Y  < 3 일 때   
    1. B-MAX 좌표의 X, Y가 아래 두 조건 충족시 IOU 계산
      1. 3 <  X <  6  (3+width)
      2. 3  < Y  < 7  (3+height)
    2. InterSection Size =  B-MAX - A-MIN   (각각의 크기나옴)

상위와 같이 InterSection Size만 알면, 모든 계산이 쉬어진다.
현재 상위 조건은 모눈종이에 직접 그려서 생각해본 것 이며, 오류가 아직 존재할 수 있다.
추후 소스로 작성된 소스 검증을 해봐야겠다.


  • 모눈종이 PDF 문서

머리가 나뻐서 자꾸, 모눈 종이가 필요해서 아래 링크
  http://blog.daum.net/miparang/7058252


  • IOU 관련소스 자료모음 
  https://stackoverflow.com/questions/4549544/total-area-of-intersecting-rectangles/32244956
  https://bskyvision.com/465

아래의 소스는 상위 소스에서 간단히 IOU를 만드는 소스를 만들어 보았는데, 아직 검증을 제대로 해보지를 못했다.


static int max(int v1 , int v2)
{
 if(v1 > v2) return v1;
 else return v2;
}

static int min(int v1 , int v2)
{
 if(v1 > v2) return v2;
 else return v1;
}

static int interSection(int Ax1, int Ay1, int Ax2, int Ay2, int Bx1, int By1, int Bx2, int By2)
{
    int left   = max(Ax1, Bx1);
    int top    = max(Ay1, By1);
    int right  = min(Ax2, Bx2);
    int bottom = min(Ay2, By2);
    int interArea = 0;

    if (left < right && bottom > top)
     interArea = ((right - left) + 1) * ((bottom - top)+1);

   return interArea;
}



1.2  IOU 사용용도 

IOU 사용용도는 다양한  것 같으며, 일단, 아래의 사이트 에서 처럼  실제 BBOX와 예측된 BBOX의 차이를 알아서 교정을 위해서 도 사용이 되어진다.

  1. Ground-Truth bouning Box:  실제 모델의 Box, 손으로 직접 Label
  2. Predicted bouning Box:  Deep Learning을 통해 예측된 BBOX 

IOU 관련내용
  https://www.pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/

또한 동일한 Object를 여러개의 Object로 인식을 할 경우, 이때  IOU값에 따라 나머지를 없애는 데에도 사용되어 지는 것 같다.

더불어 Tracking 알고리즘에서도 역시 IOU는 사용이 되어지는데, Object Detection이 되고 이전 Frame 과 이후 Frame IOU값을 가지고 지속적으로
Tracking 하기위해서도 사용되어지는 것 같다.

이외에도 개인적으로 생각을 해보면, ROI(Region of Interest) BBOX 와 Object Detection 된 BBOX의 IOU를 이용도 가능 할 것 같다.
이는 각각의 ROI의 영역이 서로 겹칠 경우,  상위 Smart Parking System일 경우 이용 가능할 것 같다.

간단하지만, 생각해보면 아주 다양하게 이용이 되어지기 때문에  꼭 필요하다

댓글 없음 :