CV-16조 💡 비전길잡이 💡
NAVER Connect Foundation boostcamp AI Tech 4th
민기 | 박민지 | 유영준 | 장지훈 | 최동혁 |
---|---|---|---|---|
- SegFormer : 임베디드 및 모바일 기기를 위한 Transformer 기반 Semantic Segmentation 모델 경량화
- Model driven approach : 하이퍼파라미터 튜닝 등 고도화된 학습 기법 배제 · 순수 모델링을 통한 성능 향상
- Pruning 및 quantization 등 compression 방법 배제 : 모델 블록 · 레이어 재설계 등 경량화 구조변경 진행
Tiny-ImageNet | ADE20K | |
---|---|---|
Purpose | Pre-training | Fine-tuning |
Num_classes | 200 | 150 |
Training set | 100,000 images | 20,210 images |
Validation set | 10,000 images | 2,000 images |
|-- ADEChallengeData2016
| |-- image
| | |-- train
| | `-- val
| `-- mask
| |-- train
| `-- val
`-- tiny-imagenet-200
|-- train
|-- val
Encoder | Decoder |
---|---|
Overlap Patch Embedding | MLP Layer (upsampling) |
SegFormer Block | Concat |
Efficient Self-Attention | Linear-Fuse |
Mix-FFN | Classifier |
Encoder | Decoder |
---|---|
Poolin Patch Embedding | MLP Layer (upsampling) |
PoolFormer Block | Weighed Sum |
SegFormerV2 Block | Classifier |
Custom Efficient Self-Attention | - |
Mix-CFN | - |
- Segformer-B2와 custom model 성능 비교 및 Params와 Flops 측정 (util/get_flops_params.py)
- Token Mixer : MHSA 대신 Pooling으로 feature 추출
$\hat {F_0}=\mathrm {LayerScale}(\mathrm {Pooling}(F_{in}))+F_{in}$ $\hat {F_1}=\mathrm {LayerScale}(\mathrm {MixCFN}(\hat {F_0}))+\hat {F_0}$
- 기존 Self Output 모듈 삭제
$\hat {F_0}=\mathrm {CSA}(F_{in})+F_{in}$ $\hat {F_1}=\mathrm {MixCFN}(\hat {F_0})+\hat {F_0}$
-
Pooling으로 K, V 차원 축소
$K, V=\mathrm {Pooling}(F_C)$
-
1x1 Convolution 삭제
$\mathrm {Attention}(Q,K,V)=\mathrm {Softmax}({{QK^T}\over {\sqrt {d_{head}}}}V)$
-
기존의 Linear(dense) embedding 연산을 1x1 Conv로 변경
$\hat {F_C}=\mathrm {Conv}_{1 \times 1}(F_C)$
-
3x3 DWConv를 3x3과 5x5 DWConv로 channel-wise로 나누어 연산 후 Concat (Mix-CFN)
-
Batch-Normalization 추가
model | Params | Flops | Accval (%) | mIoUval (%) |
---|---|---|---|---|
SegFormer-B2 | 27.462M | 58.576G | 66.48 | 29.84 |
BoostFormer (Ours) |
17.575M (-36.00%) |
15.826G (-72.98%) |
72.28 (+8.72%) |
34.29 (+14.91%) |
- 기존 모델 대비 Params 36% 감소, FLOPs 72% 감소, mIoU 성능 14% 향상
git clone https://github.com/boostcampaitech4lv23cv3/final-project-level3-cv-16.git
bash dist_train.sh {사용하는 gpu 개수} \
--data-path {tiny_imagenet path} \ # 이름에 tiny가 포함되어야함
--output_dir {save dir path} \
--batch-size {batch size per gpu } # default=128
# example
bash dist_train.sh 4 \
--data-path /workspace/dataset/tiny_imagenet \
--output_dir result/mod_segformer/ \
--batch-size 64
# 현재 디렉토리: /final-project-level3-cv-16
python train.py \
--data_dir {ADE20K의 path} \
--device 0,1,2,3 \ # 환경에 맞게 수정
--save_path {save하고자 하는 dir의 path} \
--pretrain {pretrain 모델 dir 혹은 .pth의 path} # .pth(pretrain의 output), dir(huggingface의 모델허브에서 제공하는 형태)
--batch_size {batch size} # default=16
# phase를 통해 val 또는 test set 설정
python eval.py \ # eval.py 내의 model을 정의하는 코드 수정
--data_dir {ADE20K의 path} \
--pretrain {pretrain 모델 dir의 path}
python util/get_flops_params.py \ # get_flops_params.py 내의 model을 정의하는 코드 수정
--data_dir {ADE20K의 path}
|-- 🗂 appendix : 발표자료 및 WrapUpReport
|-- 🗂 segformer : HuggingFace 기반 segformer 모델 코드
|-- 🗂 boostformer : Segformer 경량화 모델 코드
|-- 🗂 imagenet_pretrain : Tiny-ImageNet encoder 학습시 사용한 코드
|-- 🗂 util : tools 코드 모음
|-- Dockerfile
|-- train.py : ADE20K Finetuning 코드
|-- eval.py : 모델 Inference 결과 출력 코드
|-- requirements.txt
`-- README.md