코딩하는 애옹😸

Semantic Segmentation 대회에서 사용하는 방법 본문

부스트캠프 AI Tech 3기/Study

Semantic Segmentation 대회에서 사용하는 방법

DevYe 2022. 5. 9. 18:30
728x90
반응형

Baseline 이후에 실험 해봐야할 사항들

1. 주의해야할 사항들

  • 디버깅 모드 : 실험환경이 잘 설정되어있는지 체크, step에 따라 loss가 잘 감소한다면 CFG.debug=False로 하여 전체 실험 진행
if CFG.debug:
  CFG.epochs = 2
  train = train.sample(frac=0.05, random_state=CFG.seed).reset_index(drop=True)
  • 시드 고정 : 실험마다 성능이 달라지는 것을 방지
def set_seeds(seed=42):
  random.seed(seed)
  os.environ['PYTHONHASHSEED'] = str(seed)
  np.random.seed(seed)
  torch.manual_seed(seed)
  torch.cuda.manual_seed(seed)
  torch.cuda.manual_seed_all(seed)
  torch.backends.cudnn.deterministic = True
set_seeds()
  • 실험 기록 : Network 종류, Augmentation 방법, Hyperparameter 등 기록
  • 실험은 한 번에 하나씩 : 하나의 조건만을 변경하여 실험
  • 팀원마다의 역할 분배
    • 하나의 베이스라인 코드를 기반으로 가장 좋은 솔루션 만들기
    • 독립적으로 베이스라인 코드를 만들어서 마지막에 앙상블
    • EDA / 코드 만들기 / 솔루션 조사 / 디스커션 조사

 

2. Validation

  • 제출을 하지 않아도 모델의 성능 평가 가능
  • Public 리더보드의 성능에 오버피팅 되지 않도록 도와줌
  1. Hold Out
    • 전체 데이터를 8:2로 분리해 Train data / Valid data로 분리
    • 80% Train data로 학습, 20% Valid data로 검증
    • 해당 모델로 Inference 진행
    (장점) 빠른 속도 / (단점) 20% Valid data는 학습에 참여 못함
  2. K-Fold
    • 전체 데이터를 8:2로 분리해 Train data / Valid data로 분리
      • 단, split 개념을 도입하여 모든 데이터가 학습에 참여
    • 독립적인 모델로 Test 데이터에 대해 각각 Inference한 후, Ensemble
    (장점) 전체 데이터셋에 대해 검증을 진행, 신뢰성 있는 검증 결과 도출 / (단점) 시간이 K배 소요
  3. Stratified K-Fold
    • Fold 마다 class distribution을 동일하여 Split함.
    • Imbalanced Class에서 좋음
  4. Group K-Fold
    • Class 별로 split함

 

3. Augmentation

  • 데이터 수 증가
  • Generalization 강화
  • 성능 향상
  • Class Imbalance 문제 해결

Augmentation Library - Torchvision.transforms

import torch
from torchvision import transforms
​
transforms = transforms.Compose([
    transforms.Resize(256,256),
    transforms.RandomSizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                        std=[0.229, 0.224, 0.225])
])

Augmentation Library - AutoAugment

Augmentation Library - FastAutoAugment

Augmentation Library - Albumentation

  • 내장된 augmentation이 많고, 빠르고, pytorch와 연동하기 쉬움

1) Cutout

  • 이미지의 특정 정보를 제한한 상황에서도 Classification을 잘하도록 학습
  • Random하게 Box를 생성하기 때문에 사진마다 성능의 편차가 존재
transform = A.Compose([
  A.Resize(224,224),
  A.CoarseDropout( ## Cutout
    max_holes=8, min_holes=4,
    max_height=20, min_height=8,
    max_width=20, min_width=8, p=1.0)
])

2) Gridmask

  • 규칙성 있는 박스를 통해 Cutout
transform = A.Compose([
  A.Resize(224,224),
  A.GridDropout(ratio=0.2, # mask의 크기
                random_offset=True, # mask의 시작점이 random한 offset
                holes_number_z=4, holes_number_y=4, p=1.0)
])

3) Cutmix

  • 두 개의 이미지를 특정 영역을 잘라서 결합
from cutmix.cutmix import CutMix
from cutmix.utils import CutMixCrossEntropyLoss
​
dataset = CifarDataset(data = df_train,
                      train=True, transform=train_transform)
dataset = CutMix(dataset, numclass=10, beta=1.0, prob=0.5, num_mix=2)
loader = DataLoader(...)
criterion = CutMixCrossEntropyLoss(True)
​
for _ in range(num_epoch):
  for input, target in loader:
    output = model(input)
    loss = criterion(output, target)
    
    loss.backward()
    optimizer.step()
    optimizer.zero_grad()

