본문 바로가기

공부방/Upstage AI Lab 4기

[CV 문서 분류 대회] 어떤 사이클을 돌았나요? 사이클별 실험 정리

CV로 문서 이미지들을 분류하는 대회를 마무리하며.. 
대회 이틀 정도 남았을 무렵, 급격한 일교차 때문인지 감기 몸살에 걸렸다. 그래서 코드를 백업해둔다는 걸 깜빡하고 말았다. 코드는 없어도 남아있는 기억의 지푸라기를 잡고 대회 회고를 풀어본다. 


어떤 시도를 해봤나요? 

  • 어그멘테이션: Torchvision이용해서 학습이미지 5배로 증강(뒤집기, 15도 회전, 블러 등 효과 랜덤하게 ->  Albumentation이용해서 학습이미지 10배로 증강 -> 더욱 강한 어그멘테이션 적용하여 17만장으로 증강 -> mixup, cutout, cutmix 온라인 어그멘테이션 적용
  • Validation set: StratifiedKFold로 폴드 5개 구성 후 하나를 밸리데이션 셋으로 사용하는 방식. 
  • 모델: 초반에는 Densenet121, efficientnetb0, resnet34 모델에 각종 하이퍼파라미터 바꿔가며 실험, 후반에는 swin_tiny, swin_base 위주로 실험
  • 앙상블: 폴드별 모델의 가중치를 평균내 최종 모델을 구성, swin모델 3개와 cnn계열 모델 3개를 조합한 하드보팅

 

사이클별 대략적인 실험 개요 및 하이퍼파라미터 정리

첫 사이클:

  • 데이터셋: 기본 데이터셋에 Torchvision이용해서 학습이미지 5배로 증강(뒤집기, 15도 회전, 블러 등 효과 랜덤하게 들어감) 
  • 모델: Densenet121, efficientnetb0, resnet34 3가지 모델
  • 이미지 사이즈 32, 128, 260
  • 배치 32
  • 학습률 0.001
  • 에폭 10
  • 결과: 퍼블릭 기준 0.3924 매우 낮게 나옴 -> 어그멘테이션이 문제라고 생각이 들어 두 번째 사이클에서 어그멘테이션 숫자 늘림

 

두 번째 사이클:

밸리데이션 세트를 따로 나누는 작업 + StratifiedKFold + mlflow 붙임

  • 데이터셋: 기본 데이터셋에 Albumentation이용해서 학습이미지 10배로 증강 + mixup, cutout, cutmix 온라인 어그멘테이션 적용
  • 모델: efficientnetb0, resnet34
  • 이미지 사이즈 128
  • 배치 32
  • 학습률 0.001
  • 에폭 10
  • 결과: 퍼블릭 기준 0.45~0.48 -> 클래스 임밸런스가 된 이미지를 고려하지 않고 10배씩 증강해서 그런건가 싶어서 클래스 임밸런스를 적용해서 다음 사이클에서는 총 17만장을 만들고자 했음.

 

세 번째 사이클:

  • 데이터셋: 더욱 강한 어그멘테이션 적용하여 17만장으로 증강시킨 이미지, 클래스 밸런스 맞춤 
  • 모델: efficientnetb0, resnet34
  • 이미지 사이즈 128
  • 배치 32
  • 학습률 0.001
  • 에폭 10
  • 결과: 퍼블릭 기준 0.80~0.82

 

네 번째 사이클:

  • 데이터셋: 이미지 7만장(팀원들이 주로 쓰고 있는 오프라인 어그멘테이션 이미지 14만장을 동일하게 만든 뒤 그중 절반만 사용하여 swin 모델 테스트로 돌려봄) 
  • 모델: swin_tiny 
  • 이미지 사이즈 224
  • 배치 8
  • 학습률 0.001
  • 에폭 10
  • 결과: 퍼블릭 기준 0.82

 

다섯 번째 사이클:

0.8에서 넘어가지 못하자 하드 보팅 앙상블을 써보자고 생각

  • 데이터셋: 이미지 7만장, 14만장
  • 모델: swin_tiny, efficientnetb4, resnet50, efficientnetb0, resnet34
  • 이미지 사이즈 224, 128
  • 배치 8, 32 
  • 학습률 0.001
  • 에폭 10
  • 결과: 모델 5개 결과 하드보팅 시켰더니 0.91로 성능 향상

 

여섯 번째 사이클:

트랜스포머 모델 계열로 성능을 높여서 소프트보팅을 시키면 좋을 것 같아서 swin_tiny에 집중

  • 데이터셋: 이미지 7만장 + 온라인 어그멘테이션(mixup, cutout, cutmix)
  • 모델: swin_tiny
  • 이미지 사이즈 224
  • 배치 8 -> 32
  • 학습률 0.001 -> 0.0001
  • 에폭 3 -> 10
  • 결과: 배치, 에폭 작게 돌릴 때 0.82 -> 늘렸더니 0.92

 

일곱 번째 사이클:

swin_tiny에서 base로 모델을 키우고, 스케줄러, 라벨 스무딩 추가 적용 

  • 데이터셋: 이미지 7만장 + 온라인 어그멘테이션(mixup, cutout, cutmix)
  • 모델: swin_base
  • 이미지 사이즈 224
  • 배치 24
  • 학습률 0.00035
  • 에폭 15
  • 결과: 리더보드에서 0.93 


마지막은 사이클:

swin_base모델의 성능을 확인했으니, 데이터셋을 좀 다양하게 줘서 학습을 잘 시키게 만들어보자는 생각.
1) 1, 13, 14번 클래스가 부족한 상태로 이미지를 증강시킨 임밸런스 데이터셋
2) 1, 13, 14번 클래스를 다른 클래스만큼 개수를 맞춰서 증강시킨 밸런스 데이터셋
3) 3, 7, 4, 14번 클래스에서 혼돈을 많이 일으켜 이 클래스들만 더 많이 증강시켜 과대 학습하도록 의도한, 데이터셋
이렇게 3개의 데이터셋을 기반으로 각각 학습한 swin_base을 만들었다. 

그리고 기존에 CNN계열 모델로 잘 나온 아웃풋 3개 + 위에서 구성한 swin_base 모델 3개를 가지고 하드보팅했다. 

아쉽게도 결과는 확인할 수 없었으나, (제출횟수 오버됨) 가장 높은 점수를 받은 아웃풋과 비교했을 때 거의 94%였나? 높은 수준으로 일치해서 성능도 비슷하지 않았을까 싶다. 

 

지금까지 내가 제출했던 점수들