[ECCV 2020] End to End Object Detection with Transformers

Before Review

새해 맞이 첫 논문 리뷰는 DETR 입니다.

신년 세미나에서도 간단하게 연구 방향을 설명 드리긴 했지만, 다시 한번 말씀 드리자면 올해 해보고 싶은 연구 방향 중 하나가 바로 DETR을 활용한 object-centric representation 입니다.

Object Detection을 하겠다는 의미가 아니라 object 끼리의 상호작용을 표현할 수 있는 feature representation을 고도화 하고 싶고 이를 활용하여 다양한 video understanding task에 접목 시키고 싶은 것이죠.

DETR을 읽으면서 꽤나 인상 깊게 읽었습니다. 공감이 되는 부분도 많았구요.

리뷰 시작하기 전에 이상인 연구원이 작성한 DETR 리뷰에서 헝가리안 알고리즘을 참고하시면 더욱 좋을 듯 합니다.

그럼 리뷰 시작하도록 하겠습니다.

Introduction

Object Detection은 전통적으로 컴퓨터 비전 학계에서 가장 근본적으로 다루어진 문제 입니다. 근본적으로 Object Detection은 이미지에 존재하는 bounding box와 그에 해당되는 category label의 집합을 예측하는 문제라고 볼 수 있습니다. 기존 object detection 연구들은 딥러닝을 접목 시켜 괄목할만한 성능 향상을 이끌어낸 것은 맞지만 거기에는 굉장히 복잡한 처리 방식이 존재했습니다.

Detection 코드를 직접 까보신 분들은 알겠지만, anchor box를 만들고 NMS를 처리하는 부분이 굉장히 복잡하게 설계 되어 있습니다. 사실 이러한 부분은 학습이 되는 구조도 아니면서 performance에는 많은 영향을 끼치게 됩니다. 따라서 진정한 의미의 end-to-end 방식이 아니라고 볼 수 있죠.

본 연구는 진짜 End-to-End Object Detection 을 제안합니다. 미분 불가능한 연산은 일체 존재하지 않는 DETR(DEtection TRasnformer)을 제안합니다. 우선 기존 Faster RCNN과 이번에 제안하는 DETR의 전체적인 흐름을 한번 비교해보도록 하겠습니다.

아래의 그림은 Meta AI 블로그에서 가져온 그림 입니다.

Faster R-CNN과 DETR의 구조를 비교하는 그림 입니다. 해당 구조에 대해서 자세하게 말씀 드릴 것은 아니고 느낌만 조금 보도록 하겠습니다.

Faster R-CNN의 코드를 까본 사람을 알겠지만 anchor 만들고 roi pooling하고 NMS 때리고 하는 과정들이 정말 복잡하게 코딩 되어 있어요. 어떤 동작은 CPU에서 작동하고 어떤 동작은 GPU에서 작동하고 아주 그냥 잡 기술의 끝판왕 입니다. 선행 연구를 폄하 하려고 하는건 아니지만 그래도 공부하거나 활용하는 입장에서 이해하기 꽤나 어려운 것은 분명한 사실 입니다.

그에 반해 제안하는 DETR 구조는 정말 간단합니다. 사전학습된 ResNet을 가지고 CNN feature를 추출하고 Transformer Encoder-Decoder 구조를 활용하여 detection 결과를 예측 합니다. 이게 전부 입니다. 본 논문에서는 prior knowledge (e.g., anchor, NMS)와 같은 component 없이 굉장히 simple한 파이프라인을 구축했다는 것 이죠.

기존 구조는 성능을 위해 고려해야할 것들이 많았지만 제안하는 DETR은 그러한 복잡한 설계 없이도 경쟁력 있는 성능을 달성하였습니다. 물론 여기서 경쟁력 있는 성능이라 표현한 이유는 모든 지표에서 완벽하게 기존 베이스라인을 넘어서지는 못하고 부분적으로 아쉬운 모습도 있기 때문 입니다.

위의 그림은 제안하는 DETR의 간단한 구조도 입니다. 사실 저게 다이기도 해요. 저도 논문을 보면서 느꼈지만 정말 복잡한 detection framework를 굉장히 단순화 시켰구나 느꼈습니다.

