1day_1paper icon indicating copy to clipboard operation
1day_1paper copied to clipboard

[33] Dynamic DETR: End-to-End Object Detection with Dynamic Attention

Open dhkim0225 opened this issue 3 years ago • 0 comments

microsoft 에서 밀고 있는 DETR. Dynamic DETR. paper

image

Dynamic DETR

overview 이다. 아래 설명을 읽다가 overview 그림을 한 번씩 다시 봐주면 이해가 편할 것이다. image

Revisit DETR

DETR 은 단순 transformer 에다가 learnable query 를 둔 형태였다. resnet-50 을 통과시켜서 얻은 feature 를 transformer 에 박는다. image

attention 을 굳-이 다시 수식으로 표현하면 다음과 같다. image

encoder self-attention 과 decoder cross-attention 에서 큰 cost 가 발생하니까 dynamic attention을 활용하자!

Dynamic Encoder

self-attention 을 approximate 하기 위해 convolution-based approach 를 사용한다. feature pyramid P = {P1, P2, ... , Pk} 가 있다고 해보자 (보통 detector에서는 k == 5) ~굳이 예를 들자면 resnet 50 통과키셔서 나온 5개의 feature~

우선 여기에 pyramid conv 를 적용해준다. 아래 이미지는 pyramid conv 논문에서 가져왔다. image

이를 수식으로 나타내 보면 다음과 같다. image pyramid conv 는 주변 3개 scale을 같은 크기로 맞춘다음 summation 때려버리는 방법이다.


근데 이게 무슨 self-attention 을 대체한다는 말인가! 유의미하려면 여기에 deformable 정도는 얹어주어야 한다. image


이렇게 뽑아낸 feature 들을 pyramidconv 처럼 그냥 더해주지 말고, se-module 을 한 번 적용해 줘서 중요도를 반영, 합쳐준다. image


여기에 마지막으로 dynamic relu를 끼얹는다. image image


위 방식을 하나의 수식으로 나타내면 다음과 같다. (k 는 fpn feature 개수) image

상당히 흥미롭다. 결국, transformer encoder 는 안 쓰이는 것이 아닌가!

Dynamic Decoder

decoder 는 transformer based 이다. 다른 점은,

  1. cross-attention 부분을 dynamic convolution으로 대체 시켰다.
  2. ROI pool 을 쓴다. (?!)

ROI pool 부터 살펴보자. position embedding 을 learnable Box encoding 으로 바꾸었다고 한다. box encoding 은 학습이 시작할 때 전체 이미지를 cover 하는 box 로 initialize 된다. image q 는 query embedding 의 크기. 300 이다.

encoder output P_{enc} 와 B, pooling size r 을 이용해 pooling 을 수행한다. image F 는 q x r x r x d 의 크기를 가진다. (q 개의 box 를 r x r 크기로 roi-pool 시켜 버리기 때문) d 는 P_{enc} 의 dimension 이다.


이제 dynamic conv 를 살펴보자 docoder 의 입력은 DETR 처럼 qxd 크기의 object query 가 들어간다. 일반적으로 하듯이 self-attention 을 거쳐 Q* 을 얻어낸다. image

여기서 dynamic filter 를 생성하게 되는데, 단순히 fc 하나를 통과시킨다. 그니까, filter weight 자체를 생성해 낸다는 말이다. image

ROI pool output 인 F 에다가 뽑아낸 filter weight 로 1x1 conv 를 태운다. image

이렇게 뽑아낸 Q^F 를 이용해서 다음 3가지를 뽑아내게된다.

  1. 다음 layer 의 input 으로 들어가는 object embedding Q^
  2. 다음 layer 에서 사용할 box-encoding B^
  3. 최종 output인 object class C^

decoder 쌓을 때는 Q^, B^ 를 뱉고, 마지막 decoder block 에서는 C^ 를 내뱉는 것. image

Results

image image

dhkim0225 avatar Nov 29 '21 12:11 dhkim0225