Review: Cascade R-CNN: Delving into High Quality Object Detection

Brian Jaehong Aum
Lunit Team Blog
Published in
15 min readJun 5, 2020

이 포스팅은 루닛 블로그에 2018년 8월에 올렸던 포스트입니다.

원문 링크: https://blog.lunit.io/2018/08/13/cascade-r-cnn-delving-into-high-quality-object-detection/

이번 CVPR 2018에서 소개된 논문 중에, 기존의 R-CNN 계열의 object detector의 약점을 잘 파악하고, 간단한 방법으로 이를 개선하여 R-CNN의 성능을 크게 높인 논문이 있어서 소개드립니다. 학계를 살펴보면 막상 복잡한 방법을 적용하고도 성능 향상은 미약한 결과를 보여주는 논문들도 많이 있는데, 이 논문은 문제점을 잘 파악하기만 하면 어렵지 않게도 문제를 아주 효과적으로 해결할 수 있다는 것을 보여준것 같습니다.

  • Zhaowei Cai, Nuno Vasconcelos, Cascade R-CNN: Delving into High Quality Object Detection, CVPR 2018

이제 구체적으로 이 논문이 어떻게 문제를 해결했는지 소개드리기에 앞서 일단 R-CNN이 무엇인지를 소개드리기 위해 2015 ICCV 에서 소개되었던 Faster R-CNN을 간략히 소개드리도록 하겠습니다.

Faster R-CNN

R-CNN은 2013년에 최초로 Ross Girchick에 의해 소개되었습니다. R-CNN 방식은 2 stage 구조를 가집니다. 첫번째 stage에서는 영상 내에는 물체가 존재하는 위치는 Region of Interest (ROI)를 추정합니다. 두번째 stage에서는 ROI에 존재하는 물체가 어떤 물체 인지를 CNN을 이용해 판단합니다. 이때 첫번째 stage는 region proposal 단계라고 불리고 두번째 stage는 classification 단계로 불립니다.

초창기에는 region proposal 단계와 classification 단계가 분리되어 있었습니다. 예를들어 region proposal 단계에서는 felzenszwalb segmentation과 같은 전통적인 image processing 기법을 활용해 물체가 있을법한 위치들을 추정하고, classification 단계에서는 CNN을 통해 해당 위치를 분석하는 방식이었습니다. 하지만 Faster R-CNN 부터는 이 모든 과정이 하나로 묶였고, RCNN 계열의 근간이 되었습니다.

Faster R-CNN은 하나의 Backbone network에서 해당 하는 커다란 네트워크가 있습니다. 이 네트워크는 주어진 영상의 features를 CNN을 통해 추출하는데 사용됩니다. 이렇게 추출된 features는 1차적으로 Region proposal을 얻는데 사용 되고, 이후에 classification 단계에서는 이전에 주어진 Region proposal을 기반으로 앞서 주어졌던 feature에서 해당 영역들의 feature를 모아서 classification 단계를 거쳐 최종 결정을 내리게 됩니다. 이를 간략히 그림으로 표현하면 아래와 같습니다.

가장 왼쪽은 전체 구조를 나타냅니다. I 영상이 들어왔을때 Conv 단계에서 VGG, ResNet 과 같은 네트워크가 영상의 features를 추출하고, RPN (region proposal network)가 물체가 있을만한 지역들을 사각형의 Bounding Box (BB)의 형태로 추천해 줍니다. 그리고 해당 BB가 지정하는 위치의 feautres를 pooling을 해서 (ROI Pooling) 해당 위치의 물체가 어떤 물체인지를 classifier가 분간하고 한번 더 정확한 BB를 추정합니다. 위 그림에서 가운데는 이 과정에 대한 도식이고, 오른쪽은 어떻게 ROI pooling이 이루어져서 classifier에 해당하는 fully-connected layer에 전달되는지에 관한 간단한 도식입니다. 여기서는 간단하게 R-CNN이 어떤 구조를 갖는지만 알려드리기 위해 많이 간소화 했지만 더 자세하게 알고자 하시는 분은 Lunit blog 내의 R-CNN tutorial을 참고해 주시기 바랍니다.

Effects of different IoU values for training classifier from R-CNN

위의 예시에서 Classifier는 ground truth (GT)로 주어진 위치에서 해당 물체가 무엇인지를 판단하라고 하면 자전거탄 여자라고 판단을 해야 할 것입니다. RPN이 만약 정확하게 GT와 동일한 위치의 BB를 추천해 준다고 하면 classifier는 상대적으로 어렵지 않게 위 영역은 자전거탄 여자라고 판단할 것입니다. 하지만 실체 상황에서는 GT를 모르는 상황에서 RPN이 정확하게 GT와 동일한 BB를 추천해주지는 못합니다. 따라서 classifier를 학습시키는 단계에서 RPN이 주는 BB에서 만약 GT의 BB와 비교해서 IoU를 기준으로 0.5를 넘으면 이는 자전거탄여인으로 분류하도록 학습 시킬 수 있고, 만약 그보다 낮으면 background라고 판단하도록 학습 시킬 수 있다.

