본문 바로가기
AIML 분야/Vision Transformer

[작성중] Deformable DETR: Deformable Transformers for End-to-end Object Detection

by 포숑은 맛있어 2020. 12. 24.
반응형

논문을 대략 읽어보면서 쓰는 글.

 

유투브에서 리뷰 영상을 봤는데 그래서 모델 component 각각에서 input/output이 어떻게 된다는건지 정확히 모르겠어서 대략 다시 보려고 한다.

 

 

What is the paper about?

- Task : Object Detection

- Main idea : transformer를 사용함으로써 end-to-end가 되었다.

- Details

  • transformer를 대충 번역기처럼 생각했을때, output은 원래 번역된 각각의 단어처럼 나올건데, 여기서는 각 output 덩어리가 box prediction들을 의미한다.
  • 원래 object detection에서 각 proposal에 대해 object인지/아닌지, class는 뭔지 두가지를 알려주는 head가 있었던걸 생각하자. transformer output에도 이런 처리를 해줄거라고 예상해볼 수 있다.

 

Input & Output

  1. 이미지.
    feature를 뽑는다.
  2. 인코더.
    feature를 transformer encoder에 넣는다. (positional embedding 당연히 같이 들어간다.)
  3. 디코더.
    decoder input으로
    1. object queries와 함께, 2. encoder output을 같이 넣는다.

    (이해1) transformer에서 영어-프랑스어 번역기를 생각하면, input으로 1. <sos> token (+inferenced output. 지금까지 생성한 프랑스어 단어) + 2. 영어를 인코딩한 벡터를 같이 넣었던걸 기억하자.

    (이해2)
    물론 학습시에는 teacher forcing을 사용했었기 때문에 마스킹한 GT 프랑스어 문장을 넣었었다.

    (이해3)
    그렇다면 여기서도 object queries는 단어들처럼 어떤 덩어리 여러개가 들어갈거라고 생각할 수 있다.
    1. object queries : learned positional embedding.
      풀어서 설명하자면, 각각의 덩어리에게 '너는 이 위치를 보렴. 오른쪽 아래에 뭔가 있을지도?' '넌 그림 한가운데를 잘 봐.' '넌 왼쪽 위와 아래를 주시하도록해.' 이런 느낌이다.

      position encoding은 sinusoid로 predefined인 경우도 있지만 (원래 transformer) BERT처럼 학습을 통해서 하는 경우도 있는데 여기선 미리 학습된 것을 사용했고, 이를 위해 attention layer를 사용하는 것 같다.
    2. encoder output
      방금 이미지를 sequence처럼 보면서 object detection을 위한 어떤 feature space로 인코딩 했었다. 그 feature들이다. 마찬가지로 각각은 이미지의 positional 정보도 같이 가지고있음을 기억하자. transformer 문장의 단어들처럼.
  4. decoder output : 서로 다른 object proposal에 대한 정보.
    뒤에서 언급하겠지만, 각각의 proposal마다 다른 object를 담당할수 있도록 loss를 사용했기 때문에, optimal하게는 이렇게 학습된다.
  5. Prediction Head : FFN을 거쳐 드디어 진짜로 우리가 아는 object proposal이 나온다.
    Final output : 각 proposals. y=(c, b).
    1. c : class (no object 포함)
    2. b : [0, 1] 사이의 4개의 값.

 

Loss?

그러면 어떻게 supervision을 줘서 학습시켜야하는가?

 

원래 transformer는 N개의 fixed size output이 나온다. (문장 끝이면 eos token이 나올 뿐이지)

여기서도 마찬가지로 N개의 object proposal이 나올 것이다.

=> bipartite matching loss 쓴다.

 

쉬운 예로는, 모든 proposal들이 "저기 고양이다!" "앗 고양이다!" "우왕 고양이다!" 죄다 이렇게 1:M matching이면 하나의 strong proposal에 대한것만 loss가 생겨버릴테니까, 아예 1:1 mapping을 강제하도록 pair-wise로 loss를 계산한다.

 

이를 위해 Match score를 계산하려면 당연히 bbox에 대한 값, class prediction에 대한 값을 정량화하는 식이 필요할 것이다.

 

헝가리안 로스랑 bbox loss를 쓰는데 논문을 더 읽어봐야겠다. 

반응형

댓글