1day_1paper
1day_1paper copied to clipboard
[27] SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers
- positional encoding 이 필요없고, multi-scale output을 내는 encoder 제안
- MLP decoder + (local attention, global attention) 을 잘 조합
SegFormer
(H×W×3) 이 들어왔을 때, (4×4) 크기의 patch 로 자른다. ViT 가 16x16 이었던 걸 생각하면 상당히 작은 patch 인데 이렇게 하는 편이 dense prediction task에 잘 맞는다.
이걸 hierarchycal transformer 에 넣어서 {1/4, 1/8, 1/16, 1/32} output들을 뽑아주게 된다.
Hierarchical Transformer Encoder
Mix Transformer encoders (MiT-B0 ~ MiT-B5) 를 설계했음. ViT와 비슷하지만 segmentation 용도.
Overlapped Patch Merging
중간에 feature-map 이 줄어드는 것을 볼 수 있는데 이건 Overlapped Patch Merging 이라는 것을 써서 가능하다 ViT 에서는 뜯어낸 (16×16×3) patch를 (1×1×C) 로 flatten 하듯이, (2×2×C) 를 (1x1x4C) 로 flatten 시키면, maxpooling 비스무레 사용 가능하다. swin 에서 지적했던 것처럼 patch 끼리만 보면 싫으니까, 어느정도 overlap 을 주어서 token을 준비한다. K(patch size) = 7 S(Stride) = 4 P(Padding) = 3 이를 이용해서 F1 (H/4 × W/4 × C1) 에서 F2 (H/8 × W/8 × C2) 를 만드는 것이 가능하다.
Efficient Self-Attention
Pyramid ViT 에서 사용했던 방식을 쓴다.
Reduction R 에 대해,
NxN 의 attention 이 필요하다 할 때,
NxC 의 key에 대해서 reshape 을 수행한 후에 Linear 를 태워버린다.
최종적으로 나오는 key shape 은 (N/R, C) 가 된다.
~결국 Linformer 아닌가?~
총 4개의 stage에 각각 reduction 은 [64, 16, 4, 1] 로 설정했다.
Mix-FFN
그림에서는 노랑 박스. ViT 는 Positional Encoding (PE) 으로 fixed size tensor를 썼는데, variable length input에 PE 를 reshape 해서 더하려면 interpolate 가 필요하고, 이게 성능 하락으로 이어진다. CPVT(https://arxiv.org/pdf/2102.10882.pdf) 에서는 data-driven PE 를 만들려고 3x3 conv를 써주기도 했다.
근데, 저자들은 semantic segmentation 에 대해서는 PE 가 딱히 필요없다고 주장한다.
position 정보가 좀 부족하니까 Mix-FFN layer 를 다음과 같이 설계해서 쓴다.
3x3 conv 정도면 position 정보를 충분히 줄 수 있다는 것도 실험적으로 증명한다.
Lightweight All-MLP Decoder
디코더는 간단하게 위와같이 구성했다.
이 부분은 그림을 보는 게 더 간편하다.
SETR 과 다른점?
- ImageNet-1K pretrain 만 했다. SETR 은 ImageNet-22K pretrain 했다.
- SETR 은 ViT 써서 느리다
- PE 를 없애서 효율적이다.
- Decoder 도 MLP 로 간단하다.
Result
Ablation study
~Mix-FFN 좋은 건 알겠는데, computation 좀 썼잖아. 속도나 파라미터 어떻게 바뀌냐고.. ㅡㅡ 아...~
ADE20K
확실히 이 논문이 왜 떴는지 알겠다. 효율이 어마어마하게 나오긴 한다.
CityScape