본문 바로가기

DeepLearning Specialization(Andrew Ng)/Convolutional Neural Networks

[Week 3] 1. Detection Algorithm

728x90
Detection Algorithm
1. Object Localization
2. Landmark Detection
3. Object Detection
4. Convolutional Implementation of Sliding windows
5. Bounding Box Predictions
6. Intersection over Union
7. Non-max suppression
8. Anchor Boxes
9. YOLO Algorithm
10. Region Proposals

1. Object Localization

1) What are localization and detection?

- Image classification : 해당 사진의 물체가 무엇을 나타내는가?

- Classification with localization : 해당 사진의 물체가 무엇이며 그 위치는 무엇인가?

- Detection : 위의 2개와는 다르게 물체가 무엇인지는 상관없고, 물체들의 위치가 어디인가?

 

=> 첫번째와 두번째는 하나의 물체가 존재하는지, 존재한다면 무엇인지 파악하는 것이고 세번째는 종류에 상관없이 여러 물체의 위치를 파악하는 것.

 

cf) 정의에서 알 수 있듯이 첫번째는 두번째를 이해하는데 유용하고, 두번째는 세번째를 이해하는데 유용하다.

 

2) Classification with localization

 Classification with localization 은 위치도 파악해야하므로 기존 softmax에 더해서 위치 unit을 추가해야한다. 즉, label y 를 재정의할 필요가 있는데, 다음과 같다.

- y label :

 Pc 는 물체가 존재하는 지 여부를 나타냄(물체의 존재가능성). Pc가 0 이면 뒤에 무슨 숫자가 오든 상관이 없음. 신경쓸 필요가 없기 때문.

 bx와 by는 물체 bound box의 정중앙 좌표

 bh는 bound box의 높이, bw는 bound box의 폭

 c1~c3 는 class label(보행자, 차, 오토바이)

 

- Loss 함수:

 위와 같이 모든 요소를 오차제곱으로 더해준 것을 loss 함수로 활용할 수 있다. y1=0일 경우, 다른 요소는 볼 필요없고, y1을 0으로 잘 예측했나만 보면 된다. y1=1 일 경우, 모든 요소를 다 해야겠쥐

 물론 이와같이 Loss를 정의하면 조금 갸우뚱할 것이다. 0과 1로 정의되는 class label과 위치값으로 나오는 요소들을 모두 같은 선상에 놓고 오차제곱을 하여 더하니 꺼침칙하다. 

 그래서 Pc는 logistic Loss, c1~c3는 softmax loss, b는 MSE(mean squared error)로 하여 Loss를 구하기도 한다. 그런데 교수님 왈 그냥 다 오차제곱으로 때려넣어도 잘 나온데.


2. Landmark Detection

- 앞서 우리는 boundbox에 대해서 알아보았는데, 좀 더 일반적으로 신경망의 주요지점을 x,y좌표로 아웃풋하게 하는 걸 랜드마크라 한다.  

- 눈의 코너 부분을 랜드마크로 할 수도 있고, 좀 더 디테일하게 랜드마크를 많이 지정할 수 있다.
만약 표정을 인식하고 싶다고 했을 때, 눈의 여러부분, 입, 코 등의 여러 포인트를 랜드마크로 지정할 수 있고, 포즈를 인식하고 싶으면 가슴, 어깨, 팔꿈치 등을 랜드마크로 지정할 수 있다. 


- 중요한건 다른 이미지를 통틀어서 랜드마크의 위치는 일관적이어야 함.
즉, 랜드마크 1인 항상 왼쪽 눈의 왼쪽 귀퉁이로 지정하는 것 등이 해당됨.   



 3. Object Detection

 

우선 car classification 모델을 Conv를 이용해 따로 만든다. 이 때 y=1 즉, 자동차가 있는 사진은 자동차만 들어가게끔 바싹 잘라서 training set으로 만들어준다(sliding window 방법에서 추출한 사진 또한 그와 비슷한 input이 될 것이기 때문에 이렇게 하는 듯).

 

