본문 바로가기
Object Detection/RCNN Detection

[Object Detection] Fast R-CNN(ICCV2015) 논문리뷰

by pulluper 2022. 1. 5.
반응형

 

안녕하세요 pulluper 입니다. 😀

너무 늦었지만 오늘은 제대로 된 deep learning object detection 의 시작

ICCV2015에서 발표된 Fast R-CNN 을 리뷰 해 보도록 하겠습니다. [paper]

오래 된 논문이니만큼 성능보다는 아이디어나 처음 학습 방법 등

얻어갈 수 있는 부분을 보시길 추천드립니다. 

저는 (RoI pooling, Loss) 들을 보시면 좋을 것 같다는 생각이 드네요. 

그럼 시작하겠습니다. 


일단 저자를 보니 심상치 않습니다. 

이분은 Ross Girshick 이십니다. 2022년 1월기준 Facebook AI Research (FAIR) 에 계시고,

논문을 쓴 당시에는 Microsoft 에 소속되신 시기였습니다. 

RCNN, Fast R-CNN, Faster RCNN, YOLO v1, RetinaNet 등 (이외에도 엄청 많음..)

object detection 의 다수에 논문에 참여를 하신 화려한 이력이 있으십니다. 

2022년 1월 기준 23만의 말도안되는 citation 을 지니시고 있네요. 🙄🙄

 

citation of ross girshick


Abstract

 

논문의 abstract(초록)에서는 연구 주제나 목표 핵심내용을 간결하게 설명해주고 

독자의 흥미를 끌어야 하는 부분이라서 가장 중요하게 읽는 부분입니다. 😁

Abstract 에서는 말 그래로 빠른 Fast R-CNN 을 제안했고,

R-CNN 에 비해서는 training 시간이 VGG16기준 9배, test-time 은 무려 213배 빨라졌고

SPPnet 에 비해서는 training 3배, test-time 은 10 배 빨라졌다고 하는데요. 

심지어 더 정확하다고 합니다. 

이렇게 설명을 해 놓으니 빨리 읽고싶어 지지 않나요?


Introduction

 

이 시기는 convolution neural network 가 나와서

classification, object detection 등의 task 에서 기존의 방법론들보다 

학습을 이용해서 성능이 높아지는 초기였습니다. :)

Introduction 에서는 다음과 같은 내용을 말하고 있습니다. 

 

  • deep conv 의 발전으로 classification object detection 이 개선중.
  • object detection 은 classification 보다 더 어려운 문제이다. 
  • object detection 은 반드시 먼저 candidate 를 구하고, 이후 그 후보자 중에서 refine 을 하여 정확한 위치를 찾는다
  • 이 논문에서 빠르고(0.3s/img - excluding proposal) 정확한 (VOC 2012 mAP 66%) 을 제안한다.  

내용중 흥미로운 부분은 먼저 후보자 (candidate) 를 뽑고 

이후에 refine 을 하는 2-stage 의 방법을 매우 강하게 말하고 있는 것입니다. 

후에 다양한 알고리즘들이 나오면서 많이 놀랐을 것 같습니다. 🤩

 

demonstration of object detection in Fast R-CNN


R-CNN & SPPnet

 

이 부분에서는 기존의 알고리즘에 대한 단점을 짚으면서 문제 제기를 합니다. 

1. training multi-stage pipeline.

convolution, SVM, box regressor 등을 다 따로 학습시키기 때문에 여러 단계에 걸쳐 학습

2. training is expensive in space and time.

학습시 여러개의 patch를 sharing computation 을 이용하지 않아 모두 저장하고 오래걸림. 

3. object detection is slow. 

이 또한 sharing computation 을 하지 않아 오래걸리는 것을 볼 수 있습니다.

 

sharing computation 을 간단하게 설명하면

아래의 왼쪽 그림처럼 여러개의 RoI(region of interest)

를 각각의 conv로 학습하는것을

오른쪽 그림처럼 전체 이미지를 학습하고,

한 이미지는 convolution weight를 공유하는 것을

Sharing computation 이라고 할 수 있습니다. 

R-CNN vs Fast R-CNN sharing conv

그리고 SPPnet 은 sharing computation은 하지만,

convolution 이 update 를 하지 않는다는 단점이 있습니다. 

이를 정리하면 다음과 같습니다. 

 

  Multi-stage pipeline Sharing computation Update Convolution
R-CNN O X O
SPP-net O O X
Fast R-CNN X O O

 

결과적으로 Fast R-CNN 은 

multi-stage pipeline을 사용하지 않고, single-stage training 방식을 사용했으며,

Sharing computation 을 이용하여 시간,공간,속도의 향상을 가져왔으며