제안하는 DETR의 핵심은 두가지 입니다. 바로 1) Transformer, 2) Bipartite matching loss 로 정리할 수 있죠.

Transformer는 우리가 알던 그 Transformer가 맞습니다. 저는 논문을 읽기 전에는 그 ViT를 생각하고 있었는데 그냥 NLP에서 사용하는 Transformer 였습니다. Bipartite matching loss는 위에서 설명한 헝가리안 알고리즘과 관련이 있습니다. 결국 Object Detection은 Set Prediction 문제인데 여기서 Transformer를 타고나온 예측 set과 실제 정답 set간의 일대일 매칭을 수행합니다. 물론 cost가 가장 낮아지는 matching을 찾는 것이 목표 입니다. 이를 수행하는 것이 bipartite matching loss 입니다.

방법론적인 얘기는 조금 뒤에서 하도록 하고 DETR의 contribution에 대해서 정리하고 마무리 하겠습니다. DETR은 기존 object detection의 복잡한 파이프라인을 transformer 구조와 bipartite matching loss를 활용하여 굉장히 단순화 시켰습니다. 또한 제안하는 구조가 단순히 detection 뿐 아니라 다른 task (e.g., panoptic segmentation)에서도 좋은 성능을 보여줍니다. 마지막으로 기존 Faster R CNN 베이스라인대비 경쟁력 있는 성능을 달성하면서 진정한 end-to-end object detection의 포문을 열었습니다.

The DETR model

Object detection set prediction loss

우선적으로 DETR은 고정된 N개의 prediction만 반환 합니다. Transformer의 Decoder에서 나온 예측이 N개의 object만 처리할 수 있다는 의미입니다. NMS와 같은 알고리즘을 사용하지 않기 때문에 예측 결과가 이미지 마다 다르지 않고 고정되어 있습니다.

통상적으로 N은 이미지에 존재할 수 있는 객체의 갯수 보다 더 큰 숫자를 사용합니다.

자 그럼 일단 Loss를 한번 가정해보도록 하겠습니다.

Decoder를 통해서 N개의 prediction이 나왔습니다. 기본적으로 N이 실제 이미지에 있는 object의 갯수보다 많기 때문에 ground-truth는 그 차이 만큼 \phi (no object) 로 패딩처리 됩니다.

그리고 우리는 여기서 헝가리안 알고리즘을 통해 ground-truth와의 최적의 matching \hat{\sigma}을 탐색합니다.

우선 헝가리안 알고리즘을 활용하기 위해서는 matching cost가 정의 되어야 합니다. Prediction과 GT를 비교할 때 cost를 의미하겠죠. 우선 임의의 i번째 element에 해당하는 ground truth는 아래와 같이 정의 됩니다.

  • y_{i}=(c_{i},b_{i})

여기서 c_{i}는 category label로 경우에 따라서는 \phi (no object) 일 수 있습니다. 그리고 b_{i} \in [0,1]^{4}는 박스 좌표겠네요.

그리고 우리가 헝가리안 알고리즘 과정에서 i번째 element에 ground truth와 matching 되는 \sigma(i)번째 예측값에 대해서는 아래와 같이 표기합니다.

  • \hat{p}_{\sigma(i)}(c_{i}) : c_{i}에 대한 confidence score 입니다. 분류를 위한 확률이라 생각하시면 됩니다.
  • \hat{b}_{\sigma(i)} : 예측 box의 좌표 입니다.

이러한 notation을 바탕으로 matching cost는 아래와 같이 정의 됩니다.

  • \mathcal{L}_{match} (y_{i},\hat{y}_{\sigma (i)} )=-\mathbb{1}_{\left\{ c_{i}\neq \phi \right\}  } \hat{p}_{\sigma (i)} +\mathbb{1}_{\{ c_{i}\neq \phi \} } \mathcal{L}_{box} \left( b_{i},\hat{b}_{\sigma (i)} \right)  
출처 : 꼼꼼한 딥러닝 논문 리뷰와 코드 실습, 나동빈 (DETR)

결국 \phi (no object)를 제외하고 confidence score에 대한 term과 box 좌표에 대한 term의 선형 결합으로 이루어져 있습니다. 여기서 matching cost의 경우 confidence score에 대해서는 log-probability가 아니라 그냥 probability를 사용해주는 것이 경험상 더 성능이 좋다고 합니다.