2) Sliding window detection

 그 다음 작은 window 를 만들어 사진을 sliding 한다. 해당 window 에 들어온 부분을 만들어놓은 conv network에 input하여 사진의 모든 부분에서 차를 포함하는 window가 어디있는지 파악한다.

 그리고 조금 더 큰 window로 같은 작업을 수행한다. 

 

 이 방법은 딱봐도 계산비용이 겁나 높다. sliding하면서 생기는 수많은 부분을 input해야하고, window의 크기도 다양하게 사용하기 때문이다. 그렇다고 stride(window가 sliding 할때 간격)이 크면, 물체를 잘 detection하기 힘들다. 


4. Convolutional Implementation of Sliding Windows

1) FC to Conv layers

위와 같이 filter를 적용하면 fc를 conv 형태로 바꿀 수 있다. 

 

2) Convolution implementation

 fc를 conv로 바꾸는 기법을 이용하여 window에 해당하는 부분만 각각 하는 것이 아니라 전체 사진을 바로 적용시켜버린다. 이렇게 하면 마지막 output 은 해당 sliding window들의 결과물을 모아놓은 형태가 된다. 

 왜 이렇게 될까? 이게 가능한 이유는 conv 연산이 이미 sliding 방식으로 이루어지기 때문이다. 전체 사진에서 sliding window 부분만 띄어서 생각해보면 결국 output이 차례대로 쌓인다. 

 

cf)  참고로 생략된 것 같지만, 위에는 sliding stride를 2로 하므로 MaxPool 할 때, stride가 2이다. 만약 1 pixel 씩 sliding 하고 싶으면,  MaxPool의 stride를 1로 바꾸어야하고 자연스레 window의 첫 FC에는 9x9 filter가 적용된다. 뭔말인지는 직접 차원 계산해보면 앎. 

 

 이렇게 하면 계산상 공유하는 부분이 많아져 계산효율이 증가하지만, Bounding box를 정확히 찾지 못하는 단점이 있다.

왜...? => 이렇게 해서 bounding box를 못찾는 문제라기 보다는 sliding windows 자체의 문제라고 할 수 있다.

물론 모든 크기의 window에 대해서 1pixel 단위로 sliding을 한다면 찾을 수 있겠지만, 굉장히 오래걸릴 수 있다.

 


5. Bounding Box Predictions

 앞서 언급한 문제를 해결할 방법으로 YOLO 가 제시된다. 

- 별건 아니고 input image를 일정한 grid cell로 나누어서 각각에 classification with localization을 수행한다고 생각하면 된다. 따라서 각 grid cell 별로 8개의 label y가 할당되어야 함. 즉, 3x3 으로 나눈다고 했을 때, 한 이미지를 넣으면 3x3x8의 y를 output해야함. 그렇게 만든 (x,y) training set으로 모델을 훈련시키는게 YOLO다 이말이야.

 

 cf) 주로 3x3보다는 더 많은 grid cell로 나누는데 이유는 한 grid cell에 여러 객체가 담기는 것을 방지하기 위함. 

 

 

- 참고로 한 물체는 반드시 한 grid cell에 대응되는데, 걸쳐있어도 중심은 꼭 하나이기 때문이다.

- 그리고 bx, by는 위와 같이 (0,0)과 (1,1)을 기준으로 계산되며 bh와 bw는 grid cell을 넘어 걸쳐있을 수 있으므로 1을 오버할 수 있다.

 

cf) 자신있다면 YOLO 논문을 찾아보시오. 


6. Intersection Over Union

 별건아니고 위와 같은 연산을 하는 함수를 IoU라고 한다. 겹치는 부분의 비율을 알아보고자 하는 것. 0.5는 임의의 기준으로서 bounding box의 correctness 를 평가


7. Non-max Suppression

- 이건 모델을 만들고 돌렸을 때, 한 물체를 여러번 감지하는 문제가 발생할 때 해결책임.

- 별건 아니고 한마디로 'detect once'를 보장하는 기법이다. 

