마스크 착용 상태 분류
'마스크 착용 상태 분류'는 부스트캠프에서 진행한 Image classification 프로젝트입니다.
프로젝트 개요
Designed by pikisuperstar / Freepik
“카메라로 촬영한 사람 얼굴 이미지의 마스크 착용 여부를 판단하는 Task”
COVID-19의 확산으로 우리나라는 물론 전 세계 사람들은 경제적, 생산적인 활동에 많은 제약을 가지게 되었습니다. 우리나라는 COVID-19 확산 방지를 위해 사회적 거리 두기를 단계적으로 시행하는 등의 많은 노력을 하고 있습니다. 과거 높은 사망률을 가진 사스(SARS)나 에볼라(Ebola)와는 달리 COVID-19의 치사율은 오히려 비교적 낮은 편에 속합니다. 그럼에도 불구하고, 이렇게 오랜 기간 동안 우리를 괴롭히고 있는 근본적인 이유는 바로 COVID-19의 강력한 전염력 때문입니다.
감염자의 입, 호흡기로부터 나오는 비말, 침 등으로 인해 다른 사람에게 쉽게 전파가 될 수 있기 때문에 감염 확산 방지를 위해 무엇보다 중요한 것은 모든 사람이 마스크로 코와 입을 가려서 혹시 모를 감염자로부터의 전파 경로를 원천 차단하는 것입니다. 이를 위해 공공 장소에 있는 사람들은 반드시 마스크를 착용해야 할 필요가 있으며, 무엇 보다도 코와 입을 완전히 가릴 수 있도록 올바르게 착용하는 것이 중요합니다. 하지만 넓은 공공장소에서 모든 사람들의 올바른 마스크 착용 상태를 검사하기 위해서는 추가적인 인적자원이 필요할 것입니다.
따라서, 우리는 카메라로 비춰진 사람 얼굴 이미지 만으로 이 사람이 마스크를 쓰고 있는지, 쓰지 않았는지, 정확히 쓴 것이 맞는지 자동으로 가려낼 수 있는 시스템이 필요합니다. 이 시스템이 공공장소 입구에 갖춰져 있다면 적은 인적자원으로도 충분히 검사가 가능할 것입니다.
데이터 셋
- 모든 데이터셋은 아시아인 남녀로 구성되어 있고 나이는 20대부터 70대까지 다양하게 분포하고 있습니다.
- 입력 값
- 전체 사람 수: 4,500 명 (train : 2700 | eval : 1800)
- 이미지 크기: 384 x 512 Image
- 한 사람 당 사진의 개수: 7 [마스크 착용 5장, 이상하게 착용(코스크, 턱스크) 1장, 미착용 1장]
- 결과 값 : 0~17 classes
Class | Mask | Gender | Age |
---|
0 | Wear | Male | <30 |
1 | Wear | Male | >=30 and <60 |
2 | Wear | Male | >=60 |
3 | Wear | Female | <30 |
4 | Wear | Female | >=30 and <60 |
5 | Wear | Female | >=60 |
6 | Incorrect | Male | <30 |
7 | Incorrect | Male | >=30 and <60 |
8 | Incorrect | Male | >=60 |
9 | Incorrect | Female | <30 |
10 | Incorrect | Female | >=30 and <60 |
11 | Incorrect | Female | >=60 |
12 | Not wear | Male | <30 |
13 | Not wear | Male | >=30 and <60 |
14 | Not wear | Male | >=60 |
15 | Not wear | Female | <30 |
16 | Not wear | Female | >=30 and <60 |
17 | Not wear | Female | >=60 |
활용 장비 및 개발환경
- OS : Ubuntu 20.04 LTS, Windows
- IDE : VS Code
- GPU : Tesla V100 *Boostcamp 로부터 제공받은 서버
- 주 사용 언어 : Python 3.8.5
- Frameworks : Pytorch 1.7.1, torchvision, albumentations, etc.
- Co-op tools : github, notion, slack
프로젝트 수행