자 이렇게 해서 matching cost가 정의 됐습니다. 여기서 matching cost는 전체 Loss가 아닙니다. 최적의 matching을 위한 cost이지 최적의 matching을 찾았다면 다시 최종 loss를 계산해야 합니다. 본 논문에서는 Hungarian loss라고 정의합니다.

여기서 이제 \hat{\sigma}는 앞선 matching cost를 가장 작게 만드는 최적의 할당이라 보시면 됩니다. 여기서 구현상 디테일을 조금 설명 드리면 c_{i}=\phi인 no object 상황이 학습을 압도하는 것을 방지하기 위해 loss 를 10만큼 나누어 scale을 조금 조정했다고 합니다. 또한 matching cost와 달리 log-probability를 사용해주고 있습니다

Bounding box loss

다음으로 \mathcal{L}_{box}(\cdot)은 당연히 박스 좌표를 보정해주는 term 입니다. 기존의 detector들은 anchor 박스를 설정하고 gt box와의 차이를 바탕으로 학습을 진행했는데 여기서는 그게 아니라 box prediction을 directly하게 진행하고 있습니다.

하지만 여기서 박스 스케일에 따라 loss가 서로 다른 scale을 가지기 때문에 이를 완화하기 위해 scale invariant할 수 있는 generalized IoU loss를 사용했다고 합니다.

  • \mathcal{L}_{\text{box} } (b_{i},\hat{b}_{\sigma (i)} )=\lambda_{\text{iou} } \mathcal{L}_{\text{iou} } (b_{i},\hat{b}_{\sigma (i)} )+\lambda_{\text{L1} } \parallel b_{i}-\hat{b}_{\sigma (i)} \parallel_{1} 

L2 Loss 혹은 Smooth L2 Loss를 많이 사용하는 것으로 알고 있는데 여기서 L1 Loss를 사용한 이유에 대해서는 따로 서술하지 않고 있습니다.

DETR architecture

Loss는 위에서 다뤘으니 이제 구조에 대해서 알아보도록 하겠습니다.

사실 구조적인 측면에서 어려운 부분은 전혀 없습니다. 다만 positional encoding 관점에서 디테일만 조금 신경 써주시면 될 거 같네요.

Backbone

ViT를 사용하는 것이 아니기도 하면 애초에 ViT가 나오기 전에 개제된 논문이라 patch embedding이 아닌 CNN feature를 활용하여 Transformer의 입력으로 넣어줍니다.

여기서 CNN feature는 가장 널리 사용되는 ResNet50 혹은 ResNet101을 사용했다고 합니다.

  • x_{\text{img} }\in \mathbb{R}^{3\times H_{0}\times W_{0}} \rightarrow f\in \mathbb{R}^{C\times H\times W} 

이 때 채널 C는 2048차원을 가지고 있으며 공간적 해상도는 32배 (H,W=\frac{H_{0}}{32} ,\frac{W_{0}}{32} ) 다운 샘플링 된다고 합니다.

Transformer encoder

Transformer encoder는 우리가 흔히 아는 Transformer encoder가 맞습니다. Backbone을 통해서 얻은 CNN feature를 그대로 사용해주는 것은 아니고 1 by 1 Convolution을 통해 channel dimension을 수행합니다.

  • f\in \mathbb{R}^{C\times H\times W} \rightarrow z\in \mathbb{R}^{d\times H\times W} 

그리고 여기 공간적 구조를 1d로 flatten 하여 encoder에 얻을 수 있는 형태로 reshape 해 줍니다.

  • z\in \mathbb{R}^{d\times H\times W} \rightarrow z\in \mathbb{R}^{d\times HW} 

이 때 기본적인 transformer encoder는 permutation-invariant 합니다. 왜냐하면 self-attention 연산이 permutation invariant 하기 때문이죠. 하지만 여기서는 이미지의 locality에 대한 순서가 중요하기 때문에 permutation-invariant한 성질을 좀 죽여야 합니다.

그래서 매 attention layer마다 고정된 positional encoding을 더해줘서 이를 방지하고자 합니다.