Convolution 을 update 시키도록 하여 성능을 향상시켰습니다.  😎

이렇게 논문의 구성에서 자신들이 문제제기를 명확히 하고

해결방안을 제시한 것은 잘 쓴 논문이라는 생각이 듭니다. 


Contributions

 

Contiributions 에서 위에 나왔던 내용들이 모두 나옵니다. 

1. 성능이 좋다 (mAP가 높다)

2. multi-task loss 를 이용해서 single-stage 학습을 했다.

3. 모든 네트워크가 update 된다.

4. feature cashing 을 위한 disk 저장소가 필요없다. 


Fast R-CNN architecture and training

 

이번 챕터에서는 전체적인 faster rcnn 의 구조와 학습 방법을 소개합니다.

아래 사진은 Fast RCNN의 구조인데요. Deep ConvNet 과 RoI projection 부분이 들어갑니다.

그리고 이후에 RoO pooling layer 를 지난 후 FCs 가 2개의 branch 로 나눠지는 구조입니다.

Fast-RCNN 부분중 가장 중요한 부분은 RoI pooling layer 라고 생각합니다. 

 

내용을 보면 이미지 전체와 proposal set을 input으로 받는다고 되어 있습니다.

즉 위 사진에서의 DEEP CONVNET과 RoI projection을 통해서 나오는 2가지 입니다. 

이미지가 들어가면 그것을 convolutional network 를 통해서 feature 를 뽑고 - (1)

selective search 를 이용해서 나오는 후보 projection 을 - (2)

두개의 input 으로 받습니다. 이후 과정을 진행합니다. 


** The RoI pooling layer ** 

 

RoI pooling 이라는 것이 무엇일까요?

먼저 이해를 위해서 그냥 image 에 RoI pooling 을 적용한 사진을 보겠습니다. 

다음 사진에는 의자(chair)가 5개 있는데, 이것들의 size  다 다릅니다.

이를 같은 (30 x 30) 의 크기로 maxpooling을 통해서 잘라서 모아주는 역할을 합니다.

 

즉, Image 가 [B, 3, 600, 600] 이라고 가정한다면, RoI pooling 이후에

[num_object=5, 3, 30, 30] 으로 feature 를 일정하게 뽑는것 이라고 이해 가능합니다.  

roi pooling in image

 

아래 그림을 보시면 이번에는 feature 에서 적용한 것인데요, 처음에 feature 에서 두번째 region을 2 x 2로 변경하고 싶은 것 입니다. 즉 검정 박스의 feature map (7 x 5)를 (2 x 2)로 바꾸기 위해서 각 cell 들중 max값으로 pooling 합니다. 

process of roi pooling in features

결과적으로 (7 x 5) 의 feature 는 (2 x 2) 로 줄어들게 됩니다. 

result of roi pooling

그리고 roi pooling 은 SPPnet의 하나의 피라미드 level에 대한 spatial pyramid pooling 이라 볼 수도 있습니다. 

 

RoI Pool 코드 예제는 다음과 같습니다. 

https://csm-kr.tistory.com/37

 

[pytorch-torchvision] RoI Pooling 이해하기 및 예제 구현

안녕하세요 pulluper입니다. 😁 이번 포스팅에서는 torchvision을 이용한 RoI Pooling 를 알아보고 예제를 통해서 이해를 해 보도록 하겠습니다. RoI Pooling 이란 Fast RCNN에서 원하는 위치(regions)의 feature..

csm-kr.tistory.com

 


Initializing from pre-trained networks

 

VGG16 을 변형하여서 Fast RCNN 을 만들었는데 변형된 부분은 다음과 같습니다.  😀

기본적으로 pre-trained 된 ImageNet network 를 사용하였고, 3가지의 변형이 있습니다. 

  • 첫번째는 마지막 max pooling 을 위에서 설명한 RoI pooling 을 사용한 점과  (H = W = 7 for VGG16)
  • 두번째는 fc 의 마지막 softmax layer를 k + 1 class 에 대한 classifier 과 bonding box regressor 로 바꾼점이고
  • 마지막으로 input 을 이미지의 list 와 RoI 의 list 를 받는다는 점 입니다. 

Fine-tuning for detection 

 

이 섹션에서는 어떻게 학습을 하는가에 대하여 말하고 있습니다. 이를 Fine-tuning 이라고 하였습니다. 

SPP와 달리 Fast RCNN이 효율적인 이유는 큰 Receptive Field 의 RoI가 아닌

Hierarchical Sampling을 통해서 RoI 를 뽑기 때문이라 합니다 .

전체 R개의 RoI sampling 을 N개의 이미지에서 뽑아내는 방법입니다. 

