호기심 많은 분석가

[Boostcamp] Image Classification Competition 본문

Coding/BoostCamp

[Boostcamp] Image Classification Competition

DA Hun 2021. 9. 5. 19:28
 

GitHub - herjh0405/BC_Pstage1_Image_Classification: 부스트캠프_P-stage 첫 번째 이미지 분류 - 마스크 착용 상

부스트캠프_P-stage 첫 번째 이미지 분류 - 마스크 착용 상태 분류. Contribute to herjh0405/BC_Pstage1_Image_Classification development by creating an account on GitHub.

github.com

1. 📑Summary

 COVID-19의 확산으로 우리나라는 물론 전 세계 사람들은 경제적, 생산적인 활동에 
많은 제약을 가지게 되었습니다. 우리나라는 COVID-19 확산 방지를 위해 사회적 거리
두기를 단계적으로 시행하는 등의 많은 노력을 하고 있습니다. 과거 높은 사망률을 가진 
사스(SARS)나 에볼라(Ebola)와는 달리 COVID-19의 치사율은 오히려 비교적 낮은 편에 
속합니다. 그럼에도 불구하고, 이렇게 오랜 기간 동안 우리를 괴롭히고 있는 근본적인 
이유는 바로 COVID-19의 강력한 전염력 때문입니다.

 감염자의 입, 호흡기로부터 나오는 비말, 침 등으로 인해 다른 사람에게 쉽게 전파가 
될 수 있기 때문에 감염 확산 방지를 위해 무엇보다 중요한 것은 모든 사람이 마스크로 
코와 입을 가려서 혹시 모를 감염자로부터의 전파 경로를 원천 차단하는 것입니다. 이를 
위해 공공 장소에 있는 사람들은 반드시 마스크를 착용해야 할 필요가 있으며, 무엇 보다도
코와 입을 완전히 가릴 수 있도록 올바르게 착용하는 것이 중요합니다. 하지만 넓은 
공공장소에서 모든 사람들의 올바른 마스크 착용 상태를 검사하기 위해서는 추가적인 
인적자원이 필요할 것입니다.

 따라서, 우리는 카메라로 비춰진 사람 얼굴 이미지 만으로 이 사람이 마스크를 쓰고 있는지
, 쓰지 않았는지, 정확히 쓴 것이 맞는지 자동으로 가려낼 수 있는 시스템이 필요합니다. 
이 시스템이 공공장소 입구에 갖춰져 있다면 적은 인적자원으로도 충분히 검사가 
가능할 것입니다.

1-1. Performance

Public

  • F1 Score : 0.763
  • Accuracy : 79.206%

Private

  • F1 Score : 0.744
  • Accuracy : 78.333%

1-2. Data Set

  • 모든 데이터셋은 아시아인 남녀로 구성되어 있고 나이는 20대부터 70대까지 다양하게 분포
  • 전체 사람 명 수 : 4,500
  • 한 사람당 사진의 개수: 7 [마스크 착용 5장, 이상하게 착용(코스크, 턱스크) 1장, 미착용 1장]
  • 이미지 크기: (384, 512)

전체 데이터셋 중에서 60%는 학습 데이터셋으로 활용된다.

2. Processing

  • 대회 진행에 어려움을 겪는 캠퍼들을 위해 베이스라인 작성 후 공유

베이스라인 코드 공유

2-1. Problem Definition

  • 내가 지금 풀어야 할 문제가 무엇인가?
    • 이미지가 주어졌을 때, 마스크 착용 여부, 나이, 성별을 구분하여 정해진 라벨을 반환해야 한다.
    • 3가지를 각각 분류해주는 것과, 한 번에 분류해주는 법 2가지로 문제를 해결할 수 있을 것입니다.
  • 이 문제의 Input과 Output은 무엇인가?
    • Input은 Image, Output은 18개의 클래스 중 하나
  • 이 솔루션은 어디서 어떻게 사용되는가?
    • 공공장소 등 마스크 검사가 필요한 많은 곳에서 불필요한 자원 감소를 위해 사용될 것이다.

