- 인코더는 CNN이 출력한 feature map을 길이 H×WH \times WH×W 인 시퀀스로 펼친 후 입력받는다.
- 각 위치 벡터는 해당 공간 위치의 이미지 특징을 나타내며, 2D positional encoding이 더해진 상태이다.
- Encoder 층에서는 multi-head self-attention과 FFN을 반복적으로 적용하여,
- 같은 객체에 속하는 위치들은 서로 강하게 연결되고
- 서로 다른 객체나 배경은 약하게 연결되도록 표현을 학습한다.
- 최종 encoder 출력은 “이미지 전역 문맥이 반영된 feature 시퀀스”로, 이후 decoder가 객체별 정보를 추출하는 기반이 된다.
- 논문에서 encoder self-attention map을 시각화하면,
- 특정 위치를 query로 선택했을 때
- 같은 인스턴스(예: 한 마리 소, 한 마리 말)에 해당하는 영역에 높은 attention이 집중되는 것을 확인할 수 있다.
- 이는 encoder가 물체의 윤곽과 구성을 자연스럽게 분리해 내고 있음을 의미한다.
DETR의 encoder는 다음과 같이 작동한다.
- Backbone CNN에서 나온 feature map을 “HW개의 위치 토큰”으로 펼친다.
- 각 위치에 “이 위치가 어디인지”를 나타내는 positional encoding을 더한다.
- 이 위치들에 대해 여러 층의 multi-head self-attention을 반복 적용한다.
이 때 self-attention 한 층에서 하는 일은 개략적으로 다음과 같다.
- 각 위치가 다른 모든 위치와 “얼마나 관련이 있는지”를 점수로 계산
- 그 점수를 소프트맥스로 정규화해서 가중치로 사용
- 그 가중치를 이용해 “다른 위치들의 정보를 가중합”하여 자기 표현을 업데이트
이 과정을 여러 층 반복하면
- 같은 객체에 속한 위치들은 서로 강하게 소통해서 비슷한 표현을 갖게 되고
- 서로 다른 객체는 표현 공간에서 더 분리되는 경향을 보인다.
결국 Encoder는
“이미지 전체를 본 뒤, 각 위치가 어떤 물체/배경에 속하는지 구분이 잘 되는 표현 공간으로 재배열하는 역할”
을 한다.