ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [논문리뷰] BEVFormer: Learning Bird’s-Eye-ViewRepresentation from Multi-Camera Images viaSpatiotemporal Transformers
    논문 스터디 2024. 3. 8. 17:12

     

     

    논문 링크 : https://arxiv.org/pdf/2203.17270.pdf

     

    어쩌다 보니 이쪽으로 흘러들어와 방황한지 일 년이 넘었다. 이제 끝을 맺어야 할 것 같아 시작한 졸업 논문이 되었으면 하는 주제 Point cloud forecasting 에서 쓰이는 BEVFormer를 리뷰해보려 한다. 이어 BEVFormerV2도 리뷰할 예정이다. 

     

    논문을 읽었을 때는 읭 스럽다. 이게 어떻게 하다가 생각이 났는지, 왜 이게 되는지에 대한 설명이 좀 부족한 것 같다. Contribution은 Spatial attention, Temporal attention, BEV query 이다. 

     

    Motivation

     

    3D object detection과 segmentation에서 BEV 라는 representation을 사용했을 때 큰 이득을 보지 못했고, 그 이유는 2D plane에서 generate한 BEV feature가 ill-posed 되어있기 때문이라고 이야기한다. 그리고 이러한 BEV feature generating framework는 depth information에 sensitive하다. 이 부분은 나중에 언급하겠지만.. 저자들도 쓰면서 찔리지 않았을까ㅋㅋ

     

    아무튼 BEV라는 view를 만드는 방식에 문제를 제기하고, BEV feature를 만들 때 자율주행 차랑의 데이터 특성상 중요한 spatial 정보를 temporal 정보와 함께 사용한다는 점이 좋은 idea 라고 생각한다. 

     

    따라서 contribution을 조금 구체적으로 말하자면, transformer-based BEV encoder, named BEVFormer를 만들었고, BEVFormer는 multi-view cameras와 history BEV feature로부터 spatiaotemporal feature를 만들었다. 어떻게 만들었냐면,  grid-shaped BEV queries 를 만들어 spatial and temporal feature를 attention으로 fuse 했고, spatial cross-attention 모듈은 multi camera images로부터 spatial feature를 만들고, temporal self-attention은 history BEV feature로부터 temproal information을 뽑아낸다. 이렇게 만들었을 때, BEV feature는 moving object의 velocity estimation과 heavily occluded object의 detection 에 이점이 있다. 그리고 BEVFormer를 통해 만든 BEV feature를 가지고 Deformable DETR과 같은 head를 사용해 3d object detection과 segmentation 모델을 만들었다. 

     

    근데 grid-shaped BEV queries를 만들었다는게, 정확히 무슨 말인지 좀 헷갈린다. query가 learnable parameter인지, 아니면 그냥 grid 형식의 비어있는 tensor 인지.. 비어있는데 점점 feature map이 되는건가?

     

    Related work

    첫번째 related work로 Deformable DETR을 설명한다. Deformable attention은 Deformable convolution과 원리가 같다. global attention은 computational cost가 크니까 learnable parameter인 offset을 두고 그 현재 위치 + offset의 token을 attention의 key로 넣는다.

    $$\text{MultiHeadAtttn}(z_q,x) = \sum_{i=1}^{N_{head}} \mathcal{W}_i \sum_j^{N_{key}} \mathcal{A}_{ij} \cdot \mathcal{W}_i'x_j$$

    $$\text{DeformAttn}(q,p,x) = \sum_{i=1}^{N_{head}}\mathcal{W}_i \sum_{j=1}^{N_{key}} \mathcal{A}_{ij}\cdot \mathcal{W}_i'x(p+\triangle p_{ij}) $$

     

    식을 뜯어보자. 일단 $q$는 query, $p$는 reference point, $x$는 input features 이다. $\mathcal{A}_{ij}$는 predicted attention weight이고 1로 normalize되어 있다. $ \triangle p_{ij} $는 predicted offset이다. 기존 MultiHeadAttn 식으로부터 $x$에 offset만이 추가되었다. 

     

    두번째 related work로 camera-based 3D perception을 소개한다. FCOS, DETR3D는 depth estimation으로부터 depth information을 뽑아 BEV feature를 만들었고, OFT, ImVoxelNet은 predefined voxel을 image에 project 했다?고 한다. M2BEV는 feasibility를 explore 했다고 하는데 뭔말인지 모르겠다.

     

    사실 근데 multi-camera에서의 BEV feature는 segmenation에서 많이 연구되었다. Inverse Perspective Mapping(IPM)을 이용해 perspective view에서 BEV로 convert하는 방법이 있고, Lift-Splat 방식은 depth distribution을 통해 BEV feature를 generate한다. PYVA는 cross view transformer를 제안한다. 

     

    그리고 Temporal information을 고려한 기존 연구들도 있었는데, 이전 timestamp 의 BEV feature를 stack하는 방식이었다. stack하는 방식은 근데 extra computational cost가 든다고 한다. 모아서 한꺼번에 처리하니 computaional cost도 들고 memory cost도 들것 같긴하다. 그래서 본 연구에서는 spatiotemporal transformer로 BEV feature를 generate하여 little computational cost가 든다.  

     

    BEVFormer

    1. Overall  Architecture

     

    나는 아키텍쳐 사진이 이해가 안간다. 그리고 매우 비효율적이게 보인다. 물론 depth estimation을 안한다는 장점이 있지만, image backbone을 depth estimation으로 pretrain된 네트워크를 썼다는데 무슨 의미가 있나 싶다. 

     

    아무튼 History BEV 와 BEV query 가 input으로 들어가서 저 블록을 6개를 지나면 current BEV가 나온다. 그리고 block은 Temporal self attention과 spatial cross attention이 있다.

     

    그리고 이해가 안가는 건 spatial cross attention인데, resource efficient하기 위해 deformable attention을 사용했고, (b)에서 보는 바와 같이 BEV plane위의 each query를 pillar-like query로 lift 한뒤, $N_{ref}$ 3D reference point를 pillar로부터 sample한다. 그리고 이 points를 2D view로 project한다. 한 BEV query에 대해서, projected 2D points는 몇개의 view에만 hit하고 나머지는 hit하지 않는다. 여기서 우리는 hit view를 $\mathcal{V}_{hit}$ 이라고 칭한다. 그 다음, 이런 2D points를 query $Q_p$의 reference points로 삼는다. 그리고 이런 reference points 주변의 $\mathcal{V}_{hit}$로부터 feature를 sample한다. 마지막으로, sampled features를 weighted sum 한다. 식은 다음과 같다. 

    $$\text{SCA}(Q_p, F_t) = 1/|\mathcal{V}_{hit}|\sum_{i \in \mathcal{V}_{hit}} \sum_{j=1}^{N_{ref}} \text{DeformAttn}(Q_p, \mathcal{ P }(p,i,j), F_t^i)$$

    $i$는 camera view이고 , $j$는 reference points이고, $N_ref$는 each BEV query의 total reference points이다. $F_t^i$는 $i$번째 카메라 뷰의 feature이다 각 BEV query $Q_p$에 대해서,$i$번째 view 이미지의 $j$번째 reference point를 얻기 위해  project function $\mathcal{P}$가 사용되었다. 

     

    나만 이해가 안가나? 다시 천천히 생각해보면, deformable Attention의 input은 (query, reference point, input feature) 인데, 여기서 reference points $N_{ref}$중 j번째 point + offset과 query의 deformable attention을 구한다. 이때 point는 i번째 view의 j번째 reference point이다. 근데? 이 점을 view에 projection 시키고 deformable attention을 구한다. 왜? 원래 point들은 query에 있던 pillar에서 sample한 point이니까. 근데? query는 temporal self attention 밖에 안지났는데 왜 여기서 점을 sample하지? 좀더 생각해봐야겠다. 

     

     

    temporal self attention을 보면, self attention은 input과 output이 같고 query가 key value랑 같은건데, input으로 history BEV랑 Query를 넣고 output으로 query만 나와서 self attention이라는 말이 일단 마음에 안든다. 중간의 self라는 말을 안보고 둘의 attention을 구해? 처음 query와 더한다. 근데 비어있을 query랑 뭐하러 attention을 구하지? 코드를 봐야 알 듯하다. 

     

    그리고 self attention도 deformable attention을 사용했다. 

     

Designed by Tistory.