본문 바로가기

AI/Object Detection

[OD] Faster R-CNN

 

갈아먹는 Object Detection [4] Faster R-CNN

지난 글 갈아먹는 Object Detection [1] R-CNN 갈아먹는 Object Detection [2] Spatial Pyramid Pooling Network 갈아먹는 Object Detection [3] Fast R-CNN 들어가며 Fast-RCNN에 이어서 오늘은 Faster R-CNN..

yeomko.tistory.com

 

(논문리뷰&재구현) Faster R-CNN 설명 및 정리

이전글 : (논문리뷰) Fast R-CNN 설명 및 정리 Fast R-CNN 설명 및 정리 이전글 : Object Detection, R-CNN 설명 및 정리 Object Detection, R-CNN 설명 및 정리 컴퓨터비전에서의 문제들은 크게 다음 4가지로 분..

ganghee-lee.tistory.com

 

[Object Detection] 3. Fast R-CNN & Faster R-CNN 논문 리뷰

저번 포스팅에서는 CNN을 이용한 첫 Object Detection인 R-CNN을 알아봤습니다. https://nuggy875.tistory.com/21?category=860935 [Object Detection] 2. R-CNN : 딥러닝을 이용한 첫 2-stage Detector 저번 포스..

nuggy875.tistory.com

R-CNN Family Structure

핵심 아이디어

Faster R-CNN의 핵심 아이디어는 Region Proposal Network (이하 RPN)입니다. 기존 Fast RCNN 구조를 그대로 계승하면서 selective search를 제거하고 RPN을 통해서 RoI를 계산합니다. 이를 통해서 GPU를 통한 RoI 계산이 가능해졌으며, RoI 계산 역시도 학습시켜 정확도를 높일 수 있었습니다. 이를 통해 RPN은 Selective Search가 2000개의 RoI를 계산하는 데 반해 800개 정도의 RoI를 계산하면서도 더 높은 정확도를 보입니다. 아래는 Faster R-CNN의 전반적인 구조입니다.

Faster R-CNN structure
RPN + Fast R-CNN

 

위 구조를 살펴보시면 Feature Map을 먼저 추출한 다음 이를 RPN에 전달하여 RoI를 계산합니다. 여기서 얻은 RoI로 RoI Pooling을 진행한 다음 클래시피케이션을 진행하여 Object Detection을 수행합니다. 그렇다면 과연 RPN은 어떻게 구성되어 있고, 어떻게 학습시킬 수 있는지 찬찬히 뜯어보겠습니다.

 

 

Region Proposal Network

RPN의 input 값은 이전 CNN 모델에서 뽑아낸 feature map이다.

Region proposal을 생성하기 위해 feature map위에 nxn window를 sliding window시킨다. 

이때, object의 크기와 비율이 어떻게 될지모르므로 k개의 anchor box를 미리 정의해놓는다.

이 anchor box가 bounding box가 될 수 있는 것이고 미리 가능할만한 box모양 k개를 정의해놓는 것이다.

여기서는 가로세로길이 3종류 x 비율 3종류 = 9개의 anchor box를 이용한다.

 

이 단계에서 9개의 anchor box를 이용하여 classification과 bbox regression을 먼저 구한다. (For 학습)

먼저, CNN에서 뽑아낸 feature map에 대해 3x3 conv filter 256개를 연산하여 depth를 256으로 만든다.

그 후 1x1 conv 두개를 이용하여 각각 classification과 bbox regression을 계산한다.

 

RPN Structure

 위 그림은 RPN의 개념을 시각적으로 보여주지만 실제 작동 방식은 보기보다 이해하기 어렵습니다. 좀 더 풀어서 그림으로 표현하면 아래와 같습니다.

RPN Structure

 

RPN이 동작하는 알고리즘은 다음과 같습니다. 논문에 생략된 세부 동작 원리는 pytorch 구현체[2]를 참고하였습니다. 

 

1. CNN을 통해 뽑아낸 피쳐 맵을 입력으로 받습니다. 이 때, 피쳐맵의 크기를 H x W x C로 잡습니다. 각각 가로, 세로, 체널 수 입니다.

 

2. 피쳐맵에 3x3 컨볼루션을 256 혹은 512 체널만큼 수행합니다. 위 그림에서 intermediate layer에 해당합니다. 이 때, padding을 1로 설정해주어 H x W가 보존될 수 있도록 해줍니다. intermediate layer 수행 결과 H x W x 256 or H x W x 512 크기의 두 번째 피쳐 맵을 얻습니다.

 

