본문 바로가기
TIL/Boostcamp AI tech

[Image Classification] Week5 Daily Report :: seoftware

by seowit 2021. 9. 3.

<< 마스크 착용 상태 분류 2>>

: 카메라로 촬영한 사람 얼굴 이미지의 마스크 착용 여부를 판단하는 Task

🟢개인적인 의견 및 시행착오 과정은 초록색

 

🌼 Day20

  • Multi-outputs에 대한 코드 변경 내용 작성
    • dataset.py
      • 변경 전 : 18개의 클래스가 원핫벡터로 표현
      • 변경 후 : 마스크 착용 여부, 성별, 연령대에 대한 분류 별로 멀티 아웃풋 
    • model.py
      • 백본 네트워크 : Xception
      • (multi head) Xception의 feature에 마스크 착용 여부(wear, incorrect, not wear), 성별(male, female), 나이대(30↓, 30~59, 60↑)를 구분하는 3가지 classifier를 붙였다. 1 feature, 3 classifier 
      • timm에서 제공하는 xception 모델 불러오는 방법을 사용하려고 했는데, 에러가 발생해서 레이어 직접 쌓아서 feature 부분만 사용(추후 해결 - Day21)
    • train.py
      • 달라진 부분 : model 호출 후 loss 계산을 3가지 output에 대해 각각 진행
      • 코드 예시 : loss_for_mask = nn.CrossEntropy(predict['label_mask'], gt_mask)
        • predict : 모델 예측 값, gt_mask : 마스크에 대한 ground truth 
      • 3가지 분류에 대한 loss_for_mask, loss_for_gender, loss_for_age를 계산한 후 이를 모두 더해서 최종 loss를 계산 후 loss.backward()를 수행

🌼 Day21

  • Multi-output inference
    • 정답 레이블은 18개의 클래스 중 하나로 예측되어야 하는데 3가지 output으로 예측하고 있는 상황
    • dataset class에 구현된 mask, gender, age를 하나로 바꾸는 방법을 사용하여 결과를 18개 클래스 중 하나로 바꾼 다음에 추론 
      • mask_label*6 + gender_label*3 + age_label
    • timm에서 xception 모델을 제공하고 feature만 가져올 수 있는 파라미터 사용시 발생했던 에러를 해결했습니다. forward에서 init에서 정의한 함수를 처음 가져올 때, x = self.model(x) 이런식으로 가져와야하는데 뒤에 (x)를 빠뜨려서 생긴 에러였습니다. 해결하고 기쁘고 이걸 찾았다는 희열도 있었지만, 이 실수로 몇 시간을 고민한 걸 생각하니 허무하기도 했습니다. 하지만 덕분에 다시는 이런 실수는 안 할 것 같습니다😂 그리고 timm에서 모델을 가져오면서 pretrained model을 사용할 수 있어서 성능도 올릴 수 있었습니다
    • Train accuracy는 99까지 높아지는 반면에 Validation accuracy는 77 정도가 최대여서 과적합을 해결할 수 있는 방법 적용
      • dropout 0.5
      • L2 normalization - xception의 경우 weight_decay 1e-5 사용
      • augmentation 추가 - cutout, gaussian blur 등
  • WandB 사용
    • train accuracy, loss, validation image, accuracy, loss를 보기 위해 사용
    • 완디비는 사랑...❤ 너무 편하고 보기 좋다
  multi-output 방법을 적용한 모델을 제출해봤는데 74.9 accuracy가 나왔다.
  이전에 efficientNet을 사용했을 때 나왔던 최고 기록보다 2 정도 낮은 수치다.

 

🌼 Day22

  • 다양한 loss 함수 시도
    • Focal Loss, F1 loss, label smoothing 의 방법을 추가로 사용해봤으나, 기존에 사용하던 cross_entropy가 가장 좋다.
    • age가 잘 예측이 안되는 것을 보고 age의 loss에 1.2 를 곱해서 age loss의 치명도를 높였다. submission의 결과는 75.9206 정도로 1정도 높아졌다.
  • optimizer, lr 변경
    • optimizer를 cosineAnnealingLR 사용
    • learning rate 값을 3e-5, 1e-4 등으로 더 작게 잡아서 해봄
  • Dataset 변경
    • train에서 학습시킨 사람이 validation set에 들어가면 그 사람에 대해서만 잘 예측할 수 있으므로, 같은 사람이 train/validation에 나눠져서 들어가지 않도록 함.
      • 같은 이미지가 있는 것이 아니라 마스크1을 착용한 사진과 마스크2를 착용한 같은 사람이 데이터에 포함되어 있다
    • 다양한 데이터셋을 사용하여 앙상블 해 볼 목적으로 클래스 별로 균등하게 데이터를 나누는 dataset도 적용했는데, 앙상블 시도를 못함
  • augmentation 과정에 얼굴 영역 크롭
    • faceCrop class 정의 : 얼굴 영역을 찾아서 크롭하고, 얼굴을 못찾는 경우 데이터셋의 평균 얼굴 위치에 대해 크롭

 

🌼 Day23

  • K fold
    • K = 5로 적용 후, 각 fold 별 best 모델 저장
    • inference 할 때, best model에 대해 soft voting 적용
  • Hard voting 
    • 팀 제출 상위 5가지로 hard voting 했으나 가장 좋은 모델모다 accuracy가 떨어짐

댓글