Vision_/CNN

[Object Detection] R-CNN (R-CNN, Fast R-CNN, Faster R-CNN) 설명, 비교, 모음

대장장ㅇi 2024. 1. 25. 23:53

Object Detection [R-CNN]

 

 

R-CNN , Fast R-CNN, Faster R-CNN 의 구조와 발전 방향에 대해서 설명할 예정입니다!

 

 

1. R-CNN

 

1. Input으로 이미지를 입력받는다.

 

2. selective search(CPU) [Region Proposal] 를 진행하여 물체가 존재할 것 같은 지역_RoI(Region of Interest)  을 한 이미지당 약 2000개 정도 추출한다.

 

3. 추출한 ROI (Region of Interest) 를 모두 동일 input size 로 만들어 주기 위해 warp 하여 동일한 사이즈로 만들어준다. (CNN은 고정된 크기의 input 을 필요로 하기 때문에 re-size 가 필요하다.)

 

4. 2000개의 warped image 를 각각 CNN 모델에 넣어 feature vector 를 추출한다. (이미지마다 2천번의 CNN 수행)

 

5. 추출된 feature vector 들은 SVMs(어떤 클래스에 해당되는지) , Regressor(물체의 위치가 어딘지) 수행

 

 

 

* selective search (Regional Proposal) 이란?

 

1. 초기에 원본 이미지로부터 각각의 object 들이 1개의 개별 영역에 담길 수 있도록 수많은 영역들을 생성한다.

2. 이후 오른쪽 사진인 Algorithm 1 을 따라 유사도가 높은 것들을 하나의 Segmentation 으로 합쳐준다.

    R={r1​,r2​,…,rn​} : 최초 Segmentation 을 통해서 나온 초기 n개의 후보 영역들

    S : 영역들 사이의 유사도 집합

  • 색상, 무늬, 크기, 형태를 고려하여 각 영역들 사이의 유사도를 계산
  • 유사도가 가장 높은 ri 와 rj​ 영역을 합쳐 새로운 rt​ 영역을 생성
  • ​ri 와 rj 영역과 관련된 유사도는 S 집합에서 삭제
  • 새로운 rt 영역과 나머지 영역의 유사도를 계산하여 rt의 유사도 집합 St 생성
  • 새로운 영역의 유사도 집합 St 와 영역 rt를 기존의 S, R 집합에 추가.

 

 

R-CNN 은 selective search로 2000개의 region proposal을 뽑고 각 영역마다 CNN을 수행하기 때문에 CNN연산*2000 만큼의 연산량이 발생하므로 매우 느리다는 단점이 있다. 이를 해결하기 위해 Fast R-CNN에서 input 이미지 하나에 CNN 을 한번만 돌려 위에서 발생하는 문제점을 해결하였다!

 

 

 

 

 

2. Fast R-CNN

 

1. input 이미지에 CNN 을 돌려 feature map을 얻는다.

 

2. 생성된 feature map 을 가지고 Selective search 를 통해 RoI 를 추출한다.

 

3. 추출된 RoI 를 RoI pooling 을 수행하여 모든 RoI들이 고정된 크기의 feature vector를 가지게 한다.

 

4. feature vector 들이 FC layer(fully connected layer) 로 전달된 후 output layer 로 전달된다.

 

5. 마지막으로 classification 과 regression 을 진행한다.  R-CNN 에서는 여러 개의 클래스가 존재하는 상황에서 각각의 클래스에 대해 SVMs 을 사용했지만, Fast R-CNN은 기본적인 CNN network를 이용해서 Softmax를 사용하여 각 클래스에 대한 확률 값을 구한다는 점에서 차이가 있다.

 

 

 

*RoI pooling 이란?

 

Fast R-CNN은 RoI의 Feature Map을 고정된 크기로 변환하기 위해 RoI Pooling을 사용합니다. 이때 사용되는 게 개념이 Quantization입니다. Quantization은 소수점을 갖는 소수를 정수로 제한하는 개념입니다. Quantization을 설명하기 위해 아래 그림을 보도록 하겠습니다.

 

 