3. 두 번째 피쳐맵을 입력 받아서 classification과 bounding box regression 예측 값을 계산해주어야 합니다. 이 때 주의해야할 점은 Fully Connected Layer가 아니라 1 x 1 컨볼루션을 이용하여 계산하는 Fully Convolution Network의 특징을 갖습니다. 이는 입력 이미지의 크기에 상관없이 동작할 수 있도록 하기 위함이며 자세한 내용은 Fully Convolution Network에 관한 포스팅을 참고해주십시오.

 

4. 먼저 Classification을 수행하기 위해서 1 x 1 컨볼루션을 (2(오브젝트 인지 아닌지 나타내는 지표 수) x 9(앵커 개수)) 체널 수 만큼 수행해주며, 그 결과로 H x W x 18 크기의 피쳐맵을 얻습니다. H x W 상의 하나의 인덱스는 피쳐맵 상의 좌표를 의미하고, 그 아래 18개의 체널은 각각 해당 좌표를 앵커로 삼아 k개의 앵커 박스들이 object인지 아닌지에 대한 예측 값을 담고 있습니다. 즉, 한번의 1x1 컨볼루션으로 H x W 개의 앵커 좌표들에 대한 예측을 모두 수행한 것입니다. 이제 이 값들을 적절히 reshape 해준 다음 Softmax를 적용하여 해당 앵커가 오브젝트일 확률 값을 얻습니다.

 

5. 두 번째로 Bounding Box Regression 예측 값을 얻기 위한 1 x 1 컨볼루션을 (4 x 9) 체널 수 만큼 수행합니다. 리그레션이기 때문에 결과로 얻은 값을 그대로 사용합니다.

 

6. 이제 앞서 얻은 값들로 RoI를 계산해야합니다. 먼저 Classification을 통해서 얻은 물체일 확률 값들을 정렬한 다음, 높은 순으로 K개의 앵커만 추려냅니다. 그 다음 K개의 앵커들에 각각 Bounding box regression을 적용해줍니다. 그 다음 Non-Maximum-Suppression을 적용하여 RoI을 구해줍니다.

 

이렇게 RPN을 이용해서 RoI를 추론해내는 구조를 알아보았습니다. 이렇게 찾은 RoI를 다시 첫 번째 피쳐맵에 project 한 다음 RoI Pooling을 적용하고, 이를 다시 클래시피케이션에 적용하면 물체의 종류도 알아낼 수 있겠죠? 이 부분은 Fast R-CNN 구조를 계승하므로 궁금하신 분들은 이전 포스팅[4]을 참고해주시기 바랍니다.


1) Anchor Targeting

(input Image Size를 800x800 이라 가정하겠습니다)

 

우선, 

800x800x3 를 input image로 CNN(VGG-16)를 거쳐서

50x50x512의 Feature map이 생성됩니다.

 Feature map에 Sliding window 방법으로 각 중심 좌표를 중심으로

 k=9개의 Anchor box들을 만들어 놓습니다.

 

여기서 Anchor box는

3개의 Scale(8, 16, 32) 3개의 ratio(0.5, 1, 2)를 통해 9개가 만들어 집니다.

 

 

800x800에서 생성된 50x50의 feature map이므로

subsampling ratio=16을 기준 (800/50),

위와 같이 sliding window 방식으로 16x16 안의 중심 픽셀(파란 점)을 중심으로

Anchor Box를 9개씩 쳐서

50x50x9 = 22,500개의 Anchor box를 만들어 놓습니다.

 

(좌) Anchor Box들의 중심 좌표들, (우) 800x800 이미지 기준 400, 400 에서의 9개의 Anchor box

 

이렇게 만들어낸 22500개의 Anchor box들을 기준으로

그 안에 물체가 있는지 없는지를 학습을 할겁니다!

 

그러기 위해선 이미지와 그에 대한 Ground Truth Box가 들어왔을 때

각 Anchor마다 이 Anchor가 물체를 감싸고 있는지...

Background를 감싸고 있는지...

Labeling을 해줘야 겠죠?

 

GT Label은 만들어진 각 22,500개의 Anchor들과 Ground Truth Box의 IoU를 모두 계산하여