Transformer decoder

Transformer decoder 역시 우리가 흔히 아는 Transformer decoder가 맞습니다. 하지만 여기서 달라지는 부분이 조금 있습니다. 일단 여기서 N개의 object query를 사용합니다. 개념이 조금은 추상적일 수 있습니다.

우선 Transformer의 Decoder에서 Key, Value 값을 encoder의 출력으로 활용합니다. Key와 Value는 이미 앞선 CNN feature 들 끼리의 dependency가 녹아져 있는 정보라 볼 수 있습니다. 이를 바탕으로 N개의 Object를 가정하고 복호화를 시도해야 합니다.

이를 위해서 저자는 학습 가능한 N개의 embedding을 object query로써 사용합니다. N개의 embedding이 서로 다른 object를 책임져주는 것이죠. 그리고 이 N개의 object query가 여러개의 decoder layer를 거치고 나면 N개의 object에 대한 예측 값이 될 것이다 라고 가정하는 것 입니다.

이렇게 decoder를 거치고 나온 N개의 object feature를 활용하여 이제 Class와 Box 좌표를 예측하는 것이 다음 과정입니다.

Prediction feed-forward networks (FFNs)

마지막 FC Layer는 간단합니다. 3-layer perceptron with ReLU라고 하네요.

따라서 Transformer encoder/decoder 그리고 FFN까지 합친 모든 구조는 위의 그림과 같습니다.

Auxiliary decoding losses

여기는 학습 과정에서의 디테일 입니다. Decoder Layer가 여러개 있을 텐데 중간 중간 weight를 공유하는 FFN을 붙이고 loss를 전달해주는 것이 성능이 더 좋다고 합니다.

약간 GoogleNet(?)이랑 비슷한 거 같습니다.

Experiments

실험은 COCO 2017에서 진행했다고 합니다. 학습 이미지 기준 평균 7개의 instance가 존재하고 최대는 63개의 instance가 존재한다고 합니다. N을 100으로 사용했기 때문에 놓칠 일은 없겠네요.

Comparison with Faster R-CNN

우선 Faster RCNN과의 비교 입니다. Faster RCNN은 2015년 나온 이후로도 지속적인 발전을 거쳐 성능을 많이 올린 상황입니다.

이 때 dilation convolution을 사용한 성능이 DC5로 표기되어 있습니다. 최종적으로 DETR-DC5-R101의 경우 \text{AP}_{75}\text{AP}_{S}를 제외하고는 모두 기존 베이스라인 대비 좋은 성능을 보여주고 있습니다.

대비되는 부분은 small에 대한 검출 성능과 large에 대한 검출 성능이 확실하게 차이가 나고 있습니다. 이러한 결과를 해석을 나름 해보자면

  1. ResNet의 가장 마지막 feature를 사용하기 때문에 detail에 대한 정보가 많이 손실 되었다. 이는 FPN 구조를 사용하여 기존 Faster R CNN 같은 경우 보완을 해주고 있는데 DETR 지금 구조에서는 아직 고려가 되지 않은 상황입니다.
  2. Self Attention 연산은 Large Object에 대해서 더욱 이득을 보기 쉽다. Convolution에 비해 Receptive field 로 부터 자유로운 attention 연산이기에 큰 물체는 잘 잡지만 작은 물체는 attention 연산이 별로 도움이 되지 않는 것이죠.

물론 DETR이 20년도에 개제된 연구이며 후속 연구(e.g., Deformable DETR)를 보면 small에 대한 성능도 많이 올라온 상황이긴 합니다.

Ablations

Number of Encoder Layers

Encoder를 아예 사용하지 않은 상황에서 Layer의 갯수를 늘려가며 비교한 실험 입니다. 전체적인 AP에서는 3.9 drop이 발생하고 large 상황에서는 6.0 drop이 발생하고 있습니다.

전반적인 scene reasoning 상황에서 globa한 정보를 capture할 수 있는 encoder의 역할이 중요하다고 주장합니다.

Encoder Self-Attention

실제로 encoder가 무슨 역할을 하는지 살펴보면 결국 물체들을 구분하는 역할을 수행하게 됩니다. 학습을 마치고 나서 attention 상황을 보기 위해 그림에서 4개의 픽셀이 어느 부분에 attention을 주고 있는지 보여주고 있는 시각화 입니다.