- 프로젝트 목적의 달성과 동시에 팀원 개개인의 성장을 목표로, U stage에서 학습했던 다양한 방법론들과 추가적으로 습득한 지식을 실습한다.
- 팀원 개인이 모델링이 가능한 상황이므로 각자 실험을 반복하고, 시도한 방법과 결과를 공유하여 성능을 높이는 형태로 협업한다.
개인 회고
목표
- (팀) AI 모델링 파이프라인에 대한 이해를 위해 각자 모델링을 진행하고, 시도한 방법과 결과를 공유하며 성능을 높이는 형태로 협업을 진행한다.
- (개인) 나만의 모델링 코드를 구축하고, 다양한 실험 사이클(가설-검증)를 구성한다.
나는 내 목표를 달성하기 위해 무엇을 어떻게 했는가? (타임라인)
- baseline code작성 및 EDA
- 데이터 전처리
- 이상치 데이터 제거
- 공유받은 train 데이터 전수 조사 결과를 바탕으로 재 레이블링(re-labeling) 및 이상치 데이터 제거
- class 간 imbalance 문제를 해결
- 데이터 수가 비교적 적은 class 들의 이미지를 복제하고, transform을 적용하여 전체 데이터 셋의 균형을 맞춤.
- -> [baseline 제출] resnet18을 fine-tuning하여 학습시킨 모델을 제출하여 이후에 있을 실험에 대한 비교 기준(baseline)을 생성
- 결과: val: 90% | test: 20%
- 실패 원인 분석: train/val set을 나눌 때, 동일한 사람의 사진이 각 set에 나눠져서 들어가기 때문에 val에 치팅과 과적합이 있을 것이라고 판단.
- -> [가설: early stopping, train/val set split 구현] early stopping을 구현하고, 한 사람이 train/val set 중 하나에만 들어가게끔 하면 기존 문제점들을 해결할 수 있을 것이다.
- 결과: accuracy 63%의 baseline 모델을 얻게 됨.
- 결과 분석: accuracy가 63%인 모델을 얻게 되었으나, train/val의 accuracy 점수가 80%에 임박하는 것에 비해 너무 떨어지는 점수를 얻는다는 것을 발견.
- -> [가설: k-fold cv 구현] k-fold CV를 통해 좀 더 일반화된 모델 검증을 한다.
- 결과: cv에 대한 결과를 평균내어 좀 더 일반화된 모델 검증을 할 수 있었음
- 결과 분석: k-fold를 그저 일반화된 모델 검증용도로 만들었으므로, 직접적인 모델 성능 향상은 기대할 수 없었고, 오히려 당장의 실험 속도가 저하되어 학습목표달성에 안 좋게 작용한다고 판단 -> 보류
- -> [가설: 데이터셋 증강] 1. imbalanced sampler 라이브러리를 사용 / 2. 상대적으로 적은 데이터들을 증강시키어(Copy & Paste) class 비율을 비슷하게 맞추고, 중복되는 데이터에 대해 적절히 transform 시키면 모델 성능이 올라갈 것이다.
- 결과: 1. accuracy 65% / 2. accuracy 69%의 모델을 얻게 됨
- 결과 분석 1: imbalanced sampler 라이브러리는 minor한 클래스는 oversampling을 하지만, major 클래스에 대해서는 undersampling이 적용됨. 이 때문에 큰 성능 향상이 일어나지 않음.
- 결과 분석 2: 성능은 향상되었지만, 과적합 문제가 발생하였을 수 있다고 판단.
- -> [가설: albumentation, cutmix] albumentation 라이브러리를 통해 더 다양한 transform을 적용시키고, Cutmix를 구현하면, 일반화 성능이 올라갈 것이다.
- 결과: 성능 개선이 되지 않음
- 실패 원인 분석: Cutmix가 사람이 아닌 배경 부분에 적용됐을 경우에도 학습을 하기 때문에 오류가 발생할 수 있음
-> 제대로 된 원인 분석을 하지 않고, 다음 실험을 진행
- -> [가설: ensemble, nni] 팀원이 Age, Gender, Mask별로 따로 모델을 구현하여 ensemble 하는 것을 보고 따라함과 동시에 nni를 통해 하이퍼파라미터 서칭을 진행
- 결과: 성능 개선이 되지 않음
- 실패 원인 분석: 이전 가설에 대한 실패 원인 분석과 피드백을 정확히 하지 않아, Cutmix에서 동일한 오류가 발생했다고 판단됨
마주한 한계는 무엇이며, 아쉬웠던 점은 무엇인가?
- 계속되는 실험에도 성능이 나오지 않아 스스로 너무 조급해했던 것 같다. 이 때문에 실험 이후 제대로 된 피드백과 원인 분석을 하지 않았던 것 같다.
- 팀 단위로 협업을 제대로 못했던 점이 아쉽다.
- 시간이 부족하여 마지막 가설에 대한 실패 원인을 개선하지 못한 점과 다양한 모델을 실험해보지 못했던 점이 아쉽다.
한계/교훈을 바탕으로 다음 프로젝트에서 스스로 새롭게 시도해볼 것은 무엇일까?
- 계속해서 다음 실험을 계획하는 것보다 한 실험에 대해 정확한 원인 분석과 피드백을 하는 것이 더 중요하다는 것을 알았다. 다음 프로젝트에선 실험 별로 글이나 대시보드를 작성하며 이러한 문제를 해결해보도록 해봐야겠다.
- 효율성과 효과성을 높이기 위해 팀 내 분업, 대시보드 생성 및 관리 등 팀 단위 전략을 세세하게 세우고 프로젝트에 임해보고자 한다.