부스트캠프 AI Tech 1기 [T1209 최보미]/P stage-3 (객체검출)

Day5 학습정리

B1001101 2021. 4. 30. 14:45

강의 복습

1. EfficientUnet baseline

  1. segmentation을 위한 DataLoader 준비
    • Shape of Images : (batch, 3, height, width)
      Shape of targets : (batch, height, width)
    • cv2.COLOR_BGR2RGB: OpenCV에서는 컬러 이미지를 BGR 순서로 저장하는데 matplotlib에서는 RGB 순서로 저장
    • 255로 나눠서 0~1 사이로 정규화
  2. DataLoader 적용
    • albumentations library를 활용한 transform (ToTensorV2)
    • CustomDataLoader 적용
      • data_dir: image files, json file 저장된 폴더의 디렉토리
      • mode: train / test
      • transforms: 전처리 작업
    • train_loader / validation_loader / test_loader
      • dataset: 로드할 데이터셋
      • batchsize: 로드되는 샘플 수
      • shuffle: True - 모든 epoch에서 데이터 섞음
      • num_workers: 로드에 사용할 프로세스 수 (0 - 기본 프로세스)
      • collate_fn: 샘플의 리스트를 merge하여 Tensor의 minibatch 구성
  3. model 불러오기
    • segmentation_models_pytorch 라이브러리 사용
    • Architecture: smp.Unet
    • Encoders
      • encoder_name = "efficientnet-b0"
      • classes = 12
      • encoder_weight = "imagenet"
    • 사용할 모델의 layer 확인
  4. loss/optimizer 정의
    • loss: Softmax + CrossEntropyLoss
    • optimizer: Adam
  5. train/validation 함수 정의
    • best_loss 초기값을 매우 큰 값으로 설정(9999999)
    • loss가 가장 작은 모델 저장
    • 대회의 기준은 mIoU이므로 mIoU 기준으로 변경해야 함
  6. 학습시키기
  7. best model 불러오기
  8. test
    • test set에 대해 예측 및 시각화
    • test 함수를 사용하여 batch 단위로 inference
    • submission.csv 파일 생성

 

