티스토리 뷰
[Object Detection] 3. Fast R-CNN & Faster R-CNN 논문 리뷰
제이스핀 2019. 8. 17. 16:26
저번 포스팅에서는 CNN을 이용한 첫 Object Detection인 R-CNN을 알아봤습니다.
https://nuggy875.tistory.com/21?category=860935
이번 포스팅에서는 저번 포스팅에서 R-CNN Family라고 소개 드렸던,
R-CNN 구조를 바탕으로 한 빠르고, 더 빠른 Fast R-CNN과 Faster R-CNN 논문을 소개해드리고자 합니다.
둘의 구조가 비슷한 점이 많고, Faster R-CNN에서 Fast R-CNN의 방법을 많이 가져오기 떄문에
같이 소개해 드리도록 하겠습니다.
↓↓↓ 논문 링크 ↓↓↓
Fast R-CNN :https://arxiv.org/pdf/1504.08083.pdf
Faster R-CNN : https://arxiv.org/pdf/1506.01497.pdf
⊙ Fast R-CNN (ICCV 2015)
이 전 포스팅에서 설명 드렸듯이
R-CNN은 CNN을 사용한 최초의 Object Detection 방법이고,
이전 방법들에 비해 성능을 많이 끌어 올렸지만
치명적인 단점이 몇 가지 있었습니다.
R-CNN의 이 단점들에 대해서 간단히 설명하면
1. AlexNet을 그대로 사용하기 위해 Image를 224x224 크기로 강제로 warping 시켰기 때문에
이미지 변형으로 인한 성능 손실이 존재.
2. Selective Search를 통해 뽑힌 2000개의 Image Proposal 후보를 모두 CNN 모델에 집어 넣기 때문에,
training, testing 시간이 매우 오래 걸림.
3. Selective Search나 SVM이 GPU를 사용하기엔 적합한 구조가 아님.
4. 뒷 부분에서 수행한 Computation을 Share하지 않는다. (No Back Propagation)
Fast R-CNN에서는 이 단점들을 해결하는 데에 초점을 두었으며,
좀 더 빠르고 성능이 좋은 Object Detection 방법을 소개합니다.
1. CNN (Convolutional Neural Network)
먼저 앞 부분의 CNN 모델이 변형 되었습니다.
이전 R-CNN에서는 Selective Search로 뽑아낸 Region Proposal 후보들(2000개)을
모두 CNN 모델에 집어 넣어 굉장히 시간이 많이 걸렸는데,
이 부분을 아래와 같이 수정하였습니다.
오른쪽 그림의 SPP-net도 R-CNN의 단점을 보완했던 논문입니다.
SPPNet : Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
Fast R-CNN은 SPP-net이 가지고 있던 문제(backpropagation이 안됨)도 해결했습니다.
TMI: arxiv 기준
R-CNN은 2013년 11월에 등록된 논문,
SPP-net는 2014년 6월에 나온 논문,
Fast R-CNN은 2015년 4월에 나온 논문입니다.
Fast R-CNN도 R-CNN과 똑같이 처음에 Selective Search를 통해 Region Proposal을 뽑아내긴 합니다.
하지만 R-CNN과 다르게 뽑아낸 영역을 Crop하지 않고 그대로 가지고 있고,
전체 이미지를 CNN Model에 집어 넣은 후
CNN으로부터 나온 Feature Map에 RoI Projection을 하는 방식을 택했습니다.
즉 input image 1장으로부터 CNN Model에 들어가는 이미지는
2000장 -> 1장이 되었습니다.
2. RoI (Region of Interest) Pooling
이 Projection 한 Bounding Box들을 RoI Pooling 하는 것이 Fast R-CNN의 핵심인데요.
위 그림처럼 Projection시킨 RoI를 FCs(Fully Connected Layer)에 넣기 위해서는
같은 Resolution의 Feature map이 필요합니다.
하지만 Selective Search를 통해 구해졌던 RoI 영역은 각각 다른 크기를 가지고 있죠...
따라서 이 Resolution의 크기를 맞춰주기 위해 RoI Pooling을 수행합니다.
RoI Pooling은 간단히 말해서
크기가 다른 Feature Map의 Region마다
Stride를 다르게 Max Pooling을 진행하여
결과값을 맞추는 방법인데요,
위 그림의 박스 1개가 1개의 픽셀을 뜻합니다.
위와 같이 8x8 input feature map에서
Selective Search로 뽑아냈던 7x5 짜리 Region Proposal 부분이 있고,
이를 2x2로 만들어주기 위해 Stride (7/2 = 3, 5/2 = 2) 로 Pooling Sections를 정하고
Max pooling 하여 2x2 output을 얻어 냅니다.
----------------------------
수가 잘 나누어 떨어지는 다른 예를 들어 보면,
7x7의 output feature map을 만들기 위해
21x14 짜리 Region 에는 Stride (3, 2)
42x35 짜리 Region 에는 Stride (6, 5)
으로 MaxPooling을 하여
21/3=7 , 14/2=7
42/6=7, 35/5=7
Fixed Length Feature Vector인 7x7을 만들어 줄 수 있습니다.
잘 이해가 안 가시면 아래 사이트를 참고하면 도움이 될 것 같습니다.
https://deepsense.ai/region-of-interest-pooling-explained/
3. Classification & Bounding Box Regression
마지막으로 Fixed Length Feature Vector를 FCs(Fully Connected Layer)에 집어 넣은 후
두 자식 layer인 output layer로 뻗어 나가
Classification과 Bounding box Regression을 진행합니다.
이는 R-CNN과 비슷하게 진행 하였지만
Fast R-CNN은 Softmax를 사용하여 Classification을 진행하였습니다.
전체 구조를 다시 간단하게 정리하면
0) Input Image에 Selective Search를 진행하여 RoI영역을 미리 뽑아놓고,
1) CNN 모델에 이미지 전체를 집어넣어 Feature Map을 뽑아낸 후,
2) 뽑아놨던 RoI영역을 Feature Map에 적용시킨 후
RoI Pooling을 진행하여 Fixed Length Feature Vector를 만들어 주고
3) Fully-Connected Layer를 거쳐 두 자식 Layer를 통해
Class Prediction, Bounding Box Regression을 진행합니다.
3) 에 대한 Loss function은 아래와 같습니다.
3-2. Loss function
Fast-RCNN은 Loss Function으로 Multi-task Loss를 사용하였다고 기재되어 있는데,
R-CNN에서는 Classification과 Bbox Regression을 따로 학습했지만
Fast R-CNN에서는 아래와 같이 두 Loss를 더하여 동시에 학습하였습니다.
classfication Loss에는 Log Loss를 사용,
Bbox Regression Loss에는 Smooth L1 Loss를 사용하였습니다.
4. Contribution
논문에서 얘기하는 Fast R-CNN의 Contribution은 아래와 같습니다.
Contribution1. 뛰어난 성능
R-CNN과 SPPnet을 뛰어넘는 성능을 보입니다.
PASCAL VOC 2012 데이터를 기준으로 66%의 mAP를 얻어냈습니다.
(R-CNN은 62%)
더 자세한 성능 차이는 논문의 4. Main results를 확인해보시면 될 것 같습니다.
또한 Fast R-CNN은 지난번 R-CNN에 비해서 엄청나게 빨라진 속도를 보입니다.
하지만 오른쪽 Test Time 그래프를 보면
Region Proposal에 걸리는 시간이
전체 Test time 2.3초에서 2초 정도를 차지하는 것을 확인할 수 있습니다.
이유는, Region Proposal에 사용되는 Selective Search가
GPU가 아닌 CPU를 사용하는 알고리즘이기 때문인데,
이 문제를 Faster R-CNN에서는 해결하였습니다.
Contribution2. Single Stage Training
End-to-end로 Single Stage Training을 진행합니다.
하지만 Fast R-CNN은 Training은 Single Stage이지만
Single Stage Detector는 아니라고 보는게
Region Proposal로 Selective Search를 수행하기 때문에
(Selective Search는 CPU로 수행하며 학습되지 않음)
전체적으로는 2-Stage Detector로 보는게 맞을 것 같습니다.
그리고 위 Loss Function에서 설명한 것처럼 Multi-task Loss를 사용합니다.
Contribution3. Backpropagation 가능
모든 Computation을 Share하여 End-to-End Training을 진행합니다.
Backpropagation(역전파)이 가능합니다.
Contribution4. 저장공간 필요 없다.
R-CNN의 경우에 CNN에서 나온 Feature Map을 Disk에 집어 넣고
SVM을 진행할 때 불러오는 방식으로 진행 했었습니다.
아무래도 이미지 1개당 2000개의 Feature Map이 나오다 보니
더 큰 용량이 필요했을겁니다...
Fast-RCNN은 이와 같은 과정이 필요 없어졌습니다.
5. 단점 및 결론
FastR-CNN 논문은
R-CNN이나 SPP-net에 비하면 뛰어난 성능을 보이고
위와 같은 Contribution들을 가지고 있으며,
앞의 논문들이 가지고 있었던 많은 문제들을 해결하였습니다.
하지만 이미지 한 장당 2.3초의 Test time이 걸리는 알고리즘은
Real-time Object Detector로는 매우 역부족인 것 처럼 보입니다.
게다가 Region Proposal에 걸리는 총 2.3초 중 2초의 시간 때문에
Bottleneck이 생기는 구조입니다.
이 문제들을 해결 하기 위해
비슷하지만 다른 구조의 Faster R-CNN 논문이 나옵니다.
⊙ Faster R-CNN (NIPS 2015)
Faster R-CNN의 논문에서는, Region Proposal 방법을 GPU를 통한 학습으로 진행하면
확실히 성능이 증가할 것이라고 말하고 있습니다.
따라서 Faster R-CNN은 Deep Network를 사용하여 Region Proposal를 진행하는
RPN (Region Proposal Networks)를 소개합니다.
빨간색 부분이 Region Proposal Network입니다.
이 부분과 Selective Search를 제외하면
Fast R-CNN과 동일한 구조인 것을 확인하실 수 있습니다.
RPN의 input은 image의 Feature Map이고,
output은 Object proposal들의 Sample입니다.
한 마디로 Fast R-CNN에서 Selective Search가 했던 일을
Fast R-CNN 에서 RPN이 하는 겁니다.
이 Sample들을 Fast-RCNN과 동일하게 RoI Pooling을 한 후,
Classification, Bounding Box Regression을 진행합니다.
따라서 R-CNN, Fast R-CNN, Faster R-CNN의 구조는
아래와 같이 비교될 수 있습니다.
(Faster R-CNN의 CNNs 에서 올라간 FC가 RPN입니다.)
제가 이 논문을 처음 접했을 때, RPN이 얼추 무슨 용도이고 무엇인지는 이해가 됬지만
어떤 구조로 어떻게 학습이 되는지 잘 이해가 안갔는데,
코드를 하나 하나 뜯어보면서 좀 더 쉽게 이해할 수 있었던 것 같습니다.
따라서 Faster-RCNN을 코드 관점에서 간단하고 명료하게 설명해보고자 합니다 :)
1. RPN (Region Proposal Network)
Pretrained된 CNN을 거쳐서 나온 Feature Map은
ZFNet 기준으로 256-d
VGG-16 기준으로 512-d 를 갖게 됩니다.
이 Feature Map을 k개의 Anchor box를 통해 영역을 정하고
Classification Layer와 Bounding box Regression을 거쳐서
물체가 있는 곳을 학습하게 됩니다.
여기서 Classification Layer는 물체가 있는지 없는지만 확인하므로
Class수는 2입니다.
많은 Faster R-CNN 코드들이 VGG-16 모델을 backbone으로 사용하므로
VGG-16를 기준으로 설명하도록 하겠습니다.
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를 만들어 놓습니다.
이렇게 만들어낸 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로 둬서 신경 안쓰도록 합니다.
이렇게만 하면 Positive한 Anchor의 개수가 많지 않을 수 있기 때문에
Ground Truth Box마다 IoU가 가장 높은 Anchor 1개를 뽑아
이 또한 1(Positive)로 Labeling 합니다.
2) Prediction
50x50x512 크기의 Feature Map을 Conv layer를 한번 거치고,
1x1 conv인
bbox Regression Layer (50x50x512 -> 50x50x36)와
36은 Anchor box(9개) x bounding box 좌표(4개)
Classfication Layer (50x50x512 -> 50x50x18)을 통해
18은 Anchor box(9개) x Class 개수(2개)
Bounding box 위치와 Class(물체가 있는지 없는지)를 prediction 완료합니다.
따라서 output은 RPN Network 그림과 같이
Anchor 총 수와 맞춰서
(50x50x9x4) = (22,500 , 4)
(50x50x9x2) = (22,500 , 2)
가 됩니다.
이렇게 2)Prediction한 값으로
아까 1)에서 구했던 이미지의 1)Ground Truth Label과 함께
Loss Function을 통해 RPN을 학습하게 됩니다.
그와 동시에,
2)Prediction된 두 값 ( Class, bbox reg )은
NMS를 거쳐서 특정 개수의 RoI로 Sampling 된 후,
Fast-RCNN에 쓰이게 됩니다.
이 전의 Selective Search가 쓰였던 것 처럼 말이죠...
3) Loss Function for RPN
수식을 다 치자니 너무 귀찮아서 위와 같이 만들었습니다...
22,500개의 Anchor 중 i번째 Anchor에 대하여
위와 같이 Ground Truth(GT)와 Prediction 값을 비교하여
RPN의 Class(물체가 있는지 없는지)와 box(box의 위치)를 학습합니다.
L_cls : Classification은 Log Loss를 사용,
L_reg : Box Regression은 Smooth L1 Loss를 사용하였습니다.
GT Label이 0이라면 (background로 간주)
뒷 항에 0이 곱해져 무시되어 bbox reg이 학습되지 않습니다.
balancing weight인 𝝀와 N_cls, N_reg을 통해 두 항을 Normalize 합니다.
Bounding Box Regression은 R-CNN과 동일하게
아래 식을 따릅니다.
저자는 논문 내 3.2 Sharing Features for RPN and Fast R-CNN 부분에서
세 가지 방법으로 RPN과 Fast R-CNN을 융합하여 학습을 진행하였습니다.
많은 코드들의 구조처럼, Approximate joint training 방법에 따라,
위 식으로 구해진 RPN Loss는 후에 Fast R-CNN의 Loss와 함께 학습됩니다.
2. NMS (Non-Maximum Suppression) & RoI Sampling
위 글에서 Prediction된 box들이
Fast R-CNN에서 RoI로 작용한다고 설명하였는데요,
Prediction된 Box들에 NMS(Non-Maximum Suppression)를 거치고,
RoI Sampling을 통해 최종 RoI를 결정하기 됩니다.
NMS
Detection에서 NMS는 주로 중복되는 Bounding Box를 제거하기 위해서 쓰입니다.
많은 수의 Anchor Box끼리 겹치는 부분이 많기 때문에
한 물체에 여러 개의 Bounding Box가 생기는 것은 당연합니다.
RPN에서 2)Prediction한 box들 중에서 RoI Score로 정렬을 한 뒤,
높은 RoI Score를 가진 box와 overlapping 된 다른 box들을 지워 나가는 식으로 반복하여
Box Overlapping이 일어나지 않으면서 RoI가 높은 Box들만 남도록 하는 방식입니다.
Overlapping에 대한 Threshold는 주로 0.6에서 0.9정도를 사용합니다.
RoI Sampling
보통 Training시에 NMS를 거치면 2000개의 RoI가 남습니다.
이 중에서 Positive:Negative 비율이 1:1이 되도록 RoI를 Sampling 합니다.
256개를 Sampling한다고 치면
128개의 Positive Anchor, 128개의 Negative Anchor가 Sampling 됩니다.
만약 Positive인 Anchor가 128개가 안되면 Zero Padding을 하거나
IoU 값이 가장 높은 box를 positive로 사용합니다.
4. Fast R-CNN
이렇게 뽑아낸 RoI들은
이전 Fast R-CNN의 Selective Search가 수행했던 일을
그대로 수행하게 됩니다.
다만 Loss에 RPN의 parameter값이 추가 되겠지요.
cls_loss , box_reg_loss
5. 성능 및 결론
Fast R-CNN보다 속도, 성능이 모두 향상된 것을 확인하실 수 있습니다.
Faster R-CNN은 이 후에도 많은 2-stage detector들이 이 구조를 사용하였고,
citation이 15,000 정도 될 정도로 유명한 논문이지만
속도가 한 이미지에 0.2초 걸리면 1초에 5프레임 정도인데 (5fps)
이 Detector가 Real time Detector로 되기에는
아직은 역부족인것 처럼 보입니다.
또, RoI Pooling에서 RoI가 stride로 항상 딱 떨어지진 않기 때문에
픽셀 손실이 있을 수 있어
정교한 작업이 필요한 Object Detection 문제에는
더 좋은 방법이 필요해 보입니다.
출처 : https://arxiv.org/abs/1311.2524 (R-CNN 논문)
https://arxiv.org/abs/1504.08083 (Fast R-CNN 논문 v2)
https://arxiv.org/abs/1506.01497 (Faster R-CNN 논문 v3)
https://arxiv.org/abs/1406.4729 (SPP-net 논문)
https://brunch.co.kr/@kakao-it/66 (Kakao AI Report)
https://deepsense.ai/region-of-interest-pooling-explained/ (RoI Pooling 설명)
https://github.com/jwyang/faster-rcnn.pytorch (Faster R-CNN 코드)
https://medium.com/@fractaldle/guide-to-build-faster-rcnn-in-pytorch-95b10c273439 (Faster R-CNN 코드 설명)
'CV & ML > Object Detection' 카테고리의 다른 글
[3D Object Detection] 3D Object Detection 논문 흐름 및 리뷰 (1) | 2022.01.04 |
---|---|
[Object Detection] CenterNet (Objects as Points) 논문 리뷰 (0) | 2019.08.17 |
[Object Detection] 2. R-CNN : 딥러닝을 이용한 첫 2-stage Detector (18) | 2019.04.03 |
[Object Detection] 1. Object Detection 논문 흐름 및 리뷰 (14) | 2019.03.28 |
YOLO v3 튜토리얼을 간단히 실행시켜보자 (2) | 2018.11.01 |
- Total
- Today
- Yesterday
- MySQL
- Deep Learning
- nvidia
- GPU
- git
- Object Detection
- nerf
- Docker
- pytorch
- numpy
- java
- Novel View Synthesis
- Android
- Neural Radiance Field
- Python
- 우분투
- nginx
- Machine Learning
- GaussianSplatting
- 3Dvision
- MacOS
- SSH
- 2-stage Detector
- CUDA
- error
- vscode
- Macbook
- Anaconda
- Computer Vision
- ubuntu
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |