---
# System prepended metadata

title: K-AI 팀 리포트 백업본

---

# K-AI 팀 리포트 백업본

# 프로젝트 개요

## 1. 프로젝트주제

![https://i.imgur.com/T9RxL0d.png](https://i.imgur.com/T9RxL0d.png)

- 코로나 시대에 마스크를 제대로 착용하여 확산을 방지하고자 함
- 사람 얼굴 이미지 만으로 마스크를 쓰고 있는지, 쓰지 않았는지, 정확히 쓴 것이 맞는지 자동으로 가려낼 수 있는 모델 구현

### 주요 이슈

- 각각의 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 시도
    - 하이퍼파라미터 시도
- 시연 결과
-

    ![https://i.imgur.com/Mhxe13e.png](https://i.imgur.com/Mhxe13e.png)

# 자체 평가 의견

## 잘한 점들

- 외부데이터를 추가로 사용한 점
- Jupyter Notebook 탈출, 앙상블, Multi sample dropout, CutMix, Mixup 등 스페셜 미션을 전부 실험한 점
- 협력 과정에서 모르는 부분을 꼼꼼히 복습한 점
- 마찰없이 사이좋게 협력한 점

## 시도 했으나 잘 되지 않았던 것들

- 베이스라인코드 최적화
    - Train.py의 함수하나가 너무 길어서 나누려 했으나, 이거 하나로 진행이 멈출 가능성이 있어서 그만둠
- K-Fold Validation
    - 잘 구현된 모듈이 있지만, 직접 구현는 것은 제대로 하지 못하였다.

## 아쉬웠던 점들

- Optuna를 구현했으나 제대로 적용하지 못한점
- 마스크를 토대로 나이와 성별을 분리하는 것을 시도하지 못한점
- K-Fold를 못한점
- 서버를 소중히 하지않아서 서버가 자주 터진 점