<< 마스크 착용 상태 분류 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()를 수행
- dataset.py
🌼 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도 적용했는데, 앙상블 시도를 못함
- train에서 학습시킨 사람이 validation set에 들어가면 그 사람에 대해서만 잘 예측할 수 있으므로, 같은 사람이 train/validation에 나눠져서 들어가지 않도록 함.
- augmentation 과정에 얼굴 영역 크롭
- faceCrop class 정의 : 얼굴 영역을 찾아서 크롭하고, 얼굴을 못찾는 경우 데이터셋의 평균 얼굴 위치에 대해 크롭
🌼 Day23
- K fold
- K = 5로 적용 후, 각 fold 별 best 모델 저장
- inference 할 때, best model에 대해 soft voting 적용
- Hard voting
- 팀 제출 상위 5가지로 hard voting 했으나 가장 좋은 모델모다 accuracy가 떨어짐
'TIL > Boostcamp AI tech' 카테고리의 다른 글
[Boostcamp Lv2] Week7-Day30. CNN Visualization :: seoftware (0) | 2021.09.16 |
---|---|
[Boostcamp Lv2] Week6-Day25. Image classification | VGG11 구현 :: seoftware (0) | 2021.09.07 |
[Boostcamp]Week4-Day18. Training & Inference :: seoftware (0) | 2021.08.26 |
[Boostcamp]Week4-Day17. Model :: seoftware (0) | 2021.08.25 |
[Image Classification] Week 4 Daily Report :: seofware (0) | 2021.08.25 |
댓글