본문 바로가기
Object Detection/Transformer Dectection

[Object Detection] Anchor DETR 리뷰 (AAAI2021)

by pulluper 2023. 3. 21.
반응형

안녕하세요 pulluper 입니다. 

이번 포스팅에서는 AAAI 2021 에서 제안된 Anchor DETR 을 리뷰해보도록 하겠습니다. 

논문은 다음과 같습니다. https://arxiv.org/abs/2109.07107

 

참고로 DETR은 다음 포스팅을 참고하시면 좋겠습니다. 

https://csm-kr.tistory.com/71

 

[Object Detection] DETR(DEection TRasformer ECCV2020)리뷰 및 구현

안녕하세요 Pulluper 입니다 :) 이번시간에는 Transformer 를 이용한 Object Detection 방법인 DETR 에 대하여 알아보겠습니다! https://arxiv.org/abs/2005.12872 본 포스팅의 내용은 크게 Introduction, Network, Loss 로 이

csm-kr.tistory.com

 


[문제제기] 

 

기존의 DETR의 구조를 보면, object query 는 특정한 물리적 의미가 없는 학습된 임베딩입니다. 따라서 실제로 어디에 집중하는지 모른다는 점이 문제가 됩니다. 이 논문에서는 anchor point 를 기준으로 object query를 디자인 합니다. 즉, anchor point의 주위로 학습이 되도록 합니다. 결과적으로 기존 500 epoch 을 학습해야했던 성능을 50 epoch 으로 학습가능하게 하였습니다. 즉, 수렴속도를 1/10으로 감소시켰습니다. 

 

그림1. Anchor DETR의 object query 수렴 위치 시각화

위 그림은 제안하는 방법에 대한 object query의 예측 slot 위치 시각화입니다. 

맨 마지막 row의 anchor point 에 대한 query들의 집중이 기존 DETR보다 잘 되는것을 볼 수 있습니다. 


 [object query]

 

object query 는 무엇일까요? 

다음 그림과 같이 object 를 뜻하는 학습가능한 parameter 입니다. 

기존 DETR에서는 100 개의 object 를 가정하고 이에 대하여 class 분류와 box 회귀를 진행합니다. 

그림2. DETR에서 object query

구체적으로 object queriers를 연산할때는 

target 1) t를 init 해 주어야 하고, 2) 이에 t에 더해지는 query_embed 를 만들어주어야 합니다.

기존 DETR은 1) t를 init 할 때 0으로 만들고 2) query_embed는 nn.Embedding을 이용합니다. 

이후 transformer를 통해 나온 t(target)에 대하여 class, box 에 대한 각각 branch network 를 통과하여 

[B, 100, 92], [B, 100, 4]의 output을 출력하게 됩니다. 

즉, object query는 object를 만들어주는 container 라고도 생각할 수 있습니다.


[문제가 모다?]

 

다시 논문에서 언급하는 문제를 생각 해 보면, object query 가 단순히 0으로 init 이 되고, embedding을 사용하면, object quert 가 어디를 보는지 구체적으로 모르겠다는 것 입니다. 논문에서는 이를 새로운 object query design과 RCDA(row column decouple attention) 을 제안합니다. 

 

본 포스팅에서는 빠른 수렴을 위한 object query design 에 대하여 집중하여 다루겠습니다. 


[novel query design]

 

제안하는 query design은 두 가지로 나눌 수 있습니다. 

첫번째는 anchor point 를 이용해서 anchor point 기준으로 object query를 학습하는것이고 

두번째는 pattern embeddings 를 통해서 각 anchor point 마다 multiple의 object 를 학습시키는 것입니다. 

 

1. anchor point to object query

 

논문에서는 두 가지 방법으로 anchor point 를 적용하였습니다. 첫 번재는 grid 방법(아래 그림의 왼쪽)이고 두 번째는 learnable anchor point(그림의 오른쪽)로 Unif(0~1) 에서 anchor point의 갯수만큼 sampling 하는 것 입니다. 결과적으로는 후자가 더 좋은 성능을 가집니다. 

아래 수식을 보면 (4)에서 Pos_q 는 [300, 2]의 anchor point 입니다. 

anchor point 를 뽑아서 Encode() 함수로부터 [300, 256] 으로 feature 를 확장시킵니다. 

 

 

Encoder() 함수는 g로 나타나져 있는데 g_sin 와 MLP로 이루어져 있습니다. 

즉, g() 함수는 기존에 사용했던, sinusoidal positional encoding 와,

본 논문에서는 추가적으로 2개의 층으로 이루어진 MLP를 이용합니다. 

 

위식을 코드로 나타내면 

g = sinusoidal positional encoding + mlp = self.pos2d_proj(pos2d())

이고 이 두개를 통과하여 Q_p를 만들어냅니다. 

 

 

2. pattern embedding

 

pattern embedding 은 하나의 anchor point에서

여러개의 prediction 을 하기 위해서 고려된것으로 다음과 같이 나타냅니다. 

N_p 는 pattern의 갯수(구현에서 3을 사용), C 는 channel 입니다. 

 

 

이는 코드로 다음과 같이 구현되고 이것이 tgt 로 사용됩니다. 

마지막으로 decoder 의 query Q  = Q_f^init + Q_p 입니다. 

이는 cross attention 의 Q는 pattern embedding 을 통해서 만든 tgt(q_f^init) 과

1. anchor point to object query 에서 다룬 query_embed(q_p) 를 더한다는 뜻입니다. 

 

 

이렇게 Anchor DETR에서는 두가지 방법으로 Novel 한 Query Design 을 제안했고 이를 

기존 DETR과 비교하면 다음과 같습니다. 

 


[experiment and results]

 

1. ablation 

 

첫 표는 RCDA와 anchors, patterns 에 대한 절제연구입니다. 

anchor 와 patterns 를 이용한 anchor detr(DC5)이 50 epoch 이후 

그렇지 않은 실험보다 약 5 mAP 가 높은것을 볼 수 있습니다. 

ablation study of anchor DETR

두번째는 anchor point와 pattern의 수에 관한 절제연구인데, 300, 3이 가장 좋은것으로 볼 수 있습니다. 

 

2. comparison

 

이번에는 비교표 입니다. 

그런데 50 epoch 만 학습을 하였는데도, 기존의 DETR 보다

성능을 많이 올린 논문을 여럿 볼 수 있었습니다. 

 

다음 포스팅에서 Deformable DETR등의 알고리즘등은

어떻게 수렴속도와 성능을 늘렸는지 알아보겠습니다. 

comparison of the anchor detr

네 이번 포스팅에서는 AAAI2021 에 발표된 anchor detr에 대하여 알아보았습니다. 

질문과 의견은 항상 환영합니다. 

감사합니다. 😃😃😃

반응형

댓글