작성자: 17기 김희준
Introduction에선 object detection의 선두 주자 격인 R-CNN 계열 모델의 변천사를 가볍게 짚고 넘어간다. R-CNN, Fast R-CNN, Faster R-CNN으로 이어진다. 이 세 가지 모델은 “object를 담고 있는 영역을 어떻게 효율적으로 포착할 수 있을까?(region proposal)”에 대한 답을 해결하기 위해 점차 발전되어왔다.
가장 먼저 region-based convolutional neural networks(R-CNN)이다. 이 모델이 object를 contain하는 영역을 파악하기 위한 알고리즘은 Selective Search이다. Selective Search는 CPU 환경에서 진행되는 과정으로, 이미지 하나당 대략 0.2초가 걸리고 2,000여 개의 region proposals를 구해준다. 이 때 모든 proposals에 대해 각기 ROI를 구하고, 개별적으로 CNN을 거쳐 Classification과 Bounding box 위치를 예측한다.
Fast R-CNN은 기존의 R-CNN 방식을 개선하여 개별적으로 수행했던 CNN을 단 한 번만 수행한다.
하지만 여전히 Fast R-CNN도 CPU 기반의 Selective Search 방식을 사용하고 있었기에 region proposal에 쓰이는 시간이 너무 많았다. 수치로만 봐선 2.3초밖에 걸리지 않으니 얼마 안 되는 것처럼 보여도, 전체 test time의 75% 가량을 region proposal time에 할애하고 있으니 크나큰 연산상의 손해였다.
이 단점을 극복하고자 등장한 것이 Faster R-CNN이다. Selective Search 방식 대신, CNN, 즉 딥러닝 방식으로 region proposal을 진행한다. 이를 RPN(Region Proposal Network)라고 일컫는다. RPN은 Fast R-CNN이 사용하는 feature map과 동일한 feature map을 공유함으로써 이미지 한 장당 region proposal에 걸리는 시간이 0.01초로 대폭 감소했다.
RPN은 기존의 방식들과 달리 다양한 스케일과 가로세로 비율을 가진 Anchor Boxes를 도입했다. 이로써 여러 이미지나 필터를 사용하지 않고, 빠른 속도로 연산이 가능해졌다. RPN을 거쳐 만들어진 region proposals는 Fast R-CNN에 전달되는데, RPN과 Fast R-CNN을 번갈아 가며 학습시키는 방식이다.
object proposals과 object detection에 활용되는 딥러닝 방식에 대한 간단한 언급을 하고 있다.
이제 본격적으로 논문의 주된 모델인 Faster R-CNN에 대해 소개한다. Faster R-CNN은 proposal region을 찾아주는 모듈과 Fast R-CNN으로 detect를 하는 모듈로 구성된 unified된 형태이다.
위 그림처럼 우선 이미지가 들어오면, conv layers에서 합성곱이 이루어지고, feature maps은 RPN과 Fast R-CNN(classifier)로 각각 전달된다. RPN에서 객체가 있을 만한 region을 propose하여 classifier로 전달하면, classifier는 feature maps과 proposal region이라는 두 가지의 정보로 object detection을 수행한다.
Region Proposal Networks(RPN)은 이미지를 input으로 받아 사각형의 proposal region을 output으로 출력한다. 이 때 사용하는 기법은 fully convolutional network인데, 앞서 설명했듯이 연산량을 대폭 줄이기 위해 Fast R-CNN과 같은 convolution을 공유하고 있다.
위 사진이 RPN의 구조이다. conv feature map은 RPN에 들어오기 전에 conv layer에서 생성된 feature map이다. 이 map이 sliding window에 의해 작은 차원으로 축소되는데, VGG 모델의 경우 512-d로 차원 축소가 된다(그림 상에는 ZF 모델을 사용하여 256-d로 축소됐다). 논문에선 이 window의 크기를 3*3으로 지정했다. 그렇게 축소된 map은 각각 cls(classifier layer)와 reg(regressor layer)로 전달된다.
즉, 코드 과제에서 위 부분에 해당된다. conv1에서 3*3 window를 거친 feature map이 각각 reg_layer와 cls_layer로 전달된다.
이제 Anchor box를 만든다. 각각의 window마다 k개의 Anchor boxes를 만들게 되는데, 논문에서는 k=9개를 만든다고 한다. Anchor box는 3가지 scales과 3가지 aspect ratios의 경우의 수를 곱해 총 9가지가 만들어지는 것이다.
Anchor boxes의 총 개수는 피처맵의 크기(w*h)*9이다. 코드 과제에선 800*800의 이미지를 50*50크기로 만들었으므로 전체 Anchor boxes의 개수는 50*50*9=22500개가 된다.
코드 과제에서 가장 가운데 윈도우에서 파생된 9개의 Anchor box는 위 사진과 같다. 초록색 박스는 ground truth이다.
RPN의 중요한 특성 중 하나는 Translation-Invariant이다. 이는 이미지 안에서 객체의 위치가 변해도 같은 객체로 판별할 수 있게끔 하는 특성이다.
단적인 예로 위 사진에서 고양이의 위치가 변했지만, Translation-Invariant 특성을 갖고 있다면 이를 똑같은 고양이 객체로 detect할 수 있다.
또 한가지 중요한 특성이 Multi-Scale 특성이다. Anchor boxes는 3가지 Scale을 갖는다고 상술했다. 만약 이 특성이 없다면, 이미지 크기 자체를 resize하거나 필터를 여러 개 사용하는 등 오랜 시간을 할애해야 한다. 하지만 Multi-Scale 특성은 기존 방식보다 훨씬 cost-efficient하다.
RPN을 훈련시키기 위해서 우선 각 Anchor boxes에 labeling 작업을 해주어야 한다. 실제로 객체가 있을 법한 positive label과 없을 법한, 즉 배경을 나타내는 negative label로 나뉘게 되는데, 이를 나누는 기준은 IoU이다. IoU는 Anchor box와 Ground Truth의 교집합이 분자, 둘의 합집합이 분모로 들어가는 수치이다. 즉, Anchor box가 얼만큼 실제 객체를 contain하는 지를 나타낸 지표이다. IoU가 0.7이 넘으면 positive, 0.3보다 작으면 negative로 labeling된다. 0.3~0.7에 위치한 이도 저도 아닌 값은 훈련에 포함되지 않는다.
위 사진은 loss function이다. RPN에서 cls layer와 reg layer가 있는데, cls layer는 객체의 유무를 잘 예측했는지, reg layer는 box의 위치를 잘 예측했는지를 각각 계산해주고, 이 두 계산에서 발생한 손실을 더해준 것이 위 수식이다.
코드 과제에선 위처럼 각각 cls와 reg의 손실함수를 구해줬다.
그 후 적절한 람다값을 설정하고 정규화를 위해 N_cls N_reg로 각각 나눈 후 두 손실을 합하여 최종적으로 loss function을 구현할 수 있다.
RPN 역시 여타 neural net처럼 경사하강법(SGD)과 역전파(Back-Propagation) 알고리즘을 통해 학습이 된다. 이 때 거쳐야 하는 것이 positive sample과 negative sample의 비율을 맞추는 것이다. 일반적으로 하나의 이미지에는 탐지하고자 하는 객체보다 배경이 차지하는 비중이 더 클 것이다. 따라서 그 상태 그대로 학습을 시키면 negative에 편중되는 상황이 발생해버린다.
이를 방지하기 위해 두 label의 비율을 1:1로 맞추어준다. 코드 과제에서 이를 구현한 부분은 아래 사진과 같다. 한 번의 mini batch에 256개의 sample이 사용되는데, 128개는 positive와 negative를 각각 128개씩 sampling하는 것이다. 만약 positive의 개수가 부족하다면 nagative에서 padding해온다.
지금까지는 region proposal의 영역을 살펴봤고, 이제 이렇게 얻어낸 region에 기반한 object detection의 영역을 살펴볼 것이다. 계속 언급했듯이, detection을 수행하는 것은 Fast R-CNN이다. 이 때 Fast R-CNN이 사용하는 feature map은 RPN에서도 사용된 동일한 feature map이다. 하지만 결국 이 feature map도 input으로 들어갈 때만 동일할 뿐, RPN과 Fast R-CNN에서 각기 다른 방식으로 독립적으로 훈련된다. 따라서 feature map을 share하면서 독립적으로 train 시키는 method를 고안해야 한다. 논문에서는 Alternating training method를 택한다고 밝혔다.
Alternating training은 말 그대로 교차로 두 방식을 진행한다는 의미이다. 우선 RPN에서 region을 propose하여 넘겨주면 Fast R-CNN이 이를 기반으로 detection을 진행하고 이 때 튜닝된 값이 RPN을 initialize하는 데에 쓰인다.
논문에서 제안한 Anchor box는 128^2, 256^2, 512^2 세 가지의 scales을 사용하고, 1:1, 1:2, 2:1 세 가지의 aspect ratios를 사용한다. 3.1.1에서 언급한 것과 마찬가지로, 앵커박스를 사용하면 image pyramid나 filter pyramid를 사용할 필요가 없어지므로 속도가 빨라진다.
위 사진은 anchor box의 크기에 따라 추정해주는 proposal region의 평균 크기를 표로 나타낸 것이다.
또한 이미지의 범위를 벗어나는 cross boundary anchor boxes들도 존재한다. 마치 아래 사진처럼 말이다. 이런 boxes들은 과감하게 제거해주어야 한다.
코드 과제에선 cross boundary anchor boxes를 제거하는 것이 아래 사진에 해당한다.
또한 box들끼리 서로 겹치는 영역이 무수히 많다. 이 겹치는 영역을 없애기 위해 Non Maximum Suppression(NMS)를 적용한다. NMS IoU의 threshold를 0.7로 설정하여 겹치는 영역을 줄여주었다.
PASCAL VOC 2007이라는 detection 데이터셋으로 Faster R-CNN의 성능을 평가했다. 이 데이터셋은 train 5,000개, test 5,000개로 구성되어 있고 class는 총 20개이다.
결과는 위 표와 같다. SS는 Selective Search를, EB는 EdgeBoxes를 의미하고 RPN+XF, shared가 Faster R-CNN이다. ZF-net 모델을 baseline으로 사용했다. 이 때 mAP가 가장 우수했던 것은 Faster R-CNN이었다.
논문에선 합성곱 계층을 공유(shared)하는 버전과 공유하지 않는(unshared) 버전도 나누어 보고, 여러 cls layer, reg layer를 포함하고 제외하는 등 여러 경우의 수를 모두 조합해본 결과 완전한 형태의 Faster R-CNN으로 train, test를 모두 진행할 때 가장 좋은 성능을 보인다는 것을 확인했다.
ZF-net을 사용할 때보다 VGG-16을 사용할 때 눈에 띄게 성능이 좋아진다. 또한 train data에서 PASCAL VOC 2007뿐만 아니라 VOC 2012, MS COCO 데이터셋까지 추가하니 더 높은 성능을 기록했다.
하지만 ZF-net이 더욱 간결한 구조를 갖고 있기 때문에 VGG 모델로 학습시켰을 때보다 속도는 더 빠른 것을 확인할 수 있다.
scales과 aspect ratios를 어떻게 설정하냐에 따라도 성능에 변화가 있었다. 가장 좋은 조합은 논문에서 제시한 3 scales, 3 ratios였다.
IoU 값에 따른 anchor box의 recall이 어떻게 나타나는지 확인한 그래프이다.
Faster R-CNN은 region을 propose해주는 단계와 classification하는 단계가 순차적으로 이루어지는 Two-Stage 방식이다. One-Stage 방식에 비해 Two-Stage 방식이 더 나은 성능을 보임을 위 표가 보여주고 있다.
Faster R-CNN은 RPN을 도입하여 Selective Search로 인한 과도한 Proposal 시간을 대폭 감소시킴으로써 큰 성능 향상을 이루었다. 또한 기존의 Fast R-CNN과 RPN이 같은 Convolution Feature를 공유함으로써 효율성을 제고하기도 했다는 점에서 Detection 분야의 비약적인 발전에 기여했다.
[3주차 / 김희준 / 논문리뷰] Visualizing and Understanding Convolutional Networks (0) | 2023.07.25 |
---|---|
[3주차/강민채/논문리뷰] Saliency Maps (0) | 2023.07.24 |
[2주차 / 강민채 / 논문리뷰] YOLOv1 (1) | 2023.07.19 |
[2주차/ 문성빈 / 논문리뷰] YOLO(You Only Look Once) (1) | 2023.07.19 |
[2주차/ 이서연 / 논문리뷰] YOLOv1(You Only Look Once) (1) | 2023.07.18 |
댓글 영역