IoU가 0.7보다 크면 1 (Positive)IoU가 0.3보다 작으면 0 (Negative) 으로 두고

나머지는 -1로 둬서 신경 안쓰도록 합니다.

IoU = 교집합 / 합집합

이렇게만 하면 Positive한 Anchor의 개수가 많지 않을 수 있기 때문에

Ground Truth Box마다 IoU가 가장 높은 Anchor 1개를 뽑아

이 또한 1(Positive)로 Labeling 합니다.


Loss Function

이제 RPN을 학습시키기 위한 로스를 알아보겠습니다. RPN은 앞서서 Classification과 Bouding Box Regression을 수행하였는데요, 로스 펑션은 이 두 가지 테스크에서 얻은 로스를 엮은 형태를 취하고 있습니다.

Multi Task Loss

 

여기서 i는 하나의 앵커를 말합니다. pi는 classsification을 통해서 얻은 해당 엥커가 오브젝트일 확률을 의미합니다. ti는 bounding box regression을 통해서 얻은 박스 조정 값 벡터를 의미합니다. pi*와 ti*는 ground truth 라벨에 해당합니다. Classification은 이제 너무 익숙하게 사용하는 log loss를 통해서 계산합니다. regression loss의 경우 Fast R-CNN에서 소개되었던 smoothL1 함수를 사용하며, 이에 대한 자세한 내용은 이전 포스팅[4]을 참고하시기 바랍니다.

 

smoothL1 Loss Function

 

 

특이한 점은 각각 Ncls와 Nreg 나누어 주는 부분이 있습니다. 이는 특별한 의미를 갖는 것은 아니고 Ncls는 minibatch 사이즈이며 논문에서는 256입니다. Nreg는 엥커 개수에 해당하며 약 2400개 (256 x 9)에 해당합니다. 람다는 Classifiaction Loss와 Regression Loss 사이에 가중치를 조절해주는 부분인데 논문에서는 10으로 설정되어 있어, 사실상 두 로스는 동일하게 가중치가 매겨집니다.

 

이상으로 RPN을 학습시키기 위한 로스 펑션에 대해서 알아보았습니다. 나머지는 Fast R-CNN을 학습시킨 로스 펑션이 동일하게 적용됩니다. 이제 RPN과 Fast R-CNN 두 네트워크를 사이 좋게 엮어서 학습시키는 방법에 대해서 알아보겠습니다.

 

 

Training

하지만 전체 모델을 한번에 학습시키기란 매우 어려운 작업입니다. RPN이 제대로 RoI를 계산해내지 못하는데 뒷 단의 Classification 레이어가 제대로 학습될리가 없겠죠? 여기서 저자들은 4단계에 걸쳐서 모델을 번갈아서 학습시키는 Alternating Training 기법을 취합니다. 

 

1. ImageNet pretrained 모델을 불러온 다음, RPN을 학습시킨다.

2. 1 단계에서 학습시킨 RPN에서 기본 CNN을 제외한 Region Proposal 레이어만 가져온다. 이를 활용하여 Fast RCNN을 학습시킨다. 이 때 ,  처음 피쳐맵을 추출하는 CNN까지 fine tune 시킨다. 

3. 앞서 학습시킨 Fast RCNN과 RPN을 불러온 다음, 다른 웨이트들은 고정하고 RPN에 해당하는 레이어들만 fine tune 시킨다. 여기서부터 RPN과 Fast RCNN이 컨볼루션 웨이트를 공유하게 된다.

4. 마지막으로 공유하는 CNN과 RPN은 고정시킨 채, Fast R-CNN에 해당하는 레이어만 fine tune 시킨다.

 

 

지금까지는 Region Proposal과 Classification을 나눠서 Object Detection을 수행하는 2 Step 접근 방식들을 살펴보았습니다.

다음 논문으로는 이 틀에서 벗어나 1 Step 만으로 Object Detection을 수행하는 대표적인 모델 yolo를 리뷰해보도록 하겠습니다.

'AI > Object Detection' 카테고리의 다른 글

[OD] SSD: SIngle Shot Multibox Detector  (0) 2021.06.30
[OD] YOLO v1  (0) 2021.06.30
[OD] Non-Maximum Suppression(NMS)  (0) 2021.06.28
[OD] SPPnet  (0) 2021.06.25
[OD] Fast R-CNN  (0) 2021.06.25