확실히 픽셀이 대응되는 물체와 높은 attention 가중치를 가지고 있어 물체를 서로 구분하는 모습을 보여주고 있습니다.

자기가 속해 있는 물체와 높은 상관관계를 가지는 것이 흥미롭습니다.

Number of Decoder Layers

x축은 decoder layer의 갯수 입니다. 여기서는 NMS를 추가하는 실험을 진행하였습니다.

Decoder layer가 적을 때는 물체들을 잘 구분을 못해서 하나의 물체에 여러개의 예측을 하려고 하는 경향을 보입니다. 즉, NMS를 통해 성능 이득을 보는 것이죠.

Decoder layer가 많을 때는 반대로 NMS를 한다고 해서 성능 이득이 거의 없습니다. 이는 이미 물체들을 잘 구분하고 중복되는 예측이 없다는 의미 입니다.

Positional Encoding & Loss ablation

positional encoding 먼저 보도록 하겠습니다. 결론적으로 positional encoding이 중요한데 여기서 입력에 한번만 해주는 것이 아니라 매 attention layer에 입력으로 넣을 때 마다 해주는 것이 최종적으로 더 좋은 성능을 보여주고 있네요.

Loss ablation에서는 IoU의 역할이 중요한 것 같습니다.

Analysis

해당 시각화는 예측 박스에 대한 시각화 입니다.

green에 대한 포인트는 작은 박스, red는 large horizontal, box는 large vetical box 입니다.

이 때 각 object query는 특정한 박스 크기에 대해 예측을 수행하며, 학습된 query가 object의 위치에 따라 다양하게 반응하는 모습을 보여주고 있습니다.

결국 object에 위치와 크기마다 반응하는 query가 다양하다고 보시면 될 거 같네요.

DETR for panoptic segmentation

panoptic segmentation은 instance + semantic segmentation이라 보면 됩니다. 제안하는 DETR 스타일의 구조를 바탕으로 panoptic segmentation에서도 나름 잘 작동하다는 실험을 보여주고 있습니다.

테이블을 보시면 모든 지표는 아니지만 DETR 구조가 panoptic segmentation에서도 꽤나 괜찮은 성능을 보여주고 있습니다.

이쪽 task에 대한 정성적 결과는 처음 보다 보니 음 그래도 나름 잘 잡는 거 같네요..? 느낌적으로는ㅋㅋ

Conclusion

Object Detection은 복잡한 잡기술이 난무하는 연구로 알고 있었는데 해당 연구가 Transformer 구조를 바탕으로 나름 교통 정리를 한 것 같습니다.

저는 앞으로 리뷰에서 DETR의 후속 연구 중 object detection에 집중하는 것이 아니라 DETR을 통한 object centric representation으로 다양한 머신 비전 문제를 푼 연구들을 찾아 follow up 하도록 하겠습니다.

리뷰 읽어주셔서 감사합니다.

Author: 임 근택