예를들어 N개의 이미지에서 R개의 RoI sampling 을 뽑을 수 있는데, R=128, N=2라면,

한 이미지에서 128/2 = 64 개의 RoI 를 뽑을 수 있고 이는 128개의 다른 image 에서

하나의 RoI 를 뽑는 방식보다 대략 64배 빠르다고 주장합니다. 

 

그리고 softmax classifier 과 bounding-box regressor를 함께 최적화 하는 one-finetuning stage로 학습한다 합니다. 

(이 때는 classifier, regressor 등을 여러 stage로 학습을 하였습니다.)


Multi-task Loss

 

이 섹션이 드디어 Fast RCNN 의 loss에 대하여 다룬 section 입니다. 

RCNN 과는 다르게 update를 할 수 있어서 조금 달라졌고, Faster RCNN과 그 이후의 논문에도 영향을 미쳤기 때문에

한번쯤은 정리 해 두는것을 추천드립니다.  전체 loss function 은 다음과 같습니다. 

 

fast RCNN 의 loss function

여기서 L(p, u, t^u, v) 가 나타내는것이 전체 loss 입니다. 

빨간 밑줄 (p, t^u)은 network 의 outputs 들이고, 파란밑줄(u, v)는 Ground Truth 를 나타냅니다.

그리고 (1) 식 은 Cross Entropy, (2) 는 Iverson bracket ([u>=1] [] 내부의 조건이 맞으면 1 그렇지 않으면 0)

(3) 은 soomth L1 loss 입니다. 

 

여기서 주목해야 할 점은 selective search 알고리즘으로 추출한 k개의 제안(proposal) box 가 있다는 것입니다.

이를통해 다음 값들이 갖는 의미를 알 수 있습니다. 

 

p    : 각 제안 box 가 어떤 class 일지를 softmax 를 이용해서 0~1 사이로 만든 network output! - [k, class 갯수 + 1]

u    : 각 제안 box 가 갖는 ground truth class (iou가 0.5 이상인 값을 1로 만든 class label)        - [k]

t^u : 각 제안 box (P) 와 network output (G*) 를 다음과 같은 관계로 계산한 target 값!            - [k, 4]  

v    : 각 제안 box (P) 와 ground truth box (G) 를 다음과 같은 관계로 계산한 target 값!           - [k, 4]

target 만들기 식

정리하자면, Fast RCNN은 proposal box 의 class 와 간접적인 box 좌표의 값을 나타내는 target을

Cross Entropy Loss / Smooth L1 loss 로 표현하고 이값을 최적화 시키는 방향으로 학습을 합니다. 


Mini-batch sampling

 

논문에서 가장 간지러운(?) 부분인 mini-batch sampling 의 부분입니다.

보통 image processing 에서 mini-batch 를 이용한다고 하면

batch 처리 즉 일괄처리를 위해서 N 개의 image와 그에 상응하는 B개(set) 의 처리를 뜻합니다. 

여기서는 batch의 단위가 image가 아니라, RoI Sampling의 갯수입니다.  

 

먼저 이미지가 들어가면 selective search 알고리즘에 의해 각 image 당 2000개의 proposal 을 뽑아냅니다. 

그것이 RoI pooling 을 통해서 RoI(region of interest) 를 뽑아냅니다.

이때, N과 R에 의해서 N장의 image에서 R개의 RoI 를 뽑습니다. 

N : image 의 갯수

R : RoI 의 갯수 

N = 2, R = 128

 

R / N = 128 / 2 = 64

즉 64개의 RoI 를 1장의 image에서 sampling 합니다. 

 

여기서 25%(16장) 은 GT box와의 IoU 가 0.5 이상인  [u >= 1]

그리고 75%(48장) 은 GT box와의 IoU가 [0.1, 0.5)인 [u == 0] 조건을 적용합니다. 

 

이렇게 64개의 mini-batch를 구성하고 학습을 진행합니다. 


The result of VOC datasets 

 

마지막으로 voc dataset에 대한 성능을 보겠습니다. 

논문의 발표를 기준으로 매우 빠르고, 그리고 성능까지 좋은 모습을 볼 수 있습니다. 

각 dataset 에 따라 (68~70) 정도의 성능을 보입니다. 

RCNN에 비해 성능이 모두 높은 것을 볼 수 있습니다. 


마치며..

 

ICCV2015에서 발표된 Fast R-CNN 를 한번 보았습니다.

처음에 언급한것과 같이 RoI pooling의 idea,  Loss등을 중점적으로 보시면 좋을 것 같습니다.

의견과 질문은 항상 환영합니다.

 

감사합니다.  😎😎😎😎😎😎

반응형

댓글