이렇게 학습시킬 경우 만약 RPN이 정확한 BB을 추정해 내지 못하더라도 상대적으로 classifier는 robust하게 이는 자전거탄 여인이라고 판단 할 수 있을 것이다. 일반적으로 위에서 언급한 IoU 기준 0.5는 R-CNN 기반 모델을 학습시킬때 자주 사용되는 hyperparameter입니다. 일반적으로 이정도 값을 이용해서 학습시킬때 Object detector의 성능을 판한다는 MS COCO datase 상에서 좋은 성능을 보여준다고 합니다. 하지만 IoU 기준 0.5는 대강 BB가 GT와 절반정도만 걸쳐 있어도 이를 Positive sample로 판단하게 만들고, 이에 따라 false positive를 띄울 위험이 있습니다. 그렇다면 아래 그림을 통해 서로 다른 IoU 기준을 사용해서 classifier를 학습시켰을때의 변화를 살펴보도록 하겠습니다.

위 그림의 (a)와 (b)를 살펴보면 먼저 언급한것과 같이 IoU 기준이 더 낮았던 (a)의 경우 false positive가 많이 나오는 것을 확인 할 수 있습니다. 그렇다면 IoU 기준을 높이는 것이 반드시 좋은 것은 아닙니다. (d)를 살펴보면 IoU를 높여두고 학습시켰다고 해서 반드시 더 좋은 성능을 보장하는 것이 아님을 알 수 있습니다. 이제 ©를 살펴보도록 하겠습니다. ©는 Input으로 주어지는 BB의 IoU가 서로 다를때 각각의 IoU 기분 0.5, 0.6, 0.7 로 학습시킨 classifier가 만들어낸 BB의 정확도를 표현한 것입니다. 당연한 결과 같지만 Proposed 된 BB가 부정확한 경우에는 IoU 0.5가 좋은 성능을 보여주었고 반대로 Proposed 된 BB가 정확하면 정확할수록 더 높은 IoU를 기준으로 학습시킨 모델이 더 좋은 성능을 보여주었습니다.

이를 통해 볼때, 우리는 다음과 같은 생각을 해 볼 수 있습니다. 지금보다 더 좋은 Proposal을 만들어 낼 수 있다면, classifier의 성능을 올라갈 것이고, 추가적으로 classifier를 학습시킬때도 더 높은 IoU 값들을 기준으로 학습시킨다면 더욱더 성능이 올라갈 것입니다. 이와같은 가정을 해보면 사실 우리는 당장에서 더 좋은 proposal을 얻을 수 있는곳이 있습니다. 바로 classifer가 만들어내는 BB입니다. 위에서 ©그래프를 보면 IoU가 낮은 BB가 주어졌을때, classifier가 만들어내는 BB는 훨씬더 주어진 BB보다 IoU가 훨씬 더 높다는 것을 확인 할 수 있습니다. 이 논문은 이 관찰에 기반해서 Cascade R-CNN 구조를 제안합니다.

Cascade R-CNN

기존의 Faster R-CNN이 1개의 classifier만을 사용했다면, cascade R-CNN은 추가적인 n개의 classifier를 사용합니다. 해당 classifiers는 순차적으로 이전의 classifier가 만들어낸 BB를 받아서 새로운 classification task를 수행하고 거기서 또 만들어지는 BB는 그 다음에 오는 classifier가 classification task를 수행하는데 사용됩니다. 이러한 과정 중에 각각의 단계에서 만들어내는 BB는 점점 더 정확할 것이라는 가정을 하고, 그 다음 단계의 classifier는 이전 단계보다 더 높은 IoU를 기준으로 학습을 시켜 둠으로써 성능을 극대회 시키는 방법을 제안한 것입니다. 이에대한 효과는 뒤에서 후술하고, Cascade R-CNN의 효과를 비교하기 위해 이전에 비슷한 직관을 가지고 있었지만 Cascade R-CNN과는 다른 접근 방법을 제안했던 방법 2 가지를 소개해 드리도록 하겠습니다.

