z [논문 리뷰] RCNN : Rich feature hierarchies for accurate object detection and semantic segmentation, 2014
본문 바로가기

Computer Vision

[논문 리뷰] RCNN : Rich feature hierarchies for accurate object detection and semantic segmentation, 2014

728x90

시작하면서..

예전에 공부했던 논문이긴한데, 그때는 완전 딥러닝 자체에 입문 단계였어서 이 논문에 대해 완전한 이해를 하지 못했었습니다. (구현도 못했음.) 그래서 Object Detection 분야에 대해 공부를 하기 전에 CNN을 이용한 object detection 모델의 조상격이라고 할 수 있는 RCNN에 대해 다시 공부하여 기초를 다지고자 논문을 공부했습니다.

Abstract

이 논문에서 제시하는 approach는 두가지 key insights를 가지고 있습니다.

  • high-capacity convolutional neural networks를 localize 및 segment object를 위해 적용할 수 있음.
  • labeled data가 부족할 때는 pretrain을 통해 극복이 가능함.

Introduction

Feature는 매우 중요합니다.
Recognition 작업에서는 visual recognition에 대한 정보를 위해서 computing features에 대해 hierarchical, multi-stage processes를 사용합니다.

recognition에서는 위의 방법들을 통해 좋은 성능을 낼 수 있었습니다. 여기에서 생각해야할 것은 그래서 이 recognition을 object detection에 어떻게 적용할 건지 입니다.

논문에서는 다음과 같은 두 problems에 대해 주목합니다.

  • Deep Network를 이용한 localizing objects
  • 적은 annotated detection data로도 좋은 성능

이 localizing에 대해서 잘 알려진 두 방법이 있습니다.

  • regression problem으로 해결 -> impractical
  • sliding window detector -> 기술적 어려움

그래서 논문에서는 첫번째 problem인 CNN localization problem을 해결하기 위해 *"recognition using regions" paradigm*을 제시 합니다.

Recognition using regions : 2000개의 독립적인 region proposal에 대해서,

  • CNN으로 고정된 길이의 vector 추출
  • SVM으로 category 분류

R-CNN : Regions with CNN features

두번째 problem인 labeled data가 scarce 할 때에 대해서도 두가지 방법이 있습니다.

  • Conventional한 방법 : Unsupervised pre-training
  • Supervised pre-training : 존재하는 dataset으로 pretrain 후 small data로 fine tuning

논문에서의 RCNN은 ImageNet으로 network architecture를 pretrain하고 PASCAL이라는 samll data로 fine tuning하는 Supervised pre-training을 사용합니다.

또, 논문에서는 Simple bounding-box regression이 잘못 정위(localize)하는 것에 대한 오류를 줄일 수 있음을 보여줍니다. 그리고 Semantic Segmentaion으로 확장 가능합니다.

Object Detection with R-CNN

RCNN에는 세 가지 module로 이루어져 있습니다.

  • 독립적인 region proposal
  • 각 위치에 대한 고정된 길이의 벡터를 추출하는 Large CNNs
  • SVM을 이용한 category classification

Module Design

Region proposals

RCNN을 이루는 첫 module인 Region proposals를 하기 위해 Selective Search 알고리즘을 이용하여 <=2k 개의 region proposals를 구합니다.
인접한 노드 (pixel)끼리의 차이를 통해서 bounding box를 만드는 알고리즘 입니다.
아래는 cv2를 이용한 Selective Search 코드 입니다.

import cv2 as cv
import sys

if __name__ == '__main__':
    image_path = ""
    img = cv.imread(image_path, cv2.IMREAD_ANYCOLOR)

    cv.setUseOptimized(True)
    cv.setNumThreads(8)

    gs = cv.ximgproc.segmentation.createSelectiveSearchSegmentation()
    gs.setBaseImage(img)


    # gs.switchToSingleStrategy()
    # gs.switchToSelectiveSearchFast()
    gs.switchToSelectiveSearchQuality()


    rects = gs.process()
    nb_rects = 10

    while True:
        wimg = img.copy()

        for i in range(len(rects)):
            if (i < nb_rects):
                x, y, w, h = rects[i]
                cv.rectangle(wimg, (x, y), (x+w, y+h), (0, 255, 0), 1, cv.LINE_AA)

        cv.imshow("Output", wimg);
        c = cv.waitKey()

        if (c == 100):
            nb_rects += 10

        elif (c == 97 and nb_rects > 10):
            nb_rects -= 10

        elif (c == 113):
            break

    cv.destroyAllWindows()

Feature extraction

위의 Selective Search를 통해서 나온 Region proposals들을 CNN architecture에 넣어줍니다. 하지만 CNN architecture (논문에서는 AlexNet)은 input size가 224x224라서 region proposals를 넣기 전에 Warping이라는 과정을 통해 size를 맞춰줘야 합니다.
warping된 region proposals를 cnn architecture에 넣어줘서 feature extraction 합니다.