4) SnapMix

  • CAM(Class Activation Map)을 이용해 이미지 및 라벨을 mixing
  • 영역의 의미적 중요도를 고려해 라벨 생성

5) CropNonEmptyMaskIfExists

  • object가 존재하는 부분을 중심으로 crop
transform = A.Compose([
  A.augmentations.crops.transforms.CropNonEmptyMaskIfExists(height = 256, width = 256),
  ToTensorV2()
])

 

4. SOTA Model

  • HRNet

 

5. Scheduler

  • Learning Rate
    • 너무 작으면 학습 시간 오래 소요, Local minima에 빠질 위험
    • 너무 크면 loss가 발산

1) CosineAnnealingLR

  • LR의 최대값과 최소값을 정해, 그 범위의 학습율을 Cosine 함수를 이용해 스케줄링
  • 최대값과 최소값 사이에서 LR을 급격하게 증가시켰다가, 감소시키기 때문에 saddle point, 정체 구간을 빠르게 벗어남

2) ReduceLROnPlateau

  • metric의 성능이 향상되지 않을 때 LR을 조절

3) Gradual Warmup

  • 학습을 시작할 때 매우 작은 learning rate로 출발해서 특정 값에 도달할 때까지 learning rate를 서서히 증가시킴

 

 

6. Hyperparameter Tuning

1) Gradient Accumulation

  • 모델의 weight를 매 step마다 업데이트하지 않고, 일정 step 동안 gradient를 누적한 다음 누적된 gradient를 사용해 weight를 업데이트하는 방법

 

7. Optimizer / Loss

  • Adam
  • AdamW
  • AdamP
  • Radam
  • Lookaheag optimizer
    • Adam이나 SGD를 통해 k번 업데이트 후, 처음 시작했던 point 방향으로 1step back 후, 그 지점에서 다시 k번 업데이트를 시작하는 방법
  • Other losses
    • Compound Loss 계열은 imbalanced segmentation task에 강인
    • DiceFocal loss
    • DiceTopK loss

 

8. Ensemble

1) K-Fold Ensemble

2) Epoch Ensemble

  • 학습을 완료한 후, 마지막부터 N개의 weight를 이용해 예측한 후 결과를 Ensemble

3) SWA(Stochastic weight Averaging)

  • 각 step마다 weight를 업데이트 시키는 SGD와 달리 일정 주기마다 weight를 평균 냄

4) Seed Ensemble

  • Random한 요소를 결정짓는 Seed만 바꿔가며 여러 모델을 학습시킨 후 Ensemble

5) Resize Ensemble

  • Input 이미지의 크기를 다르게 학습해 Ensemble

6) TTA (Test time augmentation)

  • Inference(Test) 시 data augmentation 적용
  • 원본 이미지와 함께 augmentation을 거친 N장의 이미지를 모델에 입력한 후 각각의 결과를 평균
  • TTA Library - `ttach`
import ttach as tta

transforms = tta.Compose([
 tta.HorizontalFilp(),
 tta.Rotate90(angles=[0,180]),
 tta.Scale(scales=[1, 2, 4])
])​
tta_model = tta.SegmentationTTAWrapper(model, transforms)
​
masks = tta_model(images)

 

9. Pseudo Labeling

1) train 진행

2) 성능이 가장 좋은 모델에 대해 Test 데이터셋에 대한 예측 진행

  • Test 데이터셋은 모델의 예측값이 threshold보다 높은 결과물을 이용

3) 2에서 예측한 test 데이터셋과 train 데이터셋을 결합해 새롭게 학습 진행

4) 3에서 학습한 모델로 Test 데이터셋 예측

 

10. 외부 데이터 활용

  • Kaggle 참고

 

11. 그 외

  • Classification 결과를 활용하는 방법
    • Encoder Head 마지막단에 Classification Head를 달아서 활용 (Unet3+)
  • 한정된 시간을 효율적으로 활용

 

 

 

반응형

'부스트캠프 AI Tech 3기 > Study' 카테고리의 다른 글

VScode에서 AI Stages 서버 연결 for 부캠퍼  (0) 2022.05.12
AI와 저작권법  (0) 2022.02.16
[PyTorch] Troubleshooting  (0) 2022.01.27
[PyTorch] Multi-GPU  (0) 2022.01.27
[PyTorch] 모델 불러오기  (0) 2022.01.26
Comments