[Computer Vision] 5(3). 강력한 객체 탐지 모델 - Faster R-CNN

5 minute read


Faster R-CNN

속도를 주요 이점으로 갖는 YOLO에 비해 Faster R-CNN의 장점은 성능에 있다. 또한 이 모델은 4~5 fps의 속도를 보인다.

Faster R-CNN은 R-CNN, Fast R-CNN을 거쳐 점진적으로 설계되었다.


Faster R-CNN의 일반 아키텍처


YOLO는 SSD(single shot detection, 단발성 탐지기)로 간주되는데, 그 이름에서도 알 수 있듯이 이미지의 각 픽셀을 한 번에 분석한다. 따라서 속도가 매우 빠르다.

더 정확한 결과를 얻기 위해 Faster R-CNN은 두 단계로 작동한다.

  1. 관심 영역(Region of Interest, RoI)을 추출한다. RoI는 이미지에서 객체를 포함할 수 있는 영역을 말한다.
  2. 분류 단계(탐지 단계). 각 RoI에 대해 합성곱 네트워크의 입력에 맞춰 정사각형으로 크기를 조정한다. 그런 다음 CNN을 이용해 RoI를 분류한다.

KakaoTalk_20210818_113104420


1단계: 영역 제안

KakaoTalk_20210818_111338971

관심 영역은 영역 제안 네트워크(region proposal network, RPN)를 사용해 생성된다. RoI를 생성하기 위해 영역 제안 네트워크는 합성곱 계층을 사용한다. RPN 아키텍처는 YOLO 아키텍처와 상당히 많음 유사점을 가진다.

  • 앵커 박스를 사용한다. Faster R-CNN 논문에서 9개 크기의 앵커 박스(3개의 세로로 긴 직사각형, 3개의 가로로 긴 직사각형, 3개의 정사각형)를 사용했다.
  • 특징 볼륨을 생성하기 위해 어떤 백본이라도 사용할 수 있다.
  • 그리드를 사용하며 그리드 크기는 특징 볼륨의 크기에 따라 달라진다.
  • 마지막 계층은 숫자를 출력하는데, 이 숫자를 사용해서 앵커 박스를 객체에 맞는 적절한 경계 상자로 정교화할 수 있다.


RPN의 단계별 절차는 다음과 같다.

  1. 네트워크는 입력으로 이미지를 받아들이고 여러 합성곱 계층을 적용한다.
  2. 특징 볼륨을 출력한다. 합성곱 필터가 특징 볼륨에 적용된다. 필터 크기는 3x3xD이며 여기에서 D는 특징 볼륨의 깊이이다.
  3. 특징 볼륨의 각 위치에서 이 필터는 중간 단계로 1xD의 벡터를 생성한다.
  4. 두 형제 1x1 합성곱 계층은 객체성 점수와 경계 상자 좌표를 계산한다. k개의 경계 상자마다 두 개의 객체성 점수가 있다. 또한 앵커 박스의 좌표를 개선하기 위해 사용될 4개의 부동소수점도 있다.

사후 처리 단계 이후 최종 출력은 RoI 리스트다. 이 단계에서는 객체의 클래스에 대한 어떤 정보도 생성되지 않고 그 위치에 대한 정보만 생성된다. 다음 분류 단계에서 객체를 분류하고 경계 상자를 개선한다.


2단계: 분류

KakaoTalk_20210818_112930443

분류 단계에서는 최종 경계 상자를 출력하고, 이전 단계(RPN)의 RoI 리스트와 입력 이미지에서 계산된 특징 볼륨을 두 개의 입력으로 받는다.

분류 단계에서는 이전 영역 제안 단계에서 계산한 특징 맵을 재사용함으로써 다음 두가지 이점을 갖는다.

  • 가중치를 공유한다: 다른 CNN을 사용하려면 두 개의 백본(하나는 RPN, 다른 하나는 분류 부분)에 대한 가중치를 저장해야 한다.
  • 계산을 공유한다: 하나의 입력 이미지에 대해 두 개 대신 한 개의 특징 볼륨만 계산한다. 이 연산이 전체 네트워크에서 가장 비용이 많이 들기 때문에 두 번 실행하지 않아도 된다는 점에서 계산 성능이 향상된다.


