[부스트캠프] level-01 Mask Classification 팀랩업리포트
CV 14조(김찬민_T3060, 김준_T3054, 조유진_T3208, 최홍록_T3228)
프로젝트 개요
● 프로젝트 주제: 마스크 착용 상태 분류
- 성별(남/여)
- 나이(~30 / 30~60 / 60~)
- 마스크착용상태(미착용/정상/비정상)
총 18(233)개의 클래스에 대해 예측하는 것이 목표
● 프로젝트 개요(프로젝트 구현 내용, 컨셉, 교육 내용과의 관련성 등)
● 활용 장비 및 재료(개발 환경, 협업 tool 등)
- tmux
- Tensorboard
- VScode
- Git
- NNI
● 프로젝트 구조 및 사용 데이터셋의 구조도(연관도)
-
데이터 개요
- 전체 사람 수: 4,500명
- 한 사람당 사진 개수: 7장 [마스크 착용 5장, 이상하게 착용 1장, 미착용 1장]
- 이미지 크기(h, w): (512, 384)
- 학습데이터셋 : 60% / 평가데이터셋: 40%
- 입력: 마스크 착용/미착용/비정상적인 착용 사진
- 출력: 18개의 class 중 예측
-
기대 효과
COVID-19은 감염자의 입, 호흡기로부터 나오는 비말, 침 등으로 인해 다른 사람에게 쉽게 전파가 될 수 있기 때문에, 감염확산 방지를 위해 마스크를 올바르게 착용하는 것이 중요하다. 따라서 우리는 카메라에 비춰진 사람 얼굴 이미지만으로 이 사람이 마스크를 올바르게 쓰고 있는지 자동으로 가려낼 수 있는 시스템이 갖춰진다면 적인 인적자원으로도 COVID-19의 확산방지에 도움이 될 것이다.
프로젝트 팀 구성 및 역할
- 김찬민_T3060: 베이스라인 코드 이해
- 김준_T3054: 베이스 라인 코드 이해, 모델 및 loss 성능 비교, Data Augmentation 비교
- 조유진_T3208: 각각 학습한 여러 모델들을 연결.
- 최홍록_T3228: 모델 성능비교, Data Augmentation비교
프로젝트 수행 절차 및 방법
실제로 모델링을 처음 하기 때문에 모델을 검증하고 개선하는 경험이 필요하다고 판단했다.
그래서 이번 프로젝트의 목적은 개인의 프로젝트 이해와 모델링에 익숙해지는 것이었다.
프로젝트의 수행 절차
- 각자 모델링 및 Data Augmentation, Optimizer 사용
- 각자 해본 Augmentation 기법, Scheduler등 여러가지 기법들 공유
- Git을 사용한 코드 공유
- 공유한 내용들 바탕으로 각자의 모델 개선
- 개선된 모델 중 좋은 성능을 보이는 모델 2개를 선정 및 결과 제출
최종 모델
-
Pretrained ResNet152
- 세부 사항
Oversampling과 Tomek Links를 사용한 Data Augmentation
Mix Up을 사용한 Data Augmentation
AMP를 사용한 학습 시간 단축
NNI를 사용한 하이퍼 파라미터 튜닝
- 고려사항
데이터의 양이 적은 클래스를 Oversampling 하는 과정에서 Overfitting을 우려해 60세 이상의 이미지는 4배로 늘려주고 59세의 데이터를 60세로 바꾼 뒤 2배로 늘려줌
Mix Up을 사용할 때 일정 비율로 사용하지 않고 랜덤한 이미지와 랜덤한 비율로 데이터를 섞어서 써서 일반화가 잘 될 수 있게 함
- 개선 과정
ResNet18에서 Data Augmentation을 사용해 성능 향상
ResNet152로 모델의 크기를 키워서 성능 향상
NNI를 사용해 Loss Function 결정
Adam과 CosineAnnealingLR을 사용해 Local Minimum 탈출 도모
-
ResNet18 + GoogLeNet (모델 분리)
- 세부 사항
- 마스크 착용 여부 예측 모델 : ResNet18 + Normalization
- ResNet18만으로 성능이 충분하다고 생각하여 특별히 개선 사항 없음.
- 성별, 나이 예측 모델 : GoogLeNet + CenterCrop + Normalization
- optimizer : Adam
- LR scheduler : CosineAnnealingLR
- 고려사항
- 마스크 착용 여부에 따라 성별, 나이 예측 시 고려해야할 feature가 다르지 않을까 하여 모델을 분리.
- 60세 이상 데이터가 적은 것을 고려하여, 58~59세를 60세로 수정. & 60세의 데이터를 2배로 증가.
- train 시 배경보다 얼굴에 좀 더 집중할 수 있도록 CenterCrop 사용.
- 개선 과정
- 60세 이상의 데이터를 늘리니 미착용과 올바르지 않게 착용 시의 val acc. 향상.
- 60세 이상 데이터 증가만으로 최종 F1 score가 0.6918 → 0.7144로 향상.
프로젝트 수행 결과
- 모델 개요
- 단일 모델로 18개 클래스 예측하기.
- 마스크 착용 여부를 예측하는 모델과 성별, 나이를 예측하는 모델 분리하기.
- 모델 평가
- 주어진 학습 데이터를 사람 별로 train set / validation set으로 나눈 뒤 사용.
-
시연 결과
-
Pretrained ResNet152
F1 Score : 0.7370
Accuracy : 80.0317
- 결론 : 처음에는 데이터의 불균형이 심해서 모델이 크든 작든 성능이 비슷했다.
하지만 Augmentation으로 데이터의 불균형을 해소한 후 큰 모델을 사용해보니까 모델이 크면 클수록 성능이 잘 나오는 것을 확인 할 수 있었다.
MixUp을 통해 계속 새로운 이미지가 입력값으로 사용 되는 효과를 기대할 수 있는데 이렇게 되면 ResNet152보다 더 큰 모델을 사용했을때 학습을 시키면 시킬수록 더 잘 학습이 될 것이라는 것을 기대할 수 있다.
-
ResNet18 + GoogLeNet (모델 분리)
F1 Score : 0.7144
Accuracy : 76.1905
- 결론 : 모델 3~4개를 따로 학습시켜야 해서 시간이 오래 걸림. 때문에 ResNet18과 GoogLeNet에서만 시도를 하여 유의미한 성능 향상을 얻지 못 함.
별 다른 parameter 변경 없이 데이터 불균형만 살짝 조정하여 꽤나 유의미한 f1 score 향상을 얻음.
데이터 불균형 조정 후에는 큰 모델일수록 학습이 잘 되는 위 실험 결과를 고려하면, 데이터를 좀 더 조정하고 큰 모델을 사용하면 더 많은 성능 향상을 기대해볼 수 있을 것 같다.
자체 평가 의견
- 프로젝트 결과물에 대한 프로젝트 의도와의 부합 정도 및 실무활용 가능 정도, 계획 대비
달성도, 완성도 등 자체적인 평가 의견과 느낀점을 포함합니다.
- 팀 차원에서 잘한 부분과 아쉬운 점을 작성합니다. (팀 별 공통 의견 중심으로 작성하며,
2~3장 분량을 고려하여 개인적인 의견은 개인 회고 부분에서 작성할 수 있도록 합니다.)
○ 잘한 점들
- github을 활용한 코드공유가 잘 이루어졌다.
- 모듈화된 코드를 이해하고 command line에서 활용하였다.
- tmux, tensorboatd, nii 등의 툴들을 활용했다.
○ 아쉬운점
- 협업이 잘 이루어지지 않았다.
- LB 상에서 성능이 좋지 않았다
- 배경을 지우는 Transform을 적용했다면 더 좋은 성능을 얻을 수 있었을 것이다.
○ 시도 했으나 잘 되지 않았던 것들
- Data Imbalance 해결
- Overfitting 문제 해결
- 데이터 resize 및 crop을 통해 학습데이터의 multi-scaling 시도