본문 바로가기

책/파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습

09 객체 탐지 (1) Faster R-CNN

객체 탐지(Object Detection)란 이미지나 영상에서 특정 객체를 탐지하고 영역을 인식하는 컴퓨터비전 기술이다. 객체 탐지는 크게 물체의 분류 작업과 지역화 작업으로 나눌 수 있다.

  • 분류 : 이미지에서 물체가 어떤 종류인지를 분류하는 작업으로 각각의 클래스에 대한 확률값을 분석
  • 지역화(Localization) : 이미지에서 물체의 위치를 파악하는 작업으로 이미지에서 물체가 위치한 영역을 찾아 해당 영역의 좌푯값을 예측

 

객체 영역을 표현하는 방법에는 경계 상자 방식과 마스크 방식이 있다.

  • 경계 상자(Bounding Box) : 객체의 영역을 사각형 형태로 표현하며 이미지에서 객체의 위치와 크기를 파악할 수 있다. 경계 상자는 직사각형의 구조로 선분이 수평 또는 수직한 구조를 갖는다.
  • 마스크 : 객체 영역을 픽셀 단위로 정확하게 분할(Segmentation)해 표현하는 방식으로 객체 영역의 정확한 표현을 위해 사용된다. 마스크는 각 픽셀마다 클래스 정보를 갖고 있다.

 

 

bounding box

 

image segmentation

 

 

1. BackGround

1.1 Selective Search

선택적 탐색(Selective Search) 알고리즘은 객체 후보 영역(Region Of Interest, ROI)을 생성하기 위한 영역 제안 알고리즘 중 하나로, 이미지 내에서 객체가 존재할 가능성이 높은 영역을 찾는 목적으로 사용된다.

 

  1. 초기 영역 분할(Initial Segmentation) : 이미지를 작은 영역으로 분할한다. 이 단계에서는 픽셀 간의 유사성을 기반으로 이미지를 세그먼트로 분할하고, 작은 영역을 형성한다.
  2. 영역 병합(Merging Regions) : 초기 분할된 영역을 결합하여 더 큰 영역을 형성한다. 유사성을 기반으로한 영역 간의 병합을 수행하며, 이는 객체가 있는 영역을 더 크게 만든다.
  3. 영역 평가(Region Evaluation) : 영역들을 평가하여 객체가 있을 가능성이 높은 후보 영역을 선별한다. 평가할 때는 크기, 형태, 색상, 질감 등의 특징을 고려한다.
  4. 영역 제안(Region Proposal) : 2, 3을 반복적으로 수행해 평가된 후보 영역들 중에서 일정 기준을 충족하는 영역들을 최종적으로 선택하여 제안한다. 

 

1.2 Non-Maximum Suppression, NMS

1) 경계 상자들의 집합 B와 최종적으로 남길 경계 상자를 담을 리스트 L이 있다고 가정하자. B의 경계 상자들은 각각 클래스에 대한 확률값 score를 가지고 있을 텐데, score가 가장 높은 경계 상자를 선택해 B에서 삭제 후 L에 담는다. 또한 score가 너무 낮은 경계 상자들도 B에서 삭제된다.

 

2) L에 있는 경계 상자와 B에 남아있는 경계 상자들과의 IOU(Intersection Of Union)을 계산한다. IOU는 두 개의 경계 상자가 얼마나 겹쳐져 있는지를 나타내는 지표로 다음 그림과 같이 계산한다. IOU가 미리 정해놓은 threshold보다 낮다는 B에서 삭제한다.

 

 

3) 2)를 수행하고 B에 남은 경계 상자 중 score가 가장 큰 것을 B에서 삭제하고 L에 추가한 뒤 2)를 반복한다. 이 과정을 B에 경계 상자가 남지 않을 때 까지 반복한다.

 

NMS는 딱 봐도 threshold 값에 매우 민감하다. 탐지해야할 객체가 겹쳐져 있는 경우 score는 높지만 L에 담긴 것과 IOU가 낮아 NMS에 의해 제거되는 경우도 생긴다. 반대로 객체를 똑바로 탐지하지 못했지만 score가 애매해서 B에 남아 있는 것 중 IOU 값이 높아 False Positive가 생기는 경우도 있다. 이러한 문제를 방지하기 위해 Soft-NMS가 제안되었는데, 이는 나중에 알아보자.

 

 

2. R-CNN

R-CNN(Region Based Convolutional Neural Networks)은 2013년 로스 기르쉬크가 제안한 딥러닝 모델로, 영역 제안(Region Proposal), 특징 추출(합성곱 모델), SVM을 활용해 객체 탐지를 수행한다.

 

 

 

  1. Region Proposal : 선택적 탐색 알고리즘을 통해 2000여 개의 ROI를 뽑아내어 경계 상자를 생성한다.
  2. Wraping : 이미지 영역을 AlexNet에 넣기 전에 전부 동일한 크기(227x227)로 warping한다. 경계 상자의 크기 비율은 고려하지 않기 때문에 이 과정에서 이미지가 왜곡되고 정보가 소실되는 현상이 발생한다.
  3. Feature Extract : 이미지넷 데이터로 사전 학습된 AlexNet을 객체 탐지용 데이터셋으로 미세 조정하여 CNN을 구성한다. 이를 통해 4096 크기의 특징 벡터를 추출한다.
  4. Classification with SVM : 추출된 특징 벡터를 SVM 분류기를 사용해 각각의 확률 값을 얻어낸다.
  5. NMS : 가장 우수한 영역을 선택하기 위해 NMS를 수행한다.
  6. Box Regression : 선택적 탐색으로 찾은 경계 상자 위치가 부정확하기 때문에 박스 회귀를 수행해 후보 영역이 실제 영역과 일치하게 학습해 영역의 위치와 크기를 조정한다.

 