2-2. EDA

데이터가 굉장히 극단적이고 imbalanced 했기에 이것을 해결하는 데 초점

EDA & Data imbalanced

  1. sklearn의 StratifiedKFold를 사용해서 균일하게 추출
    • 데이터가 imbalanced 한 경우 train과 validation set을 나눌 때 일반적인 split을 사용하면 데이터가 불균형하게 뽑히기 때문에 학습과 테스트가 적절히 이루어지지 않음
  2. Loss function으로 focal loss를 사용
    • 일반적으로 분류 task의 경우 crossentropy function을 loss로 사용하지만 분류하기 어려운 문제에 더 많은 가중치를 적용하는 focal loss를 사용함으로써 imbalanced 한 데이터를 잘 맞추고 F1 score를 상승

2-3. Data Preprocessing

  1. Face Crop 데이터 추가
    • 원본 데이터의 경우 전체 사진 중 얼굴이 차지하는 부분이 크지 않았음
    • 배경, 옷 등이 학습에 영향을 끼칠 것이라 판단하여 cvlib의 detect_face를 활용하여 face만 crop
    • Ex. 아래의 경우처럼 얼굴만 학습함으로써 성능 향상
    • https://pixabay.com/의 저작권이 풀린 사진으로 학습 데이터와 연관이 없음

2-4. Modeling & Hyper parameter tuning

  1. Model ResNet18
    • ResNet 구조
       
    • Network 가 깊어지면 발생하는 gradient vanishing/exploding 또는 degradation(후반부의 Network 가 학습이 되지 않는 문제) 문제를 Skip-Connection을 활용하여 해결한 네트워크 구조
    • 데이터가 많지 않았기에 Pretrained 된 모델을 사용
    • 성별, 마스크 착용 등 Task가 단순했기 때문에 오히려 크고 복잡한 모델일수록 과적합 가능성이 높았음 → EfficientNet, ResNet34, 50, 152등 다양한 모델을 사용해봤지만 ResNet18이 가장 높은 성능을 보임
  2. Data Augmentation
    • Albumentation 사용
      •  
      • Pytorch의 Transforms보다 Albumentation이 속도가 빠르다
    • Face crop 된 image도 사용하기 때문에 원본 사이즈와 맞춰주는 Resize
      • 우리가 사용하는 모델인 ResNet18의 원본 이미지 size에 맞춰 224x224로도 resize 해봤지만 좋은 성능을 내진 못함
    • 중심 픽셀이 큰 가중치를 가지고 인접 픽셀의 가중치가 줄어드는 GaussianBlur
    • local optima 문제를 예방하고 속도를 높여주는 Normalize
    • 다양한 데이터셋을 위한 HorizontalFlip
    • 데이터가 균일하지는 않았으므로 CenterCrop은 위험
  3. Data Oversampling
    • 원본 데이터나 Crop 된 데이터만을 사용하는 것은 데이터가 너무 적어 Crop 된 데이터와 Original Data, 총 약 4만 장을 Training set으로 활용
  4. Learning rate=0.0001 Batch_size=128 Epoch=10 Optimizer=Adam
    • 실험적으로 검증, Batch_size가 마냥 크다고 좋지 않았음, 128이 최고
    • lr scheduler로 StepLR, CosineAnnealingWarmRestarts를 써봤지만 성능이 좋지 않았다.
    • Early_stopping도 좋은 성능을 보이지 못함
  5. Ensemble
    • Stratified 한 단순 평균 낸 모델 중 다른 추이를 보이는 모델들 soft voting
    • 그렇게 제출된 상위 모델들 hard voting으로 성능 극대화

3. Cooperation & 배운 점

3-1. Project Template

  • 협업의 효율을 증대시키기 위해 Victor Huang의 PyTorch Template Project을 기반으로 템플릿 사용

Project Template

3-2. Google Sheet 및 모델&결과 저장 습관화

  • 구글 시트의 각자의 작업 내용과 Submission 결과값 비교, 파라미터들을 기록

Google Sheet로 협업

  • 모델과 결과 저장을 습관화함으로써 재연성도 높이고 공유도 편하게 시행

