드디어 부스트 캠프에서 첫 번째가 대회가 시작되었습니다!
이미지 데이터가 주어졌을 때 이미지 속 사람이 마스크를 제대로 착용했는지, 연령대와 성별은 어떤지 판별하는 모델을 만드는 대회였습니다.
컴퓨터 비전쪽은 처음 해보는지라 더 설레고 재밌었던 것 같습니다.
💡 깃헙
그럼 리뷰 시작하겠습니다 ~~ !!
총 4,500명의 사람 이미지가 제공됩니다.
한 사람당 7개(마스크 착용 1, 2, 3, 4, 5, 잘못된 마스크, 마스크 미착용)의 사진이 주어집니다.
학습은 총 데이터의 60%를 이용하여 진행되고, 나머지 40%는 대회의 평가 기준으로 사용됩니다.
이미지는 마스크 착용 여부(착용, 미착용, 잘 못 착용), 나이(30대 미만, 30대 이상&60대 미만, 60대 이상), 성별(남, 여) 총 18개의 클래스로 분류 됩니다.
F1 score
총 7가지 모델을 이용하여 실험을 진행하였습니다.
각각 실험 결과, 동일한 조건에서 pre -train된 ResNet50의 정확도가 가장 높게 나왔습니다.
[ResNet18] 실험 f1 : 77.34
[ResNet50] 실험 f1 : 78.41
[ResNet152] 실험 f1 : 73.94
Pre-trained모델이 아닌 직접 구현해본 네트워크(CNN 5개를 사용하여 ResNet과 비슷하게 구현해보았습니다.)에서 BatchNorm, DropOut을 사용해보며 실험을 진행하였습니다. 실험결과 BatchNorm, DropOut 둘 다 사용했을 시 가장 정확도가 높게 나왔지만, pre-trained모델을 사용할 시 네트워크 내부에 DropOut을 적용하는 데 어려움을 겪어, ResNet50에서는 BatchNorm만 사용하기로 결정하였습니다.
(model = ResNet50)
실험 결과 0.0001에서 가장 높은 정확도가 나왔습니다.
실험결과 Adam에서 높은 정확도가 나왔습니다.
Cross Entropy에서 가장 높은 정확도가 나왔습니다.
64에서 가장 높은 정확도가 나왔습니다.
정확도의 최고 기록은 Epoch 10 이내에서 나오는 것을 확인하였습니다.
팀원들과 회의결과 사진에서 얼굴이 위치한 가운데 부분을 crop했을 경우 정확도가 더 높아진다는 사실을 알게 되어, 얼굴이 위치한 곳만 잘라내기 위하여 CenterCrop((384, int(384*0.8)))을 적용하여 진행하였습니다.
사진에서 얼굴뿐만으로는 나이를 인식하기 어렵다고 생각하여 옷차림까지 학습시키기 위해 옷차림까지 포함되는 사이즈로 crop하여 학습을 진행하는 방법을 팀원이 제시해주어 저도 한 번 실험을 진행해보았지만 정확도가 더 낮게 나와 다시 CenterCrop을 사용하였습니다.
여러 실험결과 팀원 분께서 제시해주셨던 값(세번 째)을 사용했을 때 정확도가 가장 높게 나왔습니다.
[224, 224]에서 높은 정확도를 보여주었습니다.
ClolorJitter(0.1, 0.1, 0.1, 0.1)를 학습시에 적용하였습니다.
RandomGrayscale(p=1)을 학습시에 적용하였습니다.
작년 대회 기록들을 보니, 불균형한 나이 데이터의 한계를 조금이나마 극복하고자 classification 기준을 기존 나이 30, 60에서 29, 59로 하는 것을 보았습니다. 그래서 저는
이렇게 세가지 조건에서 실험을 진행해 보았고, 결론적으로 29, 59에서 높은 정확도를 얻을 수 있었습니다.
exp30 = 29, 59
exp31 = 28, 58
대회 게시판을 구경하다 데이터에 오류가있다는 글을 보게 되었습니다. 총 35가지의 데이터가 오류가 있다고 하셨는데, 그 중 성별같은 주관적인 데이터를 제외하고, normal, incorrect_mask 이렇게 두가지가 뒤바뀌어서 레이블링 된 데이터 총 14가지 정도를 수정하고 다시 학습을 시켜 보았습니다.
exp17 = 기존
exp18 = 데이터 수정 후
이상하게도 데이터 수정 후 F1 score가 (최고기록 기준)대략 5%정도 낮아져서 원본 데이터는 건드리지 않기로 결정했습니다.
제출 f1 0.75로 한 때(처음이자 마지막으로..) 전체 8등을 기록했습니다!!😆😆
잘 pre-trained된 모델만으로도 높은 결과가 나올 수 있다는 걸 알게되었습니다.
Dropout, 앙상블, 병목데이터, 부족했던 데이터 늘리기 등등 시도해보고 싶은 것들이 많았는데 다 해보지 못해서 아쉬웠습니다. 또한 ResNet에만 꽂혀서 다른 SOTA 모델들을 찾아보고 시도해보지 않은 것도 아쉽습니다.
다음에는 pre-trained된 모델을 그저 가져다 쓰고 하이퍼 파라미터 조정 정도에서 끝나는 것이 아닌 더 효과적인 Augmentation을 해보고 앙상블 등 더 많은 방법들을 활용하여 학습을 진행해 보고 싶습니다.
✏️ 한 때 8등이었지만,,^^.. 점점 떨어져 최종 public data에서는 18등, private data에서는 21등을 기록하였지만, 그래도 만족스러운 결과였던 것 같습니다.
실험 결과를 읽으면서 생긴 궁금점들입니다!
하이퍼 파라미터 실험 설정 관련해서 궁금한게 있는데요.
각 파라미터에 대해서 실험을 할 때 나머지 조건들은 어떻게 진행이 되었나요?
왠지 이런 방식으로 진행했을 것 같은데 맞을까요?
이렇게 할 경우 fair 한 grid search 보다는 베이지안 최적화에 가까운 것 같습니다.
베이지안 최적화를 사용하려면 좀 더 실험 설계에 신경써야 됩니다.
epoch에서 왜 epoch 10 이내에서만 나오게 될까요?
overfitting과 연관지어서 설명할 수 있으면 좋을 것 같습니다.
Augmentation
왜 얼굴만 crop할 경우 정확도가 높아진다고 생각하시나요?
왜 옷차림은 정확도 상승에 영향을 미치지 못했을 까요?
normalize에서의 rgb의 mean, std는 어떻게 계산된 건가요?