Fast R-CNN 아키텍처

Faster R-CNN의 두번째 단계는 첫번째 단계에서 특징 맵과 함께 RoI 리스트를 받는다. 각 RoI에 대해 합성곱 계층이 적용돼 클래스 예측과 경계 상자 개선 정보를 얻는다.

단계별 절차는 다음과 같다.

  1. RPN으로부터 특징 맵과 RoI를 받는다. 원본 이미지 좌표계로 생성된 RoI는 특징 맵 좌표계로 변환된다.
  2. 각 RoI 크기를 조정(RoI 풀링)해 완전 연결 계층의 입력과 맞춘다.
  3. 완전 연결 계층을 적용한다. 여기에서 특징 벡터를 얻는다.
  4. 두 개의 서로 다른 합성곱 계층을 적용한다. 하나는 분류(cls)를 처리하고 다른 하나는 RoI 개선(rgs)을 처리한다.

최종 결과는 클래스 점수와 경계 상자 개선을 위한 부동소수점 숫자이며, 이 결과를 사후 처리해서 모델의 최종 출력을 생성한다.

완전 연결 계층의 입력은 고정된 크기이기 때문에 이 문제를 해결하기 위해 관심영역 풀링 기법을 사용한다.


RoI 풀링

관심 영역 풀링(RoI pooling)은 다양한 크기의 특징 맵의 일부를 취하고 이를 고정된 크기로 변환한다.



Faster R-CNN 훈련


RPN 훈련시키기

RPN의 입력은 이미지이고 출력은 RoI 리스트다. 앞에서 봤듯이 각 이미지에는 HxWxk 개의 제안 영역이 있다. (H와 W는 특징 맵의 크기를 나타내고 k는 앵커 박스의 개수이다) 이 단계에서는 아직 객체의 클래스를 고려하지 않는다.

모든 제안 영역을 한 번에 훈련시키기는 어렵다. 이미지의 대부분은 배경이기 때문에 대부분의 제안 영역은 ‘배경’을 예측하도록 훈련된다. 그 결과 이 네트워크는 항상 배경을 예측하도록 학습한다. 대신 샘플링 기법을 선호한다.

256개의 실제 앵커 박스의 미니 배치가 구성되며 이 중 128개는 양성(객체를 포함)이고 다름 128개는 음성(배경만 포함)이다. 이미지에서 음성 샘플이 128개보다 적으면 가능한 양성 샘플이 모두 사용되며 배치는 음성 샘플로 채워진다.


RPN 손실

손실은 두 개의 항으로 구성된다.

KakaoTalk_20210818_122422812

  • i는 훈련 배치에서 앵커 박스의 인덱스이다.
  • pi는 해당 앵커 박스가 객체일 확률이다. pi* 는 실제 확률로 앵커 박스가 ‘양성’이면 1이고 그렇지 않으면 0이다.
  • ti는 좌표 개선을 나타내는 벡터이며, ti* 는 실제 좌표이다.
  • Ncls는 훈련 미니 배치에서 실제 앵커 상자의 개수다.
  • Ncls는 가능한 앵커 위치 개수다.
  • Lcls는 두 클래스(객체와 배경)에 대한 로그 손실이다.
  • 람다는 이 손실의 두 부분의 균형을 맞추기 위한 밸런싱 매개변수다.


마지막으로 Lreg(ti, ti* ) = R(ti - ti* )로 구성되며, 여기에서 R은 다음같이 정의되는 ‘평활’ L1 손실 함수이다.

def smoothL1(x):
    if abs(x) < 1: return 0.5 * x**2
    else: abs(x) - 0.5

이 함수는 L2 손실을 대체할 함수로 도입되었다. 오차가 너무 중요한 경우 L2 손실이 너무 커져서 훈련이 불안정해진다.