모델 및 Submission 저장의 습관화

3-3. Wandb

  • Wandb의 사용으로 모델 점검, 하이퍼파라미터 튜닝 작업 효율 증대

Wandb 사용

3-4. Argparse 사용

  • argparse를 통해 실험 및 협업 효율을 늘리고, 코드 간결화

Argparse 사용

3-5. Commit 규칙 정하기 및 Code Review

  • 좀 더 서로의 코드를 잘 이해하기 위해 commit 규칙을 정하고 code review

Commit 규칙 정하기

3-6. README 작성법

  • Freeze를 통해 requirements.txt를 쉽게 작성 → Dependency 문제 해결

Freeze로 requirements.txt 구현

  • tree -L depth(1 or 2,...)로 파일 구조 표현

tree로 파일 구조 표현

4. 회고

 이미지 분류 대회가 처음이라 두려움이 컸는데 이미지 데이터의 경우 어떤 전처리와 라벨링을 거치는지, Dataset, Data loader 구성 등을 코드 공유, Kaggle, 과제 등을 통해 배웠고 전반적인 Modeling을 할 줄 알게 되었다.
 그 과정에서 나와 비슷한 힘듦을 겪는 캠퍼들을 위해 베이스라인 코드를 작성하는 일은 생각보다 고됐지만 뿌듯했다. 보다 쉬운 이해를 위해 코드를 정리하고 꼼꼼한 설명과 EDA 작업에 시간이 많이 들었지만 그 과정에서 내가 하던 작업의 실수도 발견하고 이해하는 데 도움이 되었다.
 또한 Class나 py파일, 프로젝트 템플릿 등을 써본 경험이 많지 않았는데 이번을 토대로 협업 능력이 많이 상승했다. 그래서 그 과정에서도 시간을 많이 들였는데 그 시간만큼 성장했을 것이라 믿는다. 다음 대회 때는 이러한 작업을 미루기보다 그때그때 합치고 정리해서 조금 더 협업을 원활히 해야겠다.
 이번 대회에서 나는 다양한 아이디어를 토대로 실험을 하고 성능과 점수를 높이는 데 집중했는 데 다음 대회에서는 보다 다양한, 내가 써보지 않은 기법들을 사용해야겠다. 이번 대회를 통해 성능을 높이는 방법을 많이 터득했으므로 이 과정에서 드는 시간을 줄여 그 기법들 연구에 투자할 수 있을 것이다.
 정말 여러 방면으로 성장할 수 있는 기회라 좋았다. 딥러닝 Task 모델의 A-Z와 다양한 협업, README 작성법과 프로젝트 템플릿 형태의 깔끔한 저장 등을 배울 수 있어 좋은 경험이었다.

5. 추가 실험 및 목표

5-1. 추가 실험

추가 실험

  • 주어진 데이터는 공개가 불가하여 내 사진과 팀원 사진, 저작권 공개된 사진을 이용해서 실험
  • 학습 데이터와 비슷한 경우 역시나 잘 맞춤
    • 하지만 실제 결과와 비슷하게 마스크로 눈과 코를 가린 경우 맞추기 힘들어함
  • 특이한 점은 학습 데이터에 전혀 없던 아주 어린아이도 맞췄다는 사실과, 수염 기른 데이터가 없다 보니 마스크로 인식한 점이다.
  • License - https://pixabay.com/, MyImage, 캠퍼 조현동

5-2. 목표

 

Webservice

이준혁, 허정훈, 임성민 캠퍼

www.notion.so

  • 함께 프로젝트를 진행한 일부 캠퍼분들과 우리 모델을 기반으로 한 마스크 착용 상태를 구분해주는 웹서비스를 구현하고자 함
    • 모델 만드는 것에는 능숙하지만 서빙하는 능력도 기르기 위해

 

 

[AI Tech]Daily Report

Naver AI Tech BoostCamp 2기 캠퍼 허정훈 2021.08.03 - 2021.12.27 https://bit.ly/3zvJnSh

data-hun.notion.site