첫번째 방법은 faster R-CNN과 마찬가지로 하나의 classifier만을 학습시켜 두고 이를 test 시에 iterative하게 활용하는 방법입니다. 이는 위 그림에서 (b)에 표현되어 있는데, 일단 input 영상이 들어가고 RPN을 거쳐 classifier가 BB를 만들어내면 이 BB는 RPN이 만들어낸 BB보다 더 정확하게 예측한 BB라고 기대할 수 있습니다. 그래서 동일한 classifier에 이전에 본인이 예측한 BB를 이용해 다시 한번 classification을 수행하면 좀 더 정확하게 classification task를 수행 할 수 있을 것이라는 기대를 할 수 있습니다. 이 방법은 실제로 성능향상을 보여주니는 하나, 상대적으로 극적인 효과를 보여주지는 못한다고 합니다. 또 2번 이상에 iteration은 성능 향상에 도움을 주지 못했다고 합니다.

두번째 방법은 위 그림에서 ©에 해당하는 방법입니다. RPN이 한번만 proposal을 하는 대신에, 그때의 proposal이 어떤때는 더 정확했을 수 있고, 어떤 때는 상대적으로 부정확했을 수도 있기 때문에, 서로 다른 classifier를 각각의 IoU 기준마다 학습을 시키고 test 시에는 최종적으로 모든 classifier가 만들어낸 결과들을 ensemble하는 방법입니다. 이 역시도 성능 향상을 보여주기는 했으나, 여전히 proposal이 정확하지 않을 수 있다는 문제점은 그대로 남겨주었기에 성능향상이 두드러 지지는 않았습니다.

그렇다면 위 두 가지 방법과 비교해 새롭게 제안한 Cascade R-CNN은 과연 얼마나 큰 성능 향상을 보여주었을지 살펴보도록 하겠습니다.

Result

Performance comparison with the previous methods

여기서의 모든 성능 검증은 MS COCO dataset을 활용했습니다. 여기서 Cascade R-CNN은 3개의 classifier를 사용해서 학습되었고, 모든 학습과정은 end-to-end로 한번에 학습되었습니다. 각각의 classifier는 각각 IoU 기준 0.5, 0.6, 0.7 로 학습되었습니다. Integral Loss 방법도 마찬가지로 3개의classifiers를 학습시킬때 위와 동일한 IoU 기준을 사용했습니다. 아래 테이블을 보도록 하겠습니다.

여기서 사용된 FPN+ baseline은 Faster R-CNN모델을 이용하는데 있어서 backbone 네트워크로써 Feature pyramid network를 이용했고 FPN+ 에서 +의 의미는 Mask R-CNN에서 소개되었던 ROI align이라는 pooling 방식을 적용했다는 의미입니다. 자세한 사항은 링크의 논문을 참고 부탁드립니다. 위 결과를 살펴보면 기존의 방법들은 근소한 수준으로 성능을 올렸지만 Cascade R-CNN의 경우에는 훨씬더 큰 폭의 성능 향상을 보여줌을 확인 할 수 있습니다. 특히나 AP80 이상에서의 성능향상이 크게 두드러졌습니다.

Analysis on cascade R-CNN

Cascade R-CNN의 각각의 classifier가 만들어내는 결과를 살펴보면 classifier를 거치면 거칠수록 AP80이상에서 확실히 성능이 올라감을 볼 수 있습니다. 그러나 3번째 stage를 살펴보면 오히려 AP50의 경우에는 성능이 약간 저하되는 것을 볼 수 있는데, 이는 1번째 stage의 경우에는 robust하게 다양한 물체들을 모두 검출하려 하는 반면에 3번째는 더 정확하게 검출하려 하다보니 경우에 따라서는 놓지는 때가 생겨서 그런 것이 아닐까 추측해 봅니다. 때문에 3번째 Cascade R-CNN을 통해 가장 좋은 성능을 얻기 위해서는 최종 stage의 결과만을 사용 하는 것이 아니라, 첫번째부터 마지막까지의 stage에서 만들어낸 결과를 ensemble하면 가장 좋은 성능을 얻을 수 있었다고 합니다.

그렇가면 혹시 4번째 더 높은 IoU로 학습되어있는 classifier를 이용하면 어떨까요. 여기서는 4번째 classifier를 IoU 기준 0.75로 학습시켜 보았다고 합니다. 결과를 보면 아쉽게도 3개 이상을 쌓는다고 해서 더 큰 성능 향상을 기대하기는 어려운 것 같습니다.

