실험 2 - Classification Model
분류 문제를 진행함에 있어 성능을 저하시킬 수 있는 요소들을 배제하고 실험할 수 있도록 데이터를 설계후 실험 진행
실험 2. 1
가설 :
데이터를 분석해본 결과 각 라벨별로 가장 수가 적은 라벨의 데이터는 83 장의 사진이고
그 다음으로 적은 수의 데이터는 109 장인 것으로 나타남.
따라서 라벨당 데이터를 100장씩 뽑아서 subsampling 할 경우 충분히 균등한 데이터셋을 만들 수 있음.
18개의 라벨에 대해서 각 100장씩 뽑으면 1800장의 사진이 확보됨.
이 사진에 대해서 분류문제 진행.
검증 :
ResNet18을 이용하여 미리 학습하지 않은 모델과 ImageNet에 대해서 학습된 모델을 각각 해당 이미지 세트에 훈련함.
훈련시 대회의 Metric인 F1score 를 높여야하므로 loss 함수에 (1- F1score) 값을 함께 loss에 넣고 훈련
사진의 크기는 128 x 128의 해상도로 보았을때 사람의 눈으로 봐도 구분이 가능한 정도이므로 이 크기로 훈련
결과 :
맨 처음 CrossEntropyLoss만으로 학습했을 때는 Accuracy가 50%로 반반 찍기 수준의 모델이 나옴.
loss = (1 - p) * CrossEntropyLoss + p * (1-Fqscroe) 로 훈련한 결과 p = 0.4 일때 가장 좋은 결과가 나옴.
이때는 F1scoe 0.8, Accuracy 80% 까지 성능이 나오는 것을 확인함
Augmentation에서 Horizontal Flip만 썼을 경우와 Horizontal Flip, -15'~15' RandomTilt, ChannelwiseNormalize, RandomCrop, mean subtraction 등을 함께 사용했을 경우의 성능 향상이 발생하지 않고 어떤 것은 오히려 떨어짐.
반성 :
제출 결과 리더보드에는 F1 score 가 0.61 Accuracy가 66% 정도로 낮게 나옴.
1. validation set을 너무 편현되게 짰을 가능성이 있다.
현재 데이터셋은 같은 사람으로부터 마스크 착용/미착용/오착용 의 세가지 사진이 찍힌 상태이므로 validation을 짤 때도 이점을 고려하여 인물 단위에서 train과 validation이 나뉘도록 해줘야한다. 전체 train데이터에서 무작위로 20%를 나눈 데이터를 validation으로 사용했기 때문에 훈련결과가 좋다고 판단했을 가능성이 높다.
2. 얼굴 부분 crop이 정확히 진행되지 않았을 가능성이 있다.
test데이터에 train과 동일한 위치로 crop을 진행하고 눈으로 확인한 결과 얼굴이 심하게 짤려나가는 사람이 있는 것을 확인. 이 경우 [남성 / 60세 이상 / 마스크 미착용자] 인데 [여성 / 60세 이상 / 마스크 미착용자]로 분류함. 사진마다 알고리즘으로 얼굴을 추적하고 그 위치를 crop 하는 방식을 적용해 볼 필요가 있음.
3. MixUp과 CutMix 를 통한 라벨 믹스를 진행했는데 두개 다 결과가 더 나아지지 않음. 코드를 잘못짰거나 알고리즘의 원리를 잘못 이해했는지 점검해볼 필요가 있음.
실험 2. 2
가설 : 알고리즘을 이용하여 얼굴의 위치를 연산하고 crop하면 성능향상에 도움이 될 것이다. 또한 validation을 인물 단위로 나워주면 검증에 더 유효한 validation set 이 만들어 질 것이다.
검증 :
위의 모델과 동일한 모델을 이용하여 인물 단위의 data split 을 진행하고
아래의 알고리즘을 이용한 face detection crop 기법을 사용 (안영진 캠퍼님이 공유해주신 코드)
1) MTCNN으로 Detection 및 Crop
2) 얼굴이 탐지가 안 된다면 Retinaface로 Detection 및 Crop
3) 그래도 안 되면 박상현 캠퍼님이 평균을 구하신 Bounding Box로 Crop하는 구조입니다.
https://stages.ai/competitions/74/discussion/talk/post/539 에서 인용
결과 :
hyperparameter search를 자동화하고 코드를 돌렸으나 코드가 완전히 돌아간 후에 버그가 발견됨
그 코드를 통해 얻은 결과를 모두 폐기처분함
그 후 제출기한 내에 훈련을 완료하지 못하여 제출하지 못함
validation에 대해서는 역시 80% 의 Accuracy를 최고로 얻었고 이때 F1 score는 0.79를 얻음
반성 :
1. 프로잭트 단위의 코드를 운영할 것.
코드를 처음부터 프로잭트 단위로 진행하면서 아이디어가 떠오르면 바로 실행해 볼 수 있는 구조까지 만들어 두는 작업이 선행되어야한다. 코드를 찔끔찔끔 바꾸니까 될 일도 안된다. 탬플릿을 먼저 만들고 진행하는 습관을 들이자.
2. hyperparameter serch를 더 유용한 툴로 사용할 것.
'딥러닝 머신러닝 데이터 분석 > BoostCampAITech' 카테고리의 다른 글
[CV] Image Classification 2 (0) | 2021.09.08 |
---|---|
[CV] 0. Computer Vision OT & 1. Image Classification 1 & 2. Annotation data efficient learning (0) | 2021.09.07 |
[P-Stage] 마스크 데이터 분류 대회 리포트 - 1 (0) | 2021.09.03 |
[ BoostCamp ] Day-18 학습로그( PyTorch pretrained model ) (0) | 2021.08.20 |
[ BoostCamp ] Day-17 학습로그( PyTorch의 구조 학습 ) (0) | 2021.08.20 |
댓글