2. baseline 이후에 실험 해봐야할 사항들

  1. 주의해야 할 사항들
    • 시드 고정
      • torch, numpy, os 관련 시드 고정
      • Validation 검증셋 시드 고정 (random_state=0) → 처음부터 나뉘어져있는 경우 해당 없음
    • 실험 기록
      • Network 종류, Augmentation 방법, Hypdrparameter 등
      • Notion / 구글 스프레드 시트 / 파일명 / 패키지 등을 사용하여 기록
    • 실험을 할 때에는 한 번에 하나의 조건만 변경해가며 실험
    • 팀원마다의 역할 분배
      • 하나의 베이스라인 코드 기반으로 가장 좋은 솔루션 만들기
      • 독립적으로 베이스라인 코드 만들어서 마지막에 앙상블
      • 각자 역할 분배
  2. Validation
    • Validation이 중요한 이유
      • 제출을 하지 않아도 모델의 성능을 평가할 수 있음
      • Public 리더보드의 성능에 오버피팅 되지 않도록 도와줌
    • Hold Out: Train data / Validation data로 분리, 속도가 빠르지만 Validation data는 학습에 참여 못 함
    • K-Fold: 데이터를 n등분한 후 돌아가면서 Validation data로 사용, 모든 데이터가 학습에 참여
    • Stratified K-Fold: 클래스 분포 고려
    • Group K-Fold: 그룹 내에 correlation이 존재할 때 train과 validation 데이터셋에 동일한 그룹이 섞이지 않도록 함
  3. Augmentation
    • Augmentation을 하는 이유
      • 데이터 수 증가
      • Generalization 강화
      • 성능 향상
      • Class imbalance 문제 해결
    • Rotation / Flip / Transpose
    • 라이브러리
      • Torchvision.transforms
      • Autoaugment
      • Fastaugment
      • Albumentation
        • 다양한 분야에 적용 가능
        • 여러 라이브러리들을 기반으로 최적화해 속도 빠름
        • 70개 이상 Augmentation 기법 구현
        • Pytorch와 연동 쉬움
    • 도메인에 맞는 Augmentation 기법 필요
    • 최신 Augmentation 기법
      • Cutout: Random하게 Box를 생성하기 때문에 사진마다 성능의 편차가 존재
      • Gridmask: 객체의 중요 부분 혹은 Context information을 삭제할 수 있다는 단점을 해결하기 위해, 규칙성 있는 박스를 통해 Cutout
      • Cutmix
        1. 랜덤하게 잘릴 박스를 추출
        2. 박스의 위치를 결정
        3. 인풋 이미지들의 순서를 섞고 Box의 크기를 결정할 lambda 추출
      • Snapmix
        • CAM(Class Activation Map)을 이용해 이미지 및 라벨을 mixing하는 방법
        • 영역의 의미적 중요도를 고려해 라벨을 생성
  4. SOTA Model
    • HRNet
  5. Scheduler
    • Constant Learning Rate의 단점
      • 너무 작을 경우: 학습 시간이 오래 소요되고, local minima에 빠질 위험이 있음
      • 너무 클 경우: loss가 발산
    • Scheduler 종류
      • CosineAnnealingLR: Learning rate의 최대값과 최소값을 정해, 그 범위의 학습율을 Cosine 함수를 이용해 스케줄링하는 방법
      • ReduceLROnPlateau: metric의 성능이 향상되지 않을 때 learning rate를 조절하는 방법
      • Gradual Warmup: 학습을 시작할 때 매우 작은 learning rate로 출발해서 특정 값에 도달할 때까지 learning rate를 서서히 증가시키는 방법
  6. Hyperparameter Tuning
    • Batch size
      • Gradient Accumulation: 모델의 weight를 업데이트하지 않고, 일정 step 동안 gradient를 누적한 다음 누적된 gradient를 사용해 weight를 업데이트하는 방법, 배치 사이즈를 키우는 장점이 있음
        • Mixed-Precision Training of Deep Neural Networks: 웨이트의 소수점 자리를 32에서 16으로 대체하여 배치를 키우는 방법
    • Optimizer
      • Adam
      • AdamW
      • AdamP
      • Radam
      • Lookahead optimizer: Adam이나 SGD를 통해 k번 업데이트 후, 처음 시작했던 point 방향으로 1 step back 후, 그 지점에서 다시 k번 업데이트를 시작하는 방법
  7.  Ensemble
    • 5-Fold Ensemble: 5-Fold Cross validation을 통해 만들어진 5개의 모델을 앙상블
    • Epoch Ensemble: 학습을 완료한 후, 마지막부터 N개의 Weight를 이용해 예측한 후 결과를 앙상블
    • SWA(Stochastic Weight Averaging): 각 step마다 weigh를 업데이트 시키는 SGD와 달리 일정 주기마다 weight를 평균 내는 방법
    • Seed Ensemble: Random한 요소를 결정짓는 Seed만 바꿔가며 여러 모델을 학습시킨 후 앙상블
    • Resize Ensemble
      • Input 이미지의 Size를 다르게 학습해 앙상블하는 방법
      • 학습 때와 다른 size의 Input 이미지를 이용해 Test(Inference)하는 방법
    • TTA (Test time augmentation): Test set으로 모델의 성능을 테스트할 때, augmentation을 수행
  8. Pseudo Labeling
    1. 모델 학습 진행
    2. 성능이 가장 좋은 모델에 대해 Test 데이터셋에 대한 예측을 진행
    3. 2단계에서 예측한 Test 데이터셋과 Train 데이터셋을 결합해 새롭게 학습을 진행
    4. 3단계에서 학습한 모델로 Test 데이터셋을 예측
  9. 한정된 시간을 효율적으로 활용
    • 코드를 돌리는 시간에 다른 작업 진행
    • 작은 샘플로 실험 코드가 문제 없는지 미리 확인
    • 자는 시간, 쉬는 시간 등 GPU가 쉬지 않도록 미리 실험용 코드 작성

프로젝트 회고

  • 여러가지 모델을 실험해봤는데 지금까지 한 것 중에서는 DeepLabV3 + Resnet101 이 가장 성능이 좋았다. 그 다음으로는 DeepLabV3 + efficientnet-b0가 두 번째로 성능이 좋았다.
  • DeepLabV3 + efficientnet-b3을 돌려봤는데 시간이 너무 오래 걸린다. 이미지 사이즈를 256으로 줄여아 할 것 같다.
  • 아직 augmentation은 적용해보지 않았는데 여러 가지를 시도해봐야겠다.

'부스트캠프 AI Tech 1기 [T1209 최보미] > P stage-3 (객체검출)' 카테고리의 다른 글

Day7 학습정리  (0) 2021.05.04
Day6 학습정리  (0) 2021.05.03
Day4 학습정리  (0) 2021.04.29
Day3 학습정리  (0) 2021.04.28
Day2 학습정리  (0) 2021.04.27