# K-AI 팀 리포트 백업본
# 프로젝트 개요
## 1. 프로젝트주제

- 코로나 시대에 마스크를 제대로 착용하여 확산을 방지하고자 함
- 사람 얼굴 이미지 만으로 마스크를 쓰고 있는지, 쓰지 않았는지, 정확히 쓴 것이 맞는지 자동으로 가려낼 수 있는 모델 구현
### 주요 이슈
- 각각의 class별로 Data가 imbalance한 문제
- 60대 이상의 데이터에서 60세만 존재하는 문제(edge case만 존재하는 문제)
- 데이터에 잘못된 labeling이 포함되어 있는 문제
- 이미지 데이터 확장자가 jpg와 png로 섞여 있는 문제
- 데이터가 충분하게 많지 않은 문제
- 각각의 class들이 독립되어 있지 않은 독립분포 가정 위배
- 연령에 대한 성능이 특히 안좋게 나오는 문제
## 2. 프로젝트 개요(프로젝트 구현 내용, 컨셉, 교육 내용과의 관련성 등)
- Python IDLE 형식의 프로젝트로 파이토치 딥러닝 모델 구현
- 제공된 데이터를 통해 데이터셋, 데이터로더 구현
- 그 외 여러 도구들을 통해 모델의 성능을 올리는 방법론을 적용
- 이론으로 학습한 내용을 직접 대회에 적용하여 실전에 도모하고자 함.
## 3. 활용 장비 및 재료(개발 환경 등)
- Train 데이터 18900, 테스트 데이터 12000
- Pytorch, Python IDLE
- 개인별 V100 서버
## 4. 프로젝트 구조
- 구성: Dataset, Evaluation, Inference, Loss, Model, Train
- Train 실행 시 설정은 따로 argument값을 넣도록 구현
- 미리 지정된 argument값은 sh파일로 분리
- 모델학습결과는 model폴더에 저장됨
## 5. 기대 효과
### 사회적 측면
- 건물 출입시 마스크 체크하는 비용을 절감할 수 있다.
- CCTV등 공공장소에서 적용할 경우 마스크를 제대로 착용하지 않은 다수의 인원을 적발함으로써 코로나확산을 사전에 방지할 수 있다.
### 참여자 측면
- 대회를 진행하면서 자신의 생각과 다른 부분을 직접 경험한다.
- 협업과정중 일어나는 트러블을 체험하고 해결과정을 통해 성장한다.
- 실전을 통해서 학습한 내용을 보충하고 발전시킨다.
# 프로젝트 팀 구성 및 역할
## T2001_강석민
- InceptionResnet을 Backbone으로 한 모델 구성
- Multi Sample Dropout 구현
- Optuna를 통한 하이퍼파라미터 최적화
- Wandb 사용
- 코드 리펙토링
## T2007_고지호
- data 정제: 숨김폴더/파일 삭제, 잘못 labeling된 데이터 수정, 사진 파일 확장자 .jpg로 통일
- FaceNet MTCNN과 RetinaFace를 이용해 Face Crop
- 둘 다 얼굴을 못 검출한 경우 같은 id의 bounding box를 평균내서 crop
- 하은님 CutMix 바탕으로 MixUp 구현
## T2065_김태욱(팀장)
- 베이스라인 구현 및 업데이트
- [model.py](http://model.py/) 내부 모델 추가
- tensorboard 사용
- focal loss, crossentropy loss 등 각 loss와 모델간의 조합(EfficientNet, Resnet ...) 실험
- 외부 데이터 추가 및 데이터셋 구현
- mask, gender, age별 모델링 구현(MaskBaseDataset_2) 및 통합결과 구현(total_result.py)
- EfficientNet version별 실험
- 결과물을 종합해 앙상블(hard voting)
## T2066_김태현
- 사람별, class별 Stratify dataset 구현
- EffNet을 기준으로 freeze하여 모델 학습 후 실험
- learning rate를 backbone부분과 classifier을 다르게 주도록 구현 후 실험
- classifier layer를 재구성 해서 학습 후 비교하며 실험
- loss별 학습 후 비교
- crossentropy / focal loss / f1 score
- focal loss + label smoothing
- focal loss + label smoothing + f1 score
## T2143_윤종원
- Facenet 이용 -> 미구현
- imbalanced 데이터 보정(사용하지 않음)
## T2214_조준희
- focal loss + label smoothing 구현
- ResNet 기준으로 Multi-output classification model 실험
- multi-label dataset 구현
- multi-label classification을 위한 joint loss 구현
- focal loss / label smoothing / focal loss + label smoothing 비교
## T2249_오하은
- CutMix 구현
- MTCNN으로 face detection해서 crop하기 구현 (하지만 size가 맞지 않는 거 같아 적용 못함)
# 프로젝트 수행 절차 및 방법
- 수행 기간: 21/08/23 ~ 21/09/03, 총 2주
- 1주차: Competition, Data Feeding, Model, Training, Ensemble & Tip 학습
- 2주차: 가볍게 본 이론을 바탕으로 실전에서 다양한 방법론 적용
## 1주차
- 서버를 생성하며, SSH를 통한 접속 방법을 학습. EDA분석을 통해 데이터의 특성을 파악함
- Pytorch의 Dataset, DataLoader을 이용하여 데이터를 모델에 적합한 방식으로 가공. Transforms 및 Albumentations 사용으로 데이터 변형
- 모델 구성방법과 미리 학습된 모델을 이용하는 법 학습.
- 모델 훈련시 필요한 요소(Loss, Optimizer, Metric), 업데이트 방식 및 과정을 관찰
- 앙상블 시도 =>
- 기타 활용하면 유용한 요소(앙상블, K-Fold, TTA, 하이퍼파라미터 등)
## 2주차
- Jupyter Notebook으로 되어있는 파일을 전부 py로 변경
- py를 이용하여 프로젝트를 구성하고 Multi sample dropout, CutMix, Mixup 구성
- 깃을 통한 버전관리 학습
- 외부데이터를 추가하여 모델을 class(마스크, 성별, 나이)별로 학습
- Optuna를 통한 하이퍼파라미터 최적화
# 프로젝트 수행 결과
- 탐색적 분석 및 전처리 (학습데이터 소개)
- 학습데이터 18900여개
- 테스트데이터 12600여개
- 외부데이터 153개
- 모델 개요
- CNN
- 모델 선정 및 분석
- 아키텍처: Efficient Net b7
- LB점수: 0.729
- training time augmentation
- Resize(), CenterCrop(), HorizontalFlip(), ShiftScaleRotate(), GaussNoise(), Normalize()
- img_size = 384 x 384
- Optimizer: Adam
- criterion: focal
- learning rate: 0.00003
- 모델 평가 및 개선
- 앙상블 & Hard Voting 시도
- 하이퍼파라미터 시도
- 시연 결과
-

# 자체 평가 의견
## 잘한 점들
- 외부데이터를 추가로 사용한 점
- Jupyter Notebook 탈출, 앙상블, Multi sample dropout, CutMix, Mixup 등 스페셜 미션을 전부 실험한 점
- 협력 과정에서 모르는 부분을 꼼꼼히 복습한 점
- 마찰없이 사이좋게 협력한 점
## 시도 했으나 잘 되지 않았던 것들
- 베이스라인코드 최적화
- Train.py의 함수하나가 너무 길어서 나누려 했으나, 이거 하나로 진행이 멈출 가능성이 있어서 그만둠
- K-Fold Validation
- 잘 구현된 모듈이 있지만, 직접 구현는 것은 제대로 하지 못하였다.
## 아쉬웠던 점들
- Optuna를 구현했으나 제대로 적용하지 못한점
- 마스크를 토대로 나이와 성별을 분리하는 것을 시도하지 못한점
- K-Fold를 못한점
- 서버를 소중히 하지않아서 서버가 자주 터진 점