YOLO와 마찬가지로 pi* 항 덕분에 객체를 포함한 앵커 박스에 대해서만 회귀 손실이 사용된다. 이 손실은 Ncls, Ncls 두 부분으로 나뉜다. 이 두 값을 정규화 항이라고 하며, 미니 배치 크기를 바꾸더라도 이 손실은 균형을 잃지 않는다.


요약하면 YOLO와 유사하게 손실은 다음에 패널티를 부과한다.

  • 첫번째 항으로 객체성 분류에서의 오차
  • 두번째 항으로 경계 상자 개선에서의 오차

그러나 YOLO 손실과 반대로 RPN은 관심 영역만 예측하기 때문에 객체 클래스를 다루지 않는다.


Fast R-CNN 손실

Faster R-CNN의 RPN 다음 단계는 Fast R-CNN 단계이다. 따라서 그 손실은 종종 Fast R-CNN 손실이라고 한다. Fast R-CNN 손실의 공식이 RPN 손실과 다르지만, 근본적으로 매우 비슷하다.

KakaoTalk_20210818_120559115

  • Lcls: 실제 클래스 u와 클래스 확률 p 사이의 로그 손실
  • LLoc(tn, v): RPN 손실의 Lreg와 동일
  • 람다[u >= 1]는 u >= 1일 때 1이고 그 외의 경우는 0

Fast R-CNN을 훈련하는 동안 id=0으로 설정해 항상 배경 클래스를 사용한다. 실제로 ROI가 배경 영역을 포함할 수 있고 이를 배경으로 분류하는 일은 중요하다. 람다 항은 배경 상자에 대해 경계 상자 오차에 패널티를 부과하는 것을 피한다.


훈련 계획

논문에서 추천하는 훈련 절차는 4-단계 교대 훈련이다.

  1. RPN을 훈련해 허용할 만한 RoI를 예측한다.
  2. 훈련된 RPN의 출력을 사용해 분류 파트를 훈련시킨다. RPN과 분류 부분이 별도로 훈련됐기 때문에 훈련이 끝나면 두 부분이 서로 다른 합성곱 가중치를 갖게 된다.
  3. RPN의 CNN을 분류 부분의 CNN으로 교체해 합성곱 가중치를 공유하게 만든다. 공유된 CNN 가중치를 고정시킨다. RPN의 마지막 계층을 다시 훈련한다.
  4. 분류 부분의 마지막 계층을 RPN의 출력을 사용해 다시 훈련한다.

이 절차가 끝나면 합성곱 가중치를 공유하는 두 부분으로 이루어진 훈련된 네트워크를 얻게 된다.



텐서플로 객체 탐지 API


텐서플로 객체 탐지 API는 수많은 기여자와 텐서플로 팀에 의해 관리되고 있는 Faster R-CNN의 구현을 제공한다.

객체 탐지 API는 텐서플로 핵심 라이브러리에 포함되지는 않지만, 별도의 깃허브 저장소에서 내려받을 수 있다.


사전 훈련된 모델 사용하기

객체 탐지 API에는 COCO 데이터셋에서 훈련된 몇 가지 사전 훈련된 모델이 포함되어 있다. 이들은 모두 Faster R-CNN을 기반으로 하지만 서로 다른 매개변수와 백본을 사용한다. 이 차이가 추론 속도와 성능에 영향을 미친다. 일반적으로 추론 시간과 mAP는 트레이드 오프 관계이다.

맞춤 데이터셋에서 훈련하기

COCO 데이터셋에 포함되지 않는 객체를 탐지하기 위해 모델을 훈련시킬 수 있다. 그러려면 객체 클래스 당 최소 1000개의 샘플을 확보해야 한다. 또한 훈련 데이터셋을 생성하기 위해 훈련 이미지 주위에 경계 상자를 그리고(이미지 크롭핑) 직접 주석을 달아야(이미지 라벨링)한다.

Leave a comment