Deep Learning/CS231N

[CS231N] Object Detection의 종류 (R-CNN, SPPnet, Fast R-CNN, Faster R-CNN, YOLO까지)

언킴 2021. 7. 19. 20:24
반응형

Contents

     

     

     

    Detection

    Object detection은 Localization과 비교해서 다양한 object들에 class분류와 위치를 파악해야되기 때문에 쉽지않은 문제다. object detection을 수행하기 위해서는 객체의 Region proposals을 찾아주는 작업이 필요하다. Region proposals을 찾아주기 위한 방법으로 Selective Search가 있다. Selective Search는 객체인식을 위한 후보 영역을 알아낼 수 있는 방법을 제공하는 것을 목표로 한다. Selective Search는 Exhaustive search(모든 객체의 위치를 찾아내는 것)와 Segmentation 방식을 결합하여 보다 뛰어난 후보 영역을 선택하는 것이다. 

     

     

    Segmentation을 할 때 주의해야할 점은 아래의 그림으로 확인할 수 있다. (a) 그림은 각 영상이 계층적인 구조를 가지고 있음을 보여준다. (b) 그림은 무늬는 같지만 색이 다른 고양이를 구분해야되는 부분이고, (c) 그림은 카멜레온과 나무의 색으로 구별하기 어려워 무늬로 구분해야하는 것이며, (d)의 그림에서 자동차 바퀴는 자동차와는 이미지가 다르지만 자동차와 같은 부분으로 구분을 해주어야 한다는 주의사항이 있다.

     

     

    아래의 그림은 Selective Search의 과정이다. 입력 이미지에 대해 각각의 개체가 한 개의 영역에 할당될 수 있도록 많은 양의 초기 영역을 생성한다. 그 다음 탐욕 알고리즘을 사용해 여러 영역으로부터 가장 비슷한 영역을 고르고 이것들을 조금 더 큰 영역으로 통합을 하면서 영역의 개수를 줄이고 통합된 영역들을 가지고 후보 영역을 만들어내게 된다. 

     

     

     

     

     

     

    R-CNN

    R-CNN은 입력 이미지가 있으면 selective search를 이용해 약 2000개의 후보 영역을 선정한다.  선정된 후보 영역별로 AlexNet을 적용시키기 위해서는 똑같은 사이즈로 맞춰주어야 하기 때문에 해당 영역을 crop이나 warp를 통해 똑같은 224x224 크기로 만들어준다. AlexNet으로 인가하여 최종 출력에서 해당 영상을 대표할 수 있는 CNN feature vector를 생성한다. 그 후 linearSVM을 통해서 해당 영역을 분류한다.

     

     

     

    obeject detection에서 평가지표로 쓰이는 Mean average precision(MAP)은 각각의 class에 대한 정확도를 구한 다음 그것들의 평균을 나타내는 것을 의미한다. R-CNN은 region에 기반한 CNN feature를 사용하여 detection 성능을 크게 개선했지만 다음과 같은 문제점이 발생한다.

     

    1. AlexNet의 구조를 그대로 사용하기 때문에 입력 이미지 자체를 224x224 크기로 맞추기 위해 Warp이나 crop을 사용했는데 이로 인해 성능 저하가 발생할 수 있다. 

    2. 2000여개의 각각의 후보 영역에 대해 순차적으로 CNN을 수행해야되기 때문에 Run time이 길다. 

    3. 후보 영역 선택이나 SVM 튜닝이 GPU를 사용할 경우 적합하지 않다.

     

     

     

     

    SPPnet

    R-CNN의 단점은 R-CNN에서 2000개의 bbox를 뽑으면 2000개의 이미지 혹은 패치를 모두 CNN에 통과시켜야 된다. 우리가 CNN을 2000번 돌려야 하나의 이미지가 돌아가는 것이다. 그렇기 때문에 CPU에서는 하나의 이미지가 처리되는데에만 1분이라는 시간이 소요된다.

     

    위와같은 R-CNN의 단점을 개선해서 나온 모델이 2014 ILSVRC의 detection에서 2위, classification에서 3위를 차지한 SPPnet 모델이다. SPPnet은 2천번의 연산이 아니라 단 한번의 CNN을 통해 계산하자는 의미로 제안되었으며, Convolution Layer를 한 번 거치지만 Convolution Layer feature Map에 해당하는 Tensor를 뜯어오는 것만 region 별로 하기 때문에 훨씬 더 속도가 빨라졌다. 

     

    SPPnet에서 주목한 점은 AlexNet에서 conv layers 부분은 슬라이딩 윈도우를 사용하기 때문에 영상 크기에 영향을 받지 않는데, fully-connected layers는 영상의 크기에 영향을 받는다는 점이었다. crop을 사용하게 되면 아래의 자동차 그림 처럼 crop된 구역만 CNN을 통과하기 때문에 전체 이미지의 정보가 손실될 수 있고, warp을 사용하게 되면 등대 그림처럼 이미지에 변형이 생길 수 있다. 이 문제를 해결하기 위해 spatial pyramid pooling layer라는 구조를 두게 되면 피라미드 연산을 통해서 입력 연산의 크기를 대응할 수 있고, crop이나 warp을 사용하지 않아도 된다. 

     

     

     

    SPPnet은 5개의 conv layer와 3개의 fc layer를 활용한다. SPP layer 위치는 conv5 layer 이후에 위치시킨다. SPP-net의 작동 방식은 다음과 같다.

     

    1. selective search를 사용하여 약 2000개의 region proposals를 생성한다.

    2. 이미지를 CNN에 통과시켜 feature map을 얻는다.

    3. 각 region proposals로 경계가 제한된 feature map을 SPP layer로 전달한다.

    4. SPP layer를 적용하여 얻은 고정된 벡터 크기(representation)를 FC layer에 전달한다.

    5. SVM으로 카테고리를 분류한다.

    6. 바운딩 박스 regression으로 바운딩 박스 크기를 조정하고 최종 바운딩 박스를 선별한다. 

    21 bin = [4x4, 2x2, 1x1]인 경우 3개의 pooling으로 이루어짐 - spatial bins를 지정해야된다.

     

     

    장점

    1. SPPnet은 CNN을 이미지에 한 번만 적용하여 속도가 빠르다. 

    2. CNN으로 생성된 feature map에서 selective search를 적용하여 생성된 window에서 특징을 추출한다.

    3. feature map에서 임의의 크기 window로 특징 추출이 가능하다.

    4. 입력 이미지의 scale, size, aspect ratio에 영향을 받지 않는다. 

     

     

    문제점

    Fine-tuning 알고리즘을 적용할 때 spatial pyramid pooling layer(SPP) 앞 단에 있는 convolutional layer에 대해 fine tuning을 하지 못하므로 deep network를 적용할 때 정확도가 문제 될 수 있다. 

     

     

     

     

     

     

     

    Fast R-CNN

    위 SPPnet의 문제점을 보완하고 속도가 빨라진 Fast R-CNN이라는 모델이 등장했다. Fast R-CNN은 검출 정확도가 개선되었고, 학습시 multi stage가 아니라 single stage training이 가능하며 학습의 결과를 안에 있는 모든 layer에 업데이트 할 수 있다. Fast R-CNN은 전체 이미지 및 객체 후보를 한꺼번에 받아들인다. conv와 max pooling을 통해 이미지 전체를 한 번에 처리하고 feature map을 생성한다. 그후 생성된 객체 후보 영역에 대하여 RoI pooling layer를 통해 feature map으로부터 추출된 fixed size feature vector를 추출하는데 이 구조가 SPP layer와 하는일이 비슷하다. 

     

     

     

    CNN후에 region proposal 연산 - 2000xCNN연산을 1번의 CNN연산으로 바꾸어주었다.

    변경된 feature vector가 결국 기존의 region proposal을 projection 시킨 후 연산한 것이므로 해당 output으로 classification과 box regression도 학습 가능의 성과를 이루었다. 그러나 여전히 Fast R-CNN에서도 R-CNN에서와 마찬가지로 RoI를 생성하는 selective search 알고리즘은 CNN외부에서 진행되므로 실시간 처리속도는 느리다. 

     

     

     

     

     

     

    Faster R-CNN

    fast R-CNN의 속도가 느린 부분을 보완하여 출시된 모델인 Faster R-CNN은 기존 모델에 Region Proposal Network를 추가해 fast R-CNN에 비해 속도가 빨라지게 되었다. RPN은 Selective search가 2000개의 RoI를 계산하는데 반해 800개 정도의 RoI를 계산하면서도 더 높은 정확도를 보인다. Feature map을 먼저 추출한 다음 RPN에 전달하여 RoI를 계산한다. 여기서 얻은 RoI로 RoI Pooling을 진행한 다음 classification을 진행하여 Object Detection을 수행한다. 

     

    기존에는 단지 Region Proposal을 뽑아내 Linear SVM에 넣어주는 식으로 진행했기 때문에 임의의 셋에서 한정적인 성능을 보여줬지만,  Faster R-CNN에서는 Region Proposal 도 학습하자는 의미로 Region Proposal Network 개념을 도입했다. 

     

    RPN은 이미지가 있으면 이미지의 특정 영역이 Bbox로서의 의미가 있을지 없을지, 이 영역안에 물체가 있을지 아닌지를 찾아주는 것이다. 이 물체가 무엇인가에 대한 문제는 뒷단에 있는 새로운 Network가 해주지만 여기에 있을 것 같다를 해주는 것이다. 이것을 해주는 것이 바로 anchor boxes 라는 것이다. anchor boxes는 미리 정해놓은 Bbox의 크기를 의미한다. 대충 이 이미지 안에 어떤 크기의 물체가 있을 것 같다 라는 것을 미리 알고 있는 것이다. 일종의 k개의 탬플릿들을 만들어두는 것이 RPN의 가장 큰 특징이 된다. 

     

     

     

     

    여기서 해당하는 9 는 Bbox의 크기를 의미하고, 총 9개의 region size중 하나를 고르는 것이다. 각각의 Bbox마다 4개의 Bbox regression parameter가 존재하고(키우고 줄이는) 해당 Bbox가 쓸모 있는지 없는지에 대한 2가지의 parameter가 존재한다. 마지막 Fully Conv의 parameter 수가 9x(4+2)개가 된다. 

     

     

     

    YOLO(v1)

    YOLO는 You Only Look Once Detection as Regression 의 약자이다. YOLO는 기존의 Detection 기법에서는 모델을 통과해 그 후 Region Proposal Network를 통과해 그 후 CNN의 sub Tensor를 가지고 분류를 하는 것이 아니라 그냥 이미지 한 장에서 바로 output이 나올 수 있기 때문에 속도에 있어서 엄청나게 빨라진 것을 알 수 있다.

     

    YOLO에서는 입력 이미지를 SxS grid로 나누는데 논문에서는 7 by 7로 설정했다. SxS로 나눈 후 이 이미지 안의 내가 찾고 싶어하는 물체의 중앙이 해당 grid안에 들어가면 그 grid cell이 해당 물체의 Bbox와 해당 이미지가 무엇인가를 같이 예측해주어야 된다.

     

    SxS grid로 나눈 후 B개(논문에서는 5개)의 Bbox를 만든다. 각 바운딩 박스는 x,y,w,h와 해당 Bbox가 쓸모 있는지 없는지 판단하는 것과 동시에 각각의 SxS grid가 이 grid cell이 속하는 중점에 있는 어떤 Object가 어떤 class인지 찾는다. 두개의 정보를 추합하여 박스와 이 박스가 어떤 class에 속하는지 알 수 있다. 

     

    output으로는 SxS(Number of cells of the grid), B*5(boundding boxes with offsets (x,y,w,h) and confidence), C:Number of classes 를 가지는 SxSx(5*5 + C)개의 parameter를 가지는 Tensor로 출력된다. 해당 Tensor는 각 Bbox의 정보와 class의 정보를 담고 있다.