LITTLE BY LITTLE

[6]실전! 텐서플로2를 활용한 딥러닝 컴퓨터비전 - 객체 탐지 모델2 ( Faster R-CNN 이어서) 본문

4-2/이미지 딥러닝

[6]실전! 텐서플로2를 활용한 딥러닝 컴퓨터비전 - 객체 탐지 모델2 ( Faster R-CNN 이어서)

위나 2022. 10. 3. 17:12

Faster R-CNN

아키텍처 ( 두 단계로 작동)

  1. 관심 영역(ROI, Region of Interest) 추출 - 각 이미지에 대하여 약 2,000개의 ROI를 생성한다.
  2. 분류 단계(혹은 탐지 단계) - 2,000개 각각에 대해 합성곱 네트워크의 입력에 맞춰 정사각형으로 크기를 조정
    • 이 단계에서 CNN을 사용하여 ROI를 분류한다.

1단계. 영역 제안 

  1. RPN (Region Proposal Network, 영역 제안 네트워크)를 사용하여 ROI를 생성한다.
  2. 합성곱 계층을 사용한다. (<= 속도가 빠름)
  3. 앵커 박스를 사용한다. 
    1. 9개 크기의 앵커 박스 사용
    2. 세로로 긴 직사각형, 가로로 긴 직사각형, 정사각형 각각 3개씩
  4. 특징 볼륨을 생성하기 위해서 어떤 백본(=마지막 단계에서 사용되는 특징 추출기)이라도 사용 가능하다.
  5. 그리드를 사용한다. (크기는 특징 볼륨에 따라 달라짐)
  6. 마지막 계층은 숫자를 출력한다. (이 숫자를 사용하여 앵커 박스를 객체에 맞는 적절한 경계 상자로 정교화시킬 수 있다.)

Faster R-CNN 1단계. 영역 제안

1-1. 입력으로 이미지를 받아들이고, 여러 합성곱 계층을 적용한다.

1-2. 특징 볼륨을 출력한다. (합성곱 필터가 특징 볼륨에 적용된다.) : 필터 크기는  3X3XD, D는 특징볼륨의 depth

1-3. 특징 볼륨의 각 위치에서 중간 단계로 1xD 벡터를 생성한다.

1-4. 두 형제 1X1 합성곱 계층은 객체성 점수 경계 상자 좌표를 계산한다

* K개의 경계 상자마다 두 개의 객체성 점수가 있으며, 앵커 박스의 좌표를 개선하기 위해 사용될 4개의 부동 소수점 수도 있다.


2단계. 분류

  1. 최종 경계 상자를 출력한다.
  2. 이전 단계의 ROI리스트와 입력 이미지에서 계산된 특징 볼륨을 두 개의 입력으로 받는다. 
  3. 영역-제안 단계에서 계산된 특징맵을 재사용한다.
    1. 가중치 공유 : 다른 CNN을 사용하기 위하여 두 개의 백본에 대한 가중치를 저장
    2. 계산 공유  : 하나의 입력 이미지에 대해 두 개 대신 한 개의 특징 볼륨만 계산함으로써 계산 성능 향상
  4.  각 ROI에 대해 합성곱 계층이 적용되어 클래스 예측과 경계 상자 개선에 대한 정보를 얻는다.

Faster R-CNN 2단계. 분류

2-1. RPN(영역 제안)단계로부터 특징맵과 ROI를 받는다.

- 원본 이미지 좌표계로 생성된 ROI가 => 특징맵 좌표계로 전환됨

- 예제에서 CNN의 보폭은 16이다 => 좌표는 16으로 나누어진다.

2-2. 각 ROI크기를 조정해 완전 연결 계층의 입력과 맞춘다.

2-3. 완전 연결 계층을 적용하고, 여기에서 특징 벡터를 얻는다.

2-4. 두 개의 서로 다른 합성곱 계층을 적용한다. (하나는 분류 Classification을 처리하고, 다른 하나는 RoI 개선 Regression을 처리한다.)


위의 2-2 과정에서 사용된 관심 영역 풀링에 대해 알아보자.

 

관심 영역 풀링(ROI Pooling)

  1. 합성곱 네트워크가 모든 크기의 입력을 받을 수 있지만, 마지막의 완전 연결 계층은 입력으로 '고정된 크기의' 특징 볼륨을 받는다.
  2. 영역 제안의 크기가 다르기 때문에 마지막 계층을 그대로 사용할 수 없다.
  3. 이 문제를 피하기 위해 도입된 것이 관심 영역 풀링(RoI Pooling)기법이다.
  4. 다양한 크기의 특징맵 영역을 고정된 크기의 영역으로 전환시킨다.
  5. 크기가 조정된 특징 영역이 마지막 분류 계층에 전달될 수 있다.