위 테이블은 추가적인 실험 결과에 대해 분석하기 위한 테이블입니다. 일단 IoU를 순차적으로 올리지 않은 가장 위의 결과만 보면 baseline의 34.9 보다 높고 Iterative box나 Integral loss의 35.4 보다도 높은 것을 확인할 수 있습니다. 그리고 추가적으로 IoU 기준을 순차적으로 올리자 성능이 한번 더 뛰는 것을 확인 할 수 있습니다. 여기서 stat이라고 불리는 부분은 앞에서 제가 설명하지 않은 부분인데, 설명 드리기는 하겠으나, 너무 세세한 부분이라 복잡하다고 느껴지시는 분들은 이 다음 테이블로 바로 넘어가셔도 좋을 것 같습니다. Faster R-CNN과 같이 BB를 추정하는 모델의 경우 BB를 추정하는 파라미터를 학습 시킬때 smoothed L1 loss를 사용하게 되는데, 이때 각 좌표값을 normalize 시켜주지 않고 학습을 시키면 자칫 학습이 제대로 이루어 지지 않는 문제가 발생 할 수 있습니다. 때문에 Loss 업데이트시 좌표 값을 미리 normalize해주게 되는데, 위에 표에서 표시시 된 stat의 경우 첫번째 stage에 비해서 이후에 오는 stage는 정확한 좌표값을 더 정확하게 추정하는 단계라는 사실을 기반으로 이들을 서로 같은 기준으로 normalize 시켜주는 대신에 각각의 단계에서의 mean, variance를 기준으로 다르게 normalize 시켜주면 각각의 stage가 더 잘 학습된다 라는 내용입니다. 이를 적용했때에도 성능이 향상됨을 위 테이블에서 확인할 수 있습니다. 그리고 최종적으로 이 둘 모두 적용하였을때, 우리가 앞서 볼 수 있었던 수치인 38.9가 나오는 것을 볼 수 있습니다.

Comparison with state-of-the-arts object detection models

논문상에서 가장 뛰어난 성능의 모델들과 비교한 결과를 살펴보도록 하겠습니다. 막상 챌린지 리더보드에서 MS COCO로 가장 높은 성능을 낸 결과들을 보면 수치가 50을 넘어가는 경우도 있으나, 이들은 여러 모델들을 앙상블한 결과로써 아래 수치와는 차이가 있을 수 있습니다. 아래는 단일 모델만으로 보여준 성능입니다. Cascade R-CNN이외의 모델들은 IoU 기준을 0.5로 두었습니다.

여기서 Cascade R-CNN이 42.8로 위에서의 38.9와 다른 이유는 위에서는 상대적으로 얕은 ResNet-50 모델을 backbone으로 사용했었고, 여기서는 비교 네트워크들과 같게 ResNet-101을 사용함에 따른 수치 향상입니다. 테이블에서 살펴보면 모두 최근에 발표된 상당히 뛰어난 모델들이지만 Cascade R-CNN에 비해서 성당히 뒤쳐지는 성능을 보여줍니다. 특히나 Fatser R-CNN+++ 와 G-RMI는 COCO challenge의 winner 모델이고, Mask R-CNN이나 Faster R-CNN with FPN의 경우 지금도 가장 성능 좋은 방식 중의 하나임에도 불구하고 수치 차이가 상당히 많이 나는 것을 확인 할 수 있습니다.

그렇다면 Cascade R-CNN 구조는 다른 모델에 적용해도 위와 동일하게 성능향상을 가져갈 수 있는 방식인지 살펴보도록 하겠습니다.

위는 다양한 방식의 R-CNN기반 object detection 방식들입니다. 모든 경우에서 cascade 구조를 가져갔을때 성능향상이 크게 있었고, 오버헤드의 증가는 크지 않음을 확인할 수 있습니다.

Conclusion

Cascade R-CNN에 대해서 살펴 보았습니다. 연구자의 입장에서는 이러한 관찰을 통해 어떻게 접근을 했나하는 저자의 직관을 참고해볼만한 논문이었던 것 같습니다. 또 간단한 방법으로 상당히 좋은 성능을 내는 방식이었기에 당장에 성능향상을 필요로 하시는 분들은 바로 한번쯤은 적용해 볼만 하신것으로 보입니다. 그러나 개인적인 의견으로는 사용하시는 분에 따라서 이 방법을 적용하기에 앞서 재고해 볼 부분이 있는것 같습니다. 위 결과들을 보면 Cascade 구조를 이용했을때 AP80 이상에서 성능이 두드러졌는데, 이는 사실 대상이 있는지 없는지의 사실 여부 보다는 대상의 위치를 더욱 정확하게 추정함으로써 수치가 올라갔던 것이라고 추정해 볼 수도 있습니다. 하지만 경우에 따라서는 대상 위치 보다는 대상이 영상 내에 존재하는지 여부 만이 중요한 경우도 있고, 또 데이터셋에 따라서 대상의 위치 정보가 상당히 부정확하게 표현되어 있는 경우도 있을 수 있습니다. 이와 같은 경우에서는 Cascade R-CNN을 적용 한다고 하더라도 기대하는 것 만큼의 큰 성능 향상이 있을지는 불명확할 수 있다고 여겨집니다.

--

--

Brian Jaehong Aum
Lunit Team Blog

Ph.D in Computer Science. Working at Lunit since 2017. Former deep learning research scientist. Current product manager.