6 thoughts on “[ECCV 2020] End to End Object Detection with Transformers

  1. 안녕하세요 ! 좋은 리뷰 감사합니다.
    N개의 prediction이 나온다는 것이 전체 bounding box 예측이 N개라는 뜻이 맞는 것이죠 ? 서로 다른 object라는 것이 라벨이 다른 것을 의미하는 것인지 단순 검출하는 여러 물체를 의미하는지 궁금합니다.
    그리고 no object 상황이 학습을 압도하는 것을 방지하기 위해 loss를 10만큼 나누는 것이 어떻게 scale을 조정하는 효과가 있는 것인지 잘 이해가 되지 않아 추가적인 설명 해주시면 감사하겠습니다 . .
    마지막으로 제가 알기로는 헝가리안 알고리즘이 사용하는 데이터의 수가 많을수록 효율성이 떨어진다고 알고 있는데, 헝가리안 알고리즘이 inference에도 사용되나요 ? 만약 사용된다면 비효율성을 해결하기 위해 따로 방법론에서 제안한 것이 있을까요??
    감사합니다.

    1. 1. N개의 예측일뿐 N개의 object를 의미하는 것은 아닙니다.

      2. loss를 10만큼 나누는 것은 결국 gradient의 scale을 조절하는 것과 같습니다. 10으로 나눈 만큼 gradient의 magnitude를 10만큼의 scale로 줄여서 학습의 영향력을 낮추는 것이라 보면 되겠네요.

      3. inference 시에는 사용하지 않는 것으로 알고 있습니다. 애초에 inference에는 GT가 없으니 matching을 할 이유도 없으니 말이죠. 효율성 관련해서는 complexity를 계산한 것이 논문에 있었는데 자세히 읽어보지는 않아서 모르겠습니다.

  2. DETR을 이용한 후속 연구를 진행하신다고 하셨는데, 어려운 논문 읽고 리뷰하시느라 고생하셨습니다.
    역시 깔끔하게 잘 정리하시네요 ㅋㅋㅋ

    DETR은 anchor-free를 transformer로 처음 적용한 논문으로 나름 주목을 받았습니다.
    허나, 몇 가지 단점이 존재합니다. anchor-free이지만 무조건 patch 만큼 연산을 수행해야 하고, 그 이상의 물체가 등장하는 경우에는 예측을 못한다는 단점이 존재합니다. 물론 patch가 증가시키면 되지만 다시 학습을 진행해야 하고 그만큼 리소스가 늘어난다는 단점이 있습니다.

    그리고 Bipartite matching loss도 문제점 중 하나인데요. 근택님이 말씀하신 것처럼 기존 검출기는 CPU 연산을 수행하는 NMS가 문제죠. DETR은 anchor-free, 즉 NMS를 수행하지 않는 것이 장점 중 하나입니다. 근데
    제가 볼 때는 Bipartite matching loss가 NMS랑 비교 했을 때, 방식이 달라진 것이지 크게 다른 것이 없지 않나 싶습니다. 그리고 anchor 기반의 단점이 지정된 갯수 + 비효율적인 연산인데, 해당 기법도 patch 만큼 연산 하는 것이라 해당 단점을 해소하지는 못하는 것 같아요. 근택님은 어떻게 생각하시는 궁금합니다.

    그리고 원하시는 모델이 ViT을 기반으로 하는 모델을 찾으시는 것 같던데…
    ViT-Det이라는 논문이 도움이 될 것 같아요. 논문의 링크는 아래에 첨부해 두었습니다. 연구하시는 데에 도움이 되었으면 좋겠습니다.
    https://arxiv.org/abs/2203.16527

    1. 아까도 얘기해주셨지만 일단 DETR과 관련된 인사이트 제공 감사합니다.

      저도 matching loss가 NMS를 대체할 수 있다고는 생각하지 않습니다. 다만, 학습을 간단하게 해준 것에 대해서는 나름 의미가 잇다고 생각이 드네요. 후속 연구들을 아직 잘 몰라서 어떤 것을 좋을까에 대한 깊은 고민을 잘 못하겠지만

      저 개인적으로는 Detection 코드 건드릴때 NMS 관련해서 CPU/GPU 변환 과정이 꽤나 복잡했어가지고 비슷한 성능을 얻을 수 있다면 간단한 구조가 좋지 않을까 싶네요.

      ViT 백본의 논문도 한번 읽어보겠습니다. 감사합니다

  3. 좋은 리뷰 감사합니다.
    저도 산자부 과제를 진행하면서 detection 모델의 NMS 과정, CPU-GPU 사이의 메모리 변화 과정이 되게 바틀넥으로 느껴졌었는데 이 논문을 보니까 반갑네요.
    N개의 object가 있다고 가정하고 충분히 큰 N 값을 미리 선정한다고 하셨는데요, 이 값은 학습때 딱 고정해놓으면 TEST 과정까지 계속 고정인건가요? 그럼 N의 값은 몇정도를 사용했는지에 대한 언급이나 실험은 있나요??
    감사합니다.

    1. N은 100으로 사용했다고 하네요. 학습 데이터 기준 최대 instance가 63개라 100 정도면 커버할 수 있을 거 같습니다. inference도 당연히 동일해야 학습때 사용했던 FFN의 weight를 그대로 사용할 수 있겠네요.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다