- 같은 물체에 대해 여러 grid cell 이 위와 같이 자기가 자동차의 중심을 포함하고 있다고 착각할 수 있다. 이렇게 되면 같은 물체를 multiple detection(지가 포함한다고 주장한는 cell의 수만큼)할 수 있다. 

 

- 이에 대해서 여러 박스가 상당부분(threshold로 값 지정) 겹칠 경우, Pc 값이 제일 큰 grid cell의 bound box를 선택하는 것이 Non-max suppression이다. 

- 정확히는 Pc * class 값 이다(강의에서는 class가 1인 car detection에 대해서만 다루고 있다). 

 


 8. Anchor Boxes

1) 개요

 알다시피 YOLO 방식은 grid cell 하나당 하나의 물체 밖에 감지하지 못하는 단점이 있다. 따라서 위와 같이 두 물체의 중심점이 한 grid cell에 있으면 난감해진다. 

 그래서 미리 anchor box를 만들어 놓고 y label을 anchor box의 수만큼 확장한 후, 각각의 부분이 anchor box 1~n과 얼마나 유사한지 Pc값으로 나타낸다. 

 

즉, 하나의 셀은 각 anchor box 별로 pc x class 값이 최대인 class를 선택하고 bounding box로 활용한다. 따라서 각 셀은 anchor box이 수 만큼 bounding box를 갖는다. 이렇게 되면 너무 많으니 뒤에 non-max suppression을 이용해 필요한 bounding box만 추출한는것.

2) Anchor box algorithm

  따라서 한 물체는 하나의 grid cell에 할당되는데, grid cell과 더불어 무슨 anchor box에 해당되는지도 할당된다. 

자연스레 y의 차원은 class수와 anchor box의 수에 맞게 확장되겠쥬?

 이건 예시.

 

1. 모델을 학습시키기 전에 anchor box를 몇개 만들고 그거에 맞게 label y도 할당시켜준다.

2. grid cell 별로 하나씩 살펴볼 때, 물체가 없으면 pass하고 물체가 있다면 어떤 anchor들에 해당되는지, 해당된다면 그 물체의 bounding box 위치와 class를 labelling 해준다.
(어떤 anchor인지만 판단하면 그 후에는 anchor에 대한 신경은 안쓰는 것)

3. 그리고 그렇게 만들어진 training data로 학습을 한다. 


4. Trained Model로 예측 수행


5. non-max suppression 수행


 

3) 첨언

 실제로는 YOLO 기법을 사용할 때, grid를 잘게 쪼기 때문에 여러 물체의 중심점이 한 grid cell에 겹칠 가능성은 크지 않다고 한다. 

 그리고 anchor box 는 과거에 수동으로 크기와 개수를 지정했었지만, 최근에는 k-means 기법(뭔지모름)을 이용해서 자동으로 anchor box 를 선택할 수 있게 해준다.


9. YOLO Algorithm

 오 바로 저기 내가 적어놓은게 대충 맞는 얘기네 굳.

1. 모델을 학습시키기 전에 anchor box를 몇개 만들고 그거에 맞게 label y도 할당시켜준다. 

2. grid cell 별로 하나씩 살펴볼 때, 물체가 없으면 pass하고 물체가 있다면 어떤 anchor들에 해당되는지, 해당된다면 그 물체의 bounding box 위치와 class를 labelling 해준다.
(어떤 anchor인지만 판단하면 그 후에는 anchor에 대한 신경은 안쓰는 것)

3. 그리고 그렇게 만들어진 training data로 학습을 한다. 


4. Trained Model로 예측 수행


5. non-max suppression 수행

 좀 참고할 점은 모든 class(보행자, 차 등)에 대해 non-max suppression 을 수행해야한다. 

 


10. Region Proposals

  물체가 있을 것 같은 지역을 골라서 그 곳에만 선택적으로 sliding windows 기법을 적용시키는 것.

교수님은 그닥 추천안하심. 대충 이정도만 이해하자.

 

질문과 비판은 언제나 환영입니다. 많이 꾸짖어 주십쇼.

 

728x90