[PStage] 마스크 착용상태 분류 대회

두꺼비·2022년 3월 10일
2
post-thumbnail

드디어 부스트 캠프에서 첫 번째가 대회가 시작되었습니다!

이미지 데이터가 주어졌을 때 이미지 속 사람이 마스크를 제대로 착용했는지, 연령대와 성별은 어떤지 판별하는 모델을 만드는 대회였습니다.

컴퓨터 비전쪽은 처음 해보는지라 더 설레고 재밌었던 것 같습니다.

💡 깃헙

그럼 리뷰 시작하겠습니다 ~~ !!



데이터

총 4,500명의 사람 이미지가 제공됩니다.
한 사람당 7개(마스크 착용 1, 2, 3, 4, 5, 잘못된 마스크, 마스크 미착용)의 사진이 주어집니다.
학습은 총 데이터의 60%를 이용하여 진행되고, 나머지 40%는 대회의 평가 기준으로 사용됩니다.

이미지는 마스크 착용 여부(착용, 미착용, 잘 못 착용), 나이(30대 미만, 30대 이상&60대 미만, 60대 이상), 성별(남, 여) 총 18개의 클래스로 분류 됩니다.


평가 기준

F1 score


모델

  • 직접 만든 네트워크
    CNN, CNN 5개
  • pre-trained model
    ResNet18, RseNet50, ResNet152, EfficientNetB0, EfficientNetB4

총 7가지 모델을 이용하여 실험을 진행하였습니다.
각각 실험 결과, 동일한 조건에서 pre -train된 ResNet50의 정확도가 가장 높게 나왔습니다.

[ResNet18] 실험 f1 : 77.34

[ResNet50] 실험 f1 : 78.41

[ResNet152] 실험 f1 : 73.94

BatchNorm, Dropout

Pre-trained모델이 아닌 직접 구현해본 네트워크(CNN 5개를 사용하여 ResNet과 비슷하게 구현해보았습니다.)에서 BatchNorm, DropOut을 사용해보며 실험을 진행하였습니다. 실험결과 BatchNorm, DropOut 둘 다 사용했을 시 가장 정확도가 높게 나왔지만, pre-trained모델을 사용할 시 네트워크 내부에 DropOut을 적용하는 데 어려움을 겪어, ResNet50에서는 BatchNorm만 사용하기로 결정하였습니다.

하이퍼 파라미터

(model = ResNet50)

Learning rate

  • 0.001
  • 0.0001
  • 0.00001

실험 결과 0.0001에서 가장 높은 정확도가 나왔습니다.

Optimizer

  • SGD
  • Adam

실험결과 Adam에서 높은 정확도가 나왔습니다.

Criterion

  • Cross Entropy
  • f1
  • label smoothing

Cross Entropy에서 가장 높은 정확도가 나왔습니다.

Batch_size

  • 32
  • 64
  • 128
  • 256

64에서 가장 높은 정확도가 나왔습니다.

Epoch

  • 10 ~ 20

정확도의 최고 기록은 Epoch 10 이내에서 나오는 것을 확인하였습니다.


Augmentation

CenterCrop

팀원들과 회의결과 사진에서 얼굴이 위치한 가운데 부분을 crop했을 경우 정확도가 더 높아진다는 사실을 알게 되어, 얼굴이 위치한 곳만 잘라내기 위하여 CenterCrop((384, int(384*0.8)))을 적용하여 진행하였습니다.

Lambda

사진에서 얼굴뿐만으로는 나이를 인식하기 어렵다고 생각하여 옷차림까지 학습시키기 위해 옷차림까지 포함되는 사이즈로 crop하여 학습을 진행하는 방법을 팀원이 제시해주어 저도 한 번 실험을 진행해보았지만 정확도가 더 낮게 나와 다시 CenterCrop을 사용하였습니다.

Normalize

  • Normalize((mean=(0.5, 0.5, 0.5), std=(0.2, 0.2, 0.2))
  • Normalize(mean=(0.548, 0.504, 0.479), std=(0.237, 0.247, 0.246))
  • Normalize((mean=(0.5602, 0.5241, 0.5015), std=(0.6166, 0.5872, 0.5683))
  • Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.224)

여러 실험결과 팀원 분께서 제시해주셨던 값(세번 째)을 사용했을 때 정확도가 가장 높게 나왔습니다.

Resize

  • [128, 96]
  • [128, 128]
  • [224, 224]

[224, 224]에서 높은 정확도를 보여주었습니다.

ColorJitter

ClolorJitter(0.1, 0.1, 0.1, 0.1)를 학습시에 적용하였습니다.

RandomGrayscale

RandomGrayscale(p=1)을 학습시에 적용하였습니다.

나이 기준 바꾸기

작년 대회 기록들을 보니, 불균형한 나이 데이터의 한계를 조금이나마 극복하고자 classification 기준을 기존 나이 30, 60에서 29, 59로 하는 것을 보았습니다. 그래서 저는

  • 30, 60
  • 29, 59
  • 28, 58

이렇게 세가지 조건에서 실험을 진행해 보았고, 결론적으로 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등을 기록하였지만, 그래도 만족스러운 결과였던 것 같습니다.

profile
두꺼비는 두껍다

1개의 댓글

comment-user-thumbnail
2022년 3월 10일

실험 결과를 읽으면서 생긴 궁금점들입니다!

하이퍼 파라미터 실험 설정 관련해서 궁금한게 있는데요.
각 파라미터에 대해서 실험을 할 때 나머지 조건들은 어떻게 진행이 되었나요?
왠지 이런 방식으로 진행했을 것 같은데 맞을까요?

  1. learning rate 실험 시 다른 조건은 고정한다.
  2. learning rate 실험에서 얻은 값과 다른 값을 고정하고 optimzer 를 실험한다.

이렇게 할 경우 fair 한 grid search 보다는 베이지안 최적화에 가까운 것 같습니다.
베이지안 최적화를 사용하려면 좀 더 실험 설계에 신경써야 됩니다.

epoch에서 왜 epoch 10 이내에서만 나오게 될까요?
overfitting과 연관지어서 설명할 수 있으면 좋을 것 같습니다.

Augmentation
왜 얼굴만 crop할 경우 정확도가 높아진다고 생각하시나요?
왜 옷차림은 정확도 상승에 영향을 미치지 못했을 까요?

normalize에서의 rgb의 mean, std는 어떻게 계산된 건가요?

답글 달기