관심 영역 풀링 기법

=> 이런식으로 다양한 크기의 활성화 맵의 일부를 취하고, 이를 고정된 크기(max)로 변환하는 과정이다.

=> 최대-풀링 계층과 매우 유사하다. 차이점은 ROI풀링은 다양한 크기의 입력에 동작한다는 것

=> 입력 활성화 맵 하부 윈도우의 크기를 hXw, 목표 활성화 맵의 크기를 HXW라 한다. 

=> 입력을 각 셀의 크기가 h/HXW/W인 그리드로 나눔으로써 동작한다. 

=> ex. hXw = 5X4 , HXW = 2X2, h/HXw/W = 2.5 X 2 


Faster R-CNN의 전체 아키텍처

어떤 입력 크기에서도 동작가능

  1. 네트워크의 두 부분이 각각 별도로 훈련됨
  2. 각 부분의 특징 추출기는 동일한 가중치를 공유하지 않음 
  3. 대신에 공유하게 만드는 훈련 절차를 고안함

RPN(영역 제안) 훈련시키기

  1. 모든 제안 영역을 한번에 훈련시키기는 어렵다.
  2. 이미지의 대부분은 배경이라서, 대부분의 제안 영역은 '배경'을 예측하도록 훈련된다.
  3. 샘플링 기법을 선호한다.
  4. 256개의 실제 앵커 박스의 미니 배치가 구성되며, 128개는 양성, 128개는 음성이다.
  5. 여기서 양성 객체를 포함한다는 사실을, 음성 배경만 포함한다는 사실을 의미한다.

RPN 손실

  1. smoothL1 함수는 앞에서 사용했던 L2손실을 대체할 함수로 도입되었다.
  2. YOLO와 마찬가지로 pi*항 덕분에 객체를 포함한 앵커 박스에 대해서만 회귀 손실이 사용된다. 이 손실은 N(classification)과 N(regression) 두 부분으로 나뉘며, 이 두 값을 정규화 항이라고 한다. 미니 배치 크기를 바꾸더라도, 이 손실은 균형을 잃지 않을 것
  3. 람다는 밸런싱 매개변수이다. (논문 저자는 람다를 10으로 설정해 두 항의 전체 가중치를 동일하게 만듦)
  4. 요약하자면, RPN 손실은 YOLO 손실과 반대로 관심영역만 예측하기 대문에, 객체 클래스를 다루지 않는다. 손실과 미니 배치를 구성하는 방식을 제외하면 RPN은 여느 네트워크와 마찬가지로 역전파를 사용해 훈련된다.

R-CNN의 두 번째 단계를 Fast R-CNN 이라고도 한다. 

Fast R-CNN 손실

  1. 근본적으로 RPN 손실과 유사하다.
  2. 훈련하는 동안 ID=0으로 설정해 항상 배경 클래스를 사용함
  3. 실제로 ROI가 배경 영역을 포함할 수 있고, 이를 배경으로 분류하는 일이 중요하다. 
  4. 람다항은 배경 상자에 대해 경계 상자 오차에 패널티를 부과하는 것을 피한다. 

훈련 계획(4-단계 교대 훈련)

  1. 네트워크 두 부분 사이 가중치를 공유해 모델이 빨라지고(=CNN이 한 번만 적용되기 때문) 가벼워짐
  2. 절차를 단순화하면
    1. RPN을 훈련해 허용할 만한 ROI 예측
    2. 훈련된 RPN의 출력(ROI)을 사용해 분류 파트를 별도로 훈련시킨다. (=> RPN과 분류 부분이 별도로 훈련되었기 때문에, 훈련이 끝나면 두 부분이 서로 다른 합성곱 가중치를 갖게 된다.)
    3. RPN의 CNN을 분류 부분의 CNN으로 교체, 합성곱 가중치를 공유하도록 만듦. => 공유한 CNN 가중치를 고정시키고 => RPN의 마지막 계층을 재훈련시킴
    4. 분류 부분의 마지막 계층을 RPN의 출력을 사용해서 다시 훈련한다.
  3. 위 절차가 끝나면, 합성곱 가중치를 공유하는 두 부분으로 이루어진 훈련된 네트워크를 얻게 된다.
Comments