위 그림에 왼쪽에 보면 5 x 5 크기의 Feature Map이 있습니다. 그리고 빨간색 점선은 RoI입니다. RoI Pooling Layer를 통해서 RoI를 2 x 3 크기의 RoI로 변환한다고 가정해보겠습니다. 이때 Quantization이 수행되면서 왼쪽의 RoI가 오른쪽의 2 x 3 크기의 RoI가 됩니다. 이때 RoI가 이미 2 x 3 크기이므로, 추가적으로 작업을 하지 않고 2 x 3 크기의 Featuer Map을 출력하면 됩니다. 그럼 만약 1 x 1 크기의 RoI로 변환한다면 어떻게 되는지 살펴보겠습니다. 오른쪽 그림의 2 x 3 크기의 RoI에서 Max Pooling을 진행하여 최대값인 9.5를 추출하여 1 x 1 크기의 Feature Map을 생성합니다.

 

다시 설명하면 RoI Pooling은 기존의 RoI를 H x W Grid로 나누고, 각 Cell에서 Max Pooling을 수행하여 H x W 크기의 고정된 Feature Map을 생성하는 작업입니다. RoI Pooling은 각 Feature Map의 채널에 개별적으로 적용됩니다.

 

 

 

 

 

 

 

 

 

R-CNN 과 Fast R-CNN 의 구조를 사진으로 비교해보고 넘어가겠습니다.

 

 

 

그러나 여전히 Fast R-CNN에서도 R-CNN에서와 마찬가지로 RoI를 생성하는 Selective search알고리즘은

CNN외부에서 진행되므로 이 부분이 속도의 bottleneck이다. 따라서 이 RoI 생성마저 CNN내부에서 함으로써 더욱 빠르면서 정확한 region proposal을 생성한 Faster R-CNN이 나오게 된다!

 

 

 

3. Faster R-CNN

 

 

Selective search 알고리즘은 후보 영역 추출을 위해 사용되며 CPU에서 작동하는데, 이로 인해 네트워크에서 병목현상이 발생할 수 있습니다. 이 문제를 해결하기 위해 Faster R-CNN은 Region Proposal Network(RPN) 이라는 네트워크를 도입합니다. RPN은 보다 정교한 region proposals을 추출하기 위해 다양한 크기와 가로세로비를 가진 bounding box인 Anchor box 를 사용한다.

간단히 말하면, Faster R-CN은 RPN과 Fast R-CNN 모델을 합친 것으로 볼 수 있습니다. RPN은 region proposals을 추출하고 이를 Fast R-CNN 네트워크에 전달하여 객체의 클래스와 위치를 예측한다. 이렇게 함으로써 전체 모델이 GPU에서 동작하며 병목 현상이 발생하지 않습니다. 또한 end-to-end로 네트워크를 학습시킬 수 있게 됩니다. 전체적인 동작 순서는 다음과 같습니다. 

 

 

1. input 이미지를 pre-trained된 CNN 모델에 입력하여 feature map을 얻는다. 

 

2. 그렇게 얻은 feature map에 RPN을 적용하여 region proposals을 뽑아낸다.

 

3. region proposals 와 1. 과정에서 얻은 feature map 을 통해 RoI pooling 을 수행하여 고정된 크기의 feature map을 얻는다.

 

 이렇게 되면 물체가 있을법한 위치를 구하는 과정을 GPU에서 수행할 수 있기 때문에 속도가 빨라질 뿐만 아니라 feature map을 공유한다는 점에서 성능 향상, end-to-end 방식(output 부터 input 까지 back propagation을 통해 gradient 를 계산)으로 학습 가능하다는 장점이 있다.

 

 

 

 

*RPN 이란?

위에서 잠깐 설명했다 싶이 RPN 은 이전 selective search 방식의 병목현상의 문제점(CPU 사용) 을 해결하기 위해 사용된 방식이다. 자세히 설명하면 위의 사진에서 각 sliding window는 작은 차원의 feature로 변하게 된다. 그 후 feature 들은 2가지 분기로 나뉘게 되는데

1. 각 proposal들이 물체인지 아닌지 점수를 매기는 부분 (왼쪽) 

2. 각 proposal들의 위치를 regression하는 부분(오른쪽)

이때 k는 하나의 sliding window에서 나오는 anchor box의 개수이다. 

 

따라서 RPN의 결과로 여러 사이즈의 region proposal box와 이 box가 object일 확률을 return한다.

 

 

 

 

 

 

 

 

 

 

참고 URL

https://developer-lionhong.tistory.com/31

https://www.youtube.com/watch?v=jqNCdjOB15s&t=1087s

https://medium.com/@parkie0517/fast-r-cnn-%EB%85%BC%EB%AC%B8%EB%A6%AC%EB%B7%B0-roi-pooling-layer%EC%99%80-truncated-svd-a1147f7267be

https://cake.tistory.com/5

https://ganghee-lee.tistory.com/36