Machine & Deep Learning

[Yongggg's] Fast R-CNN & Faster R-CNN

Yonggg 2021. 6. 7. 19:50

안녕하세요! 오늘은 R-CNN의 문제점을 보완하여 나온 Fast R-CNN, 그리고 Faster R-CNN에 대해 설명해보겠습니다. R-CNN에 대한 자세한 설명은 제 블로그 Machine & Deep Learning 카테고리에 있으니 참고 부탁드립니다!

또, 해당 내용과 그림들은 고려대학교 김승룡 교수님의  고급컴퓨터비전 강의와 원래 논문을 참고했음을 미리 밝힙니다.

 

Fast R-CNN

1. 목적

  1. R-CNN 과정에서, Selective Search 후에 나온 RoI(Region of Interest) 마다 CNN 연산을 했기에 속도가 매우 느렸다는 점을 개선했다.
  2. R-CNN의 모델을 한 번에 학습하지 못하는 Multi-Stage라는 단점을 해결했다.

2. 개념

  1.  1-1의 문제를 전체의 이미지를 한 번에 CNN 연산을 함으로써 속도를 개선한다. 
  2.  CNN 연산 후의 Feature를 통해 Classification, Bounding Box Regression까지 하나의 모델에서 학습함으로써 1-2의 문제를 해결했다.

3.  원리

 

[그림 1] Fast R-CNN 처리과정

Fast R-CNN의 pipeline은 [그림 1]과 같다.

3.1 RoI Pooling layer

[그림 1]에서 나온 RoI pooling layer에 대해 자세히 알아보도록 하겠다.

[그림 2] RoI  pooling process 1

먼저, [그림 2]처럼 RoI 영역들은 Integer point로 Snapping 된다.

[그림 3] RoI pooling process 2

다음으로, [그림 3]처럼 임의의 사이즈의 영역을 고정된 사이즈의 Representation으로 변환한다. (여기에서는 고정된 사이즈를 2 $ \times $ 2 의 Pixels로  나타냈다.)

- [그림 3]에서 3 $ \times $ 4 크기의 RoI를 2 $ \times $ 2 사이즈로 만들어 낼때, 3/2 =1.5 -> 2 (반올림), 4/2 =2로 사이즈를 지정한다. 이 계산은 구현자가 임의로 정할 수 있다. 

4. 정리

위의 설명들을 바탕으로 [그림 1]의 Fast R-CNN의 수행과정을 정리해보겠다.

  1. 먼저, 원본 Image에서 Selective Search를 바탕으로 RoI를 찾는다.
  2. 동시에 원본 Image를 CNN에 태워 feature map을 추출한다.
  3. Selective Search로 찾은 RoI를 2번의 feature map 크기에 맞춰 feature map에 Projection 시킨다.
  4. Projection 된 RoI에 대하여 RoI Pooling 과정을 거치게 한 후, 고정크기의 feature vector를 얻는다. (이 featur vector를 FC Layer에 통과시켜 두 개의 Brunch의 입력이 된다.)
  5. feature vector를 입력으로 softmax 함수를 통과시켜 RoI에 대해 Object Classification을 한다.
  6. Bounding Box Regression을 통해 Selective Search로 찾은 box의 위치를 조정한다.

 


Faster R-CNN

1. 목적

[그림 4] R-CNN, SPP-Net, Fast R-CNN의 Training time 및 Test time 비교

  1. [그림 4]를 보면, Fast R-CNN은 다른 OD Model들 보다 Training time 과 Test time의 시간을 현저하게 단축 시켰다. 하지만, Test time에서 Region Proposal을 수행할 때 걸리는 시간은 다른 모델들과 비슷하게 2초 정도를 차지하는 것을 확인할 수 있다. Selective Search 알고리즘은 CPU를 사용하기 때문에 이런 문제점이 발생했다. Faster R-CNN은 이 문제점을 해결했다. 
  2. 이전의 OD task를 수행하는 모델들은 Multi stage Training을 수행했다. 이전의 Fast R-CNN 또한, RoI를 추출할 때, Selective Search 알고리즘을 사용했다는 점은 Multi stage Training 이라고 봤다. Faster R-CNN은 이 문제 또한 해결했다.

2. 개념

Faster R-CNN에서는 RPN(Region Proposal Network)를 사용하여 이 문제를 해결함으로써, 모든 계산이 End-to-End로 끝나는 Single Stage Training을 구현하였고 이미지를 따로 저장한 뒤에 연산을 해야하는 번거로움 또한 없앴다.

3. 원리

[그림 5]를 보자. Region Proposal Network 부분만을 제외하면, 위의 Fast R-CNN과 동일한 구조임을 확인할 수 있다. 

[그림 5] Faster R-CNN의 Architecture

3.1 RPN (Region Proposal Network)

[그림 5]의 Region Proposal Network 부분을 알아보겠다. 

( 이 부분의 설명은 제이스핀(J.Spin) 님의 블로그의 내용을 가져왔습니다. )

[그림 6] Region Proposal Network

먼저, Pretrained CNN을 거쳐 나온 Feature Map의 Channel Dimension은 ZFNet 기준 256-d, VGG-16 기준 512-d가 나오게된다. 이 Feature Map을 k개의 Anchor box를 통해 영역을 정하고 Classification Layer와 Bounding Box Regression을 거쳐 물체가 있는 곳과 물체가 있는지 없는지에 대해 학습하게된다.

여기서 Classification Layer는 [그림 6]에서 나온 것처럼, 물체가 있는지 없는지에 대해서만 확인하는 역할을 하기 때문에 Class 개수는 2개(있음, 없음)를 판단하는 Layer가 된다.

 

3.1.1 Anchor Targeting

Input Image Size를 800 $ \times $ 800 $ \times $ 3 이라고 가정하자.

이 Image가 VGG-16 Net에 들어가게되면 50 $ \times $ 50 $ \times $ 512의 feature map이 생성된다. 

이 feature map에 Sliding window 방법으로 각 중심 좌표를 중심으로 k=9개의 Anchor Box들을 만들어 놓는다.

여기서 Anchor box는 3개의 Scale(8, 16, 32)과 3개의 ratio(0.5, 1, 2)를 사용하여 총 9개가 만들어진다. 만들어진 Anchor Box의 모습은 [그림 7]과 같다.

[그림 7] Ratio와 Scale에 따른 Anchor Box

800 $ \times $ 800 Image에서 50 $ \times $ 50 크기의 feature map을 생성했으므로 subsampling ratio=16으로 둔다. (800/50) [그림 8]과 같이 sliding window 방식으로 16 $ \times $ 16 안의 중심 픽셀 (파란색 점)을 중심으로 Anchor Box를 9개를 쳐서 50 $ \times $ 50 $ \times $ 0=22,500개의 Anchor Box를 미리 만든다.

[그림 8] # of Anchor Box

[그림 9]를 보면, 800 $ \times $ 800 사이즈의 Anchor Box의 중심 좌표와 pixel 중심이 (400, 400)일 때, 9개의 Anchor Box의 모습이다.

[그림 9] (좌) Anchor Box의 중심 좌표들 (우) 중심 pixel이 (400, 400)일 때의 Anchor box

이렇게 만든 22,500개의 Anchor Box를 기준으로 그 안에 물체가 있는지 없는지에 대해 학습을 진행할 것이다.

-> 이 Task를 하기 위해서는 이미지와 Ground Truth Box가 들어왔을 때, 각 Anchor마다 이 Anchor가 물체를 감싸고 있는지, Background를 감싸고 있는지에 대한 Label이 필요할 것이다.

따라서 GT Label은 만들어진 22,500개의 Anchor들과 Ground Truth Box의 IoU를 모두 계산하여 IoU 값이 0.7보다 크다면 1 (Positive), IoU가 0.3보다 작으면 0 (Negative)으로 두고 나머지는 -1로 두어 신경쓰지 않도록 한다.

(IoU는 이전의 R-CNN에서 설명한 것을 참고해주시면 감사하겠습니다!)

이렇게 설정한다면, Positive의 Anchor의 개수가 많지 않을 수 있기 때문에 Ground Truth Box마다 IoU가 가장 높은 Anchor 1개를 뽑아 이 Anchor도 1 (Positive)로 Labeling 한다.

3.1.2 Prediction

50 $ \times $ 50 $ \times $ 512 크기의 feature map을 Conv layer에 한 번 태운후에,

Bbox Regression Layer(50 $ \times $ 50 $ \times $ 512 -> 50 $ \times $ 50 $ \times $ 36) 와

(36은 Anchor Box의 개수 (9개) $ \times $ Bounding Box 좌표 개수 (4개)를 뜻한다.)

Classification Layer(50 $ \times $ 50 $ \times $ 512 -> 50 $ \times $ 50 $ \times $ 18)을 만든다.

(18은 Anchor Box의 개수 (9개) $ \times $ Class의 개수 (2개)를 뜻한다.)

 

따라서 [그림 10]의 Regression Layer의 output은 (22500, 4), Classification Layer의 output은 (22500, 2)가 된다.

[그림 10] RPN architecture

이렇게 Prediction을 마치면, 3.1.1에서 사용한 Ground Truth Label과 3.1.2의 예측값이 함께 Loss function에 들어가 RPN을 학습할 수 있도록 한다.

동시에, 3.1.2에서 나온 Prediction 값 두 개(Bbox Regression, Classification)는 NMS를 거쳐 특정 개수의 RoI로 Sampling된 후, Fast-RCNN에 쓰이게 된다.

3.1.3 Loss Function for RPN

(이 또한 J.Spin님이 설명을 너무 잘 해놓으셔서 설명을 따왔습니다.)

22,500개의 Anchor 중에서 i번째 Anchor에 대하여 Ground Truth(GT)와 Prediction 값을 비교하여 RPN의 Class(물체가 있는지 없는지)와 Box(Box의 위치)를 학습한다.

[수식 1] Loss Function for RPN

[수식 1]에서 $ L_{cls} $ : Classification은 Log Loss를 사용,

$ L_{reg} $ : Box Regression에서는 Smooth L1 Loss를 사용했다.

GT Label 이 0이라면 Background로 간주하는 것이기 때문에 뒷 항에 0이 곱해진다. 때문에 Bbox reg는 학습되지 않는다. 또, Balancing Weight 인 $ \lambda $와 $ N_{cls} $, $N_{reg} $를 통해 두 항을 Normalize한다.

4. 정리

위의 3.1.2에서 NMS까지 마친 RoI들은 그대로 Fast R-CNN에서 사용했던 Network와 동일한 Network를 거쳐 OD를 수행하게 된다.

[그림 11]은 R-CNN, Fast R-CNN, Faster R-CNN의 pipline을 그림으로 나타낸 것이다.

[그림 11] R-CNN, Fast R-CNN, Faster R-CNN piplines

이렇게 Fast R-CNN과 Faster R-CNN에 알아보았습니다. OD 부문에서 최초의 one-stage 과정으로 넘어오는 논문이었습니다. 글의 오류사항이나 문제들은 댓글로 남겨주시면 감사하겠습니다!