Test-time detection

이 부분에서는 RCNN이 효율적인 이유가 나옵니다. 두가지가 있는데,

  • CNN 파라미터가 모든 categories에 대해 공유됨
  • feature vector는 low dimensional

저도 이 부분이 너무 당연한 말이라서 받아들이기 힘들었는데 이 논문이 처음으로 CNN을 이용해서 Object Detection 했기 때문에 CNN이 아닌 다른 모델들과 비교했다고 생각한다면 받아 들일 수 있으실 것 같습니다.

Training

Supervised pre-training

auxiliary dataset(ILSVRC 2012, ImageNet)으로 pretrain 합니다.

Domain-specific fine-tuning

warped region proposal을 통한 fine tuning을 합니다.
여기에서 auxiliary dataset인 ImageNet은 1000개의 class를 가지고 있는데, fine-tuning에 사용된 dataset에 맞춰서 class를 다시 정해줘야 합니다.
N+1개 : Background class를 추가해줘야 한다.

각 region proposals에 대해서 ground-truth box에 대해 IoU가 0.5 이상이면 Positive, 0.5 미만이면 Negative로 분류합니다. (background)

Object category classifiers

object detection에서는 negative에 대한 지정을 잘 해주는 것이 중요합니다.

category classification 할 때, IoU overlap threshold를 0.3으로 줘서 0.3 보다 작으면 background, Negative라고 판별합니다. (validation set에 대해서 threshold를 {0, 0.1, ... , 0.5}로 주고 실험했었는데, 0.3일 때 성능이 제일 좋았음.)

그리고 추출된 features에 대해서 training labels는 SVM으로 갑니다. (SVM을 이용하여 classification을 수행)

Visualizing, ablation, and modes of error

Visualizing learned features

first-layer filters, first features는 직관적으로 visualized 될 수 있고 이해하기 쉽습니다.(oriented edge, opponent colors)
하지만 layer가 깊어지면서 차후의 layer에 대해서 이해하기 더 어려워집니다.
그래서 이 논문에서는 non-parametric method를 이용합니다.
non-parametric method로, non-maximum suppresion을 사용하는데, 이는 가장 스코어가 높은 bounding box를 제외하고 다 삭제하는 것 입니다.

Ablation studies

performance layer-by-layers, without fine-tuning

fine-tuning를 제외하고 CNN architecture의 마지막 세 레이어(pool5, fc6, fc7)를 확인해봤을 때 fc6, fc7이 없어져도 괜찮은 성능을 냄을 알 수 있었습니다.
이를 통해 fc가 아닌 CNN 자체에 힘이 있음을 알 수 있습니다.

Performance layer-by-layer, with fine-tuning


위의 Table2를 보면, fine-tuning 했을 때 성능이 더 좋았음을 알 수 있습니다.

Network architecture

Network Architecture의 선택이 object detection 성능에 영향을 크게 줍니다.
논문의 전반적인 설명이는 AlexNet을 사용했는데 가장 성능이 잘 나온 Network Architecture는 VGG16이라고 합니다.

Bounding-box regression

localization error를 줄이기 위해서 논문에서는 Bounding-box regression을 사용했습니다.
pool5의 output을 기반으로 predict하기 위해 선형회귀 모델을 적용했습니다.

SVM 결과에 대한 scoring 후 Bounding-box regression을 진행합니다.
CNN의 pool5 layer에 대해서 feature을 얻고 이를 통해 Bounding box를 예측합니다.

\({(P^{i},G^{i})}_{i=1, .. ,N}\) : training pairs
\(P^{i}\) : Selective search를 통한 Region proposals
\(G^{i}\) : Ground truth

training 할 것은 P를 G에 mapping하는 transformation이다.

\(d_{x}(P),d_{y}(P),d_{w}(P),d_{h}(P)\) : transformation (Linear function)

x,y는 bounding box의 중앙 좌표, w,h는 bounding box의 너비 높이이다.


표기상 \(\phi\) = \(d_{*}(P)\)

아래와 같이 Ridge Regression을 사용합니다. 여기에서 \(\lambda\)가 굉장히 중요한데 (Regularization이 굉장히 중요함), 논문에서는 1000으로 지정합니다.

근데 여기에서 조건이 있는데, Bounding-box regression을 진행하기 위해서는 ground truth와 transformation 된 box 끼리 near 해야합니다. 그래서 Bounding-box regression을 진행하기 전 IoU 0.6 이상인지 확인 해줍니다.

마치면서..

RCNN에 대해 간략하게 정리해보았습니다. pretrained VGG16를 사용하면 어떻게 구현을 할 수 있을거 같긴 한데 일단 한번 해봐야할 것 같습니다 ㅜㅜ,, 이제 이 RCNN 구현(못하겠음..)하고 Object Detection의 최근 탑컨퍼 논문을 읽어보려합니다. 어려울진 모르겠지만 꾸준히 공부해서 공유해보겠습니다 !

728x90