3. Fast R-CNN

로스 기르쉬크가 2015년에 R-CNN을 개선해 제안한 모델이다. 

 

 

  1. 이미지를 사전 학습된 CNN에 전달해 특징 맵을 추출하고 selective search 알고리즘으로 ROI를 추출한다.
  2. ROI를 특징 맵에 투영(projection)하여 해당 위치에 대응하는 특성 값을 추출한다.
  3. 추출된 특성 값 위에 grid를 그리고 각 셀에 대하여 max pooling을 수행하여 고정된 크기의 특징 벡터를 얻어낸다. 이 과정을 ROI Pooling이라 한다.
  4. ROI Pooling을 통해 얻은 특징 벡터를 Fully connected layer에 통과시켜 객체에 대한 클래스 예측을 수행한다. 또한 이 특징 벡터를 가지고 Bounding Box Regression을 수행한다.
  5. cls loss와 bbr loss를 적절히 엮어 주어 multi-task loss로 네트워크가 학습된다.
  6. 예측한 경계 상자에 대해 NMS를 통해 최적의 경계 상자만 출력한다.

 

 

4. Faster R-CNN

4.1 Region Proposal Network, RPN

selective search 알고리즘 대신 RPN을 사용해 ROI를 추출한다. selective search는 GPU 연산이 불가능하지만 RPN은 GPU 연산이 가능하다는 장점이 있다.

 

학습된 합성곱 신경망을 통해 입력 이미지의 특징 맵을 얻는다. 이 특징 맵에 3x3 512, stride=1, padding=1 conv 연산을 적용하여 동일한 크기의 특징 맵을 얻어낸다.

 

이 특징 맵의 각 픽셀은 해당 위치의 지역적 특성을 축약한 벡터이다. 그러므로 이 특징 맵에 1x1 conv 연산을 통해 classification 작업과 bounding box regression 작업을 수행한다.

 

분류 작업을 할 때는 출력 채널 수가 18(2x9)가 되도록 설정한다. 2는 이진 분류를 뜻하고 9는 앵커 박스의 개수를 의미한다.

 

bbr 작업에서는 출력 채널 수가 36(4x9)가 되도록 설정한다. 4는 경계 상자의 좌표를 의미하고 9는 앵커 박스의 개수를 의미한다.

 

 

4.2 Anchor Box

앵커 박스는 원본 이미지위에 생성하는 사전 정의된 경계 상자이다. 앵커 박스는 다음 그림과 같이 여러 개의 크기와 종횡비로 정의된다.

 

 

RPN의 그림에서 보았듯이 원본 이미지는 더 작은 특징 맵으로 sub-sampling이 된다. 이 비율을 고려하여 원본 이미지를 일정한 크기의 grid로 분할한다. 가령 현재 예시에서는 원본 이미지에 40x60=2400개의 grid가 생성되어야 한다.

 

그리고 이 각각의 grid 마다 앵커 박스를 9개 생성해내는 것이다. 그러므로 총 2400x9=21600개의 앵커 박스가 생성된다.

 

 

4.3 관심 영역 선별

생성된 앵커 박스와 RPN에서 반환한 class score 및 bbr을 사용하여 관심 영역을 선별한다. 모든 앵커 박스를 관심 영역으로 사용한다면 학습 및 추론 속도가 느려지기 때문이다.

 

  1. score 상위 N개의 앵커 박스를 선택한다. 일반적으로 모델 학습 시 1,000개, 추론 시 100개를 사용한다.
  2. N개의 앵커 박스에만 bbr을 적용한다.
  3. NMS를 통해 중복되는 앵커 박스를 제거한다.
  4. 남은 앵커 박스를 관심 영역으로 사용한다.

학습 시 관심 영역을 선별하는 과정은 다음과 같다.

 

  1. 특징 맵 가장자리의 윈도에 할당된 앵커 박스는 제외
  2. 실젯값(Ground Truth) 박스와 앵커 박스의 IoU가 0.7 이상인 앵커 박스를 관심 영역으로 사용
  3. 앞선 과정에서 추출된 관심 영역이 없는 경우, IoU 값이 가장 큰 앵커 박스를 관심 영역으로 사용
  4. IoU가 0.3 이하인 앵커 박스를 배경 영역으로 사용

이후 과정은 Fast R-CNN과 거의 비슷하다. 선택된 관심 영역들을 RPN을 거치기 전 합성곱 모델을 통해 얻은 특징 맵과 ROI Pooling을 수행한다. 풀링을 통해 얻은 고정된 크기의 특징 벡터를 fc layer를 거친 후 분류기와 Bounding Box Regressor에 입력하여 k개의 클래스를 가진 경우 (k+1)과 (k+1)x4 크기의 출력이 나오도록 하여 학습한다. 1이 더해지는 이유는 배경 클래스가 추가되기 때문인데, 배경 클래스는 객체가 아닌 영역을 나타낸다. 

 

 

4.4 손실 함수

Faster R-CNN의 손실 함수는 다음과 같다.

 

$L = L_{cls}/N_{cls} + \lambda L_{reg}/N_{reg}$

 

$N_{cls}$는 미니 배치의 크기를 나타내며, $N_{reg}$는 앵커 박스의 개수를 의미한다. $\lambda$는 두 손실의 균형을 맞추기 위한 인자이다.

 

분류 손실은 이진 교차 엔트로피를 사용하고 박스 회귀 손실을 $smooth_{L1}$ 함수를 사용한다.

 

 

$smooth_{L1}$은 L1 함수에 조건을 추가해 만든 함수이다. 이 함수는 입력값의 절댓값이 1보다 작은 경우 L2 손실을 적용하고 1보다 크거나 같은 경우 L1을 적용한다.