안녕하세요~
이번글에서는 Fast RCNN의 업그레이드 버전인 Faster RCNN에 대해서 알아보도록 할거에요~
<1. Motivation>
Fast RCNN은 SPP-Net과 RCNN의 시간을 굉장히 감소시켰을에도 불구하고 아직도 realtime을 수행하는데 어려움이 있었습니다. Real-time을 수행하려면 "1/30초 = 30 fps"가 소요되어야 하는데 2.3초는 realtime을 수행하는데 큰 무리가 있어요. 그런데 자세히보면 region proposal을 수행하는시간이 전체 Fast RCNN을 수행하는데 대략 87(=(2.3-0.32)/2.3)%나 차지하고 있어요.
<사진1>
Fast RCNN의 region proposal 방식인 selective search는 Fast RCNN 네트워크 내부에 있는게 아니에요. 예를들면, CNN을 통해 feature map을 추출하면 region proposal을 적용해 RoI를 추출해야 하는데 이때 selective search는 외부에서 계산된 관련정보를 Fast RCNN 네트워크에 있는 feature map에 전달해주어 RoI pooling을 적용하게 되는거에요.
외부에서 들어오는것이기 때문에 문제가 되는것도 있지만, selective search 자체는 cpu에서 계산되기 때문에 시간소요가 굉장히 많아요. 그렇기 때문에 selective search와 같은 region proposal 방식을 바꿔주어야 할 필요성이 제기되었어요.
<사진2>
<2. Architecture>
Faster RCNN의 구조는 Fast RCNN과 유사해요. 단지 region proposal 방식이 selective search 방식에서 region proposal network (RPN) 방식으로 바뀐것 뿐이에요. 그래서 Faster RCNN 구조에서는 다른 부분은 크게 언급하지 않고 RPN이 어떻게 동작하는지를 살펴보도록 할거에요.
1) Region Proposal Network (RPN)
Faster RCNN에 CNN을 이용할때 VGGNet과 ZFNet을 이용하는데요. 여기에서는 ZFNet을 기준으로 RPN이 동작하는 방식을 설명드릴게요.
① CNN을 통해 추출한 feature map 13x13x256에 3x3x256 conv filter를 적용한다.
② 3x3영역을 기준으로 center 지점에서 9개의 anchor box를 생성한다 (13x13 feature map을 기준으로하면 13x13x9 개의 anchor가 생성됨). 하나의 3x3 conv filter 영역에서 output으로 나오는 연산량은 256x9 이다.
③ 9개의 anchor 각각에 대해서 object가 포함되어 있는지 아닌지에 대한 classification 작업이 진행된다. 주의할점은 anchor내의 class가 무엇인지 classification하는게 아니라 객체인지 아닌지 classification을 하는작업이다. 이 작업을 마치면 output으로 나오는 연산량은 256x9x2 이다 (2= object or non object)
④ 9개의 anchor 각각에 대해서 bounding box regression을 한다. 이때 좌표정보로 4개의 요소 (x,y,높이,넓이)가 사용되기 때문에, 이 작업을 마치면 output으로 나오는 연산량은 256x9x4 가 된다.
⑤ Classificaton(object인지 아닌지)과 bounding box regression은 동시에 수행되므로 RPN의 loss function은 아래와 같이 더하기 연산으로 진행된다. 그렇기 때문에 하나의 3x3 conv filter 영역으로부터 생성되는 최종 output 파라미터수(연산량)는 256x9x2+256x9x4 가 된다.
(loss function에 대한 자세한 설명은 뒤에서 할게요~)
대략적으로 아래와 같은 매커니즘을 갖고 연산이 진행되는거 아닌가라는 생각이 들어요. (더 자세한건 코드를 봐야겠지만요)
2) Translation Invariant Anchor and Multi-scale anchors
이부분은 MultiBox라는 모델에 대한 이해가 있어야 해요. 하지만 간단히 설명하면 '객체의 translation 이동이 anchor box가 이동한 객체를 찾는데 영향을 미치진 않는다' 정도로 이해하고 있으면 될 것 같네요.
<사진3>
또한 RPN의 anchor box의 특징으로는 3 different size, 3 different aspect ratio 를 적용하여 다양한 9개의 anchor box를 제공하고 있어요. 그래서 좀 더 정확한 localization 성능을 얻을 수 있게 된답니다.
<사진4>
이러한 RPN 방식을 통해서 selective search (ss) 방식보다 더 적은 RoI를 추출할 수 있게되어 시간도 굉장히 절약했고, mAP 조차도 더 높게 나왔다는 것을 볼 수 있습니다.
<사진5>
<3. Training>
먼저 RPN에서도 학습을 시키기전에 positive example과 negative example을 나누게 되는데요. Feature map 위에는 객체정보가 담긴 여러 ground truth가 있을거에요. 위의 RPN 동작 방식에서 설명드릴것 처럼 feature map위에서 3x3 conv가 이동하면서 여러 anchor들을 생성하게 되는데, 보통 하나의 ground truth 위에 여러 anchor들이 생겨날거에요. 이 중에서 IoU가 높은 순서대로 positive example에 넣고, 0.3 이하는 negative example이라고 설정합니다. (0.7 이상으로 positive example을 삼을 수 있긴한데, 만약 어떤 ground truth위에 생성된 anchor들이 대부분 0.7 미만이면 positive example이 없을 수 도 있기때문에 이런 방식은 쓰지 않았다고 해요)
아래 방식은 미니 배치 방식으로 학습시키는 RPN loss funciton을 나타내고 있어요.
의미는 RCNN, Fast RCNN의 bounding box regression가 같다고 볼 수 있고 단지 배치단위로 normalization한것만 추가 되었다고 보시면되요 (논문에서는 이런 normalization 효과가 크지 않은거 같다고 이야기 하기 때문에 그냥 RCNN, Fast RCNN에서 쓰이는 bounding box regression을 그대로 가져 왔구나 생각하시면 될거 같아요).
i: index of an anchor in a mini-batch
pi: the predicted probability of anchor i being an object
p*i: Ground truth label is 1 if the anchor is positive, 0 negative
ti: vector representing the 4 parameterized coordinates of the predicted bounding box
t*i: ector representing the 4 parameterized coordinates of the ground truth box (associated with positive anchor)
Lcls: log loss over two classes (object vs not object)
Lreg: smooth function (same with Fast RCNN Lreg) <- if p*i=0, disabled
Ncls: Mini-batch size = 256
Nreg: Nreg~2400 = the number of anchor locations
1) Sharing Features for RPN and Fast RCNN
Faster RCNN은 RPN+Fast RCNN 의 조합이라고 할 수 있어요.
하지만, 처음부터 RPN을 처음부터 Fast RCNN 네트워크에 내장시켜 학습을 시키는건 아니에요.
처음에는 RPN과 Fast RCNN을 분리해서 학습을 시켜요.
① Pre-trained CNN model (M0)을 가져와서 RPN을 ImageNet 데이터로 학습을 시킨다. (학습된 RPN=M1)
② 학습된 RPN (M1)에서 RoI(P1)을 추출한다.
③ Pre-trained CNN model (M0)와 RPN에서 학습된 RoI(P1)을 적용시켜 Fast RCNN를 학습시킨다. (M2=학습된 Fast RCNN)
(1~3번 과정 모두 CNN이 학습이 됨)
<사진6>
④ 학습된 Fast RCNN(M2)를 이용해 RPN을 다시 학습시킨다. (재학습된 RPN=M3)
(실제로는 Fast RCNN과 RPN은 독립적으로 학습이 됨, 하지만 이때부터 CNN은 따로 학습시키지 않음. 즉, Fast RCNN에서 사용되는 CNN을 그대로 가져와서 RPN에 적용시키는 꼴 -> feature map에서 region proposal network로 가는 filter들만 학습 -> CNN을 share하게 됨)
⑤ 재학습된 RPN에서 RoI(P2)를 추출한다.
⑥ 추출된 RoI(P2)와 재학습된 RPN(M3)을 다시 Fast RCNN에 학습을 시킨다.
CNN을 share하고 있는지 없는지에 대한 차이만 존재할 뿐 1~3번과 4~6번의 작업은 동일하다고 보시면 되요.
<사진7>
<4. Result>
지금까지 Faster RCNN을 알아보았어요. Faster RCNN 역시 RCNN 계열 (RCNN-Fast RCNN-Faster RCNN)로써 좋은 성능을 보여줬는데요. Test time을 0.2초로 줄였음에도 불구하고 아직도 real-time을 가능하게 했다고 말할 수준은 아닌거 같아요 Real-time: 1/30초 = 0.03초).
그래서 다음글에서는 real-time performance를 가능하게 한 RCNN 계열이 아닌 YOLO라는 object detection 모델에 대해서 소개할게요!
[논문 레퍼런스]
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks/ Ross. G. et al/ 2016/ https://arxiv.org/pdf/1506.01497.pdf
[사진 래퍼런스]
사진1,6,7
https://www.youtube.com/watch?v=kcPAGIgBGRs
사진2
사진3
https://www.onlinemathlearning.com/reflection-rotation.html
사진4
http://incredible.ai/deep-learning/2018/03/17/Faster-R-CNN/
사진5
'Deep Learning for Computer Vision > Object Detection (OD)' 카테고리의 다른 글
10. YOLO V2 (4) | 2020.02.06 |
---|---|
9. YOLO V1 (4) | 2020.02.06 |
7. Fast RCNN (2) | 2020.02.06 |
6. SPP Net (2) | 2020.02.05 |
5. RCNN (0) | 2020.02.05 |