BLOG

[네이버 부스트캠프 5기] Image Classification 프로젝트 리뷰

[네이버 부스트캠프 5기] Image Classification 프로젝트 리뷰

마지막으로 후기를 쓴 날짜가 3월 21일이다 ㅠㅠ 할 일도 많고 쓰기도 귀찮은데 매일 블로그 게시물 올리는 사람들 참 대단한 것 같다. 부스트캠프를 하며 느낀 점은.. 공식 이름이 '네이버 커넥트재단'에서 주관하는 '부스트캠프 AI Tech'인데 아직까지는 네이버랑 아무런 관련이 없는 것 같다. 부캠에는 만족하지만 그냥 그렇다고..

지난 시간이 2달이 넘은 만큼 그동안 했던 일들도 참 많다. 지금까지 Level 1 팀과 함께 Image Classification 프로젝트를 진행했고, Level 2 팀과 함께 Object Detection 프로젝트를 끝냈으며, Data Centric 프로젝트가 마무리 단계이다. 강의도 많이 들었고.

이번에는 더 까먹기 전에 Level 1팀과 진행했던 Image Classification 프로젝트에 대한 리뷰를 작성하려고 한다.

Image Classification은 말 그래도 이미지를 분류하는 문제이다. 이미지가 주어지면 강아지인지 고양이인지 분석하는 등의 예시가 있다.

사람 눈에는 당연히 이미지가 시각적으로 보이지만, 컴퓨터의 입장에서는 단순히 RGB 값이라는 숫자로 보일 뿐이다. 물론 이미지의 표현 방식에 따라 달라지겠지만. 이러한 숫자들을 재구성하고 특징들을 추출하여 고양이, 혹은 강아지 등의 라벨로 변환하여 보여주는 것이 Image Classification이다. Neural Network들은 Tensor로부터 특징들을 추출하는 방법이라고 볼 수 있겠다. 그리고 마지막으로 FC layer를 거쳐 라벨이 나온다.

부스트캠프에서 진행한 프로젝트는 마스크 착용 상태를 성별(남, 여), 연령별(under 30, 30-60, over 60), 마스크 착용(착용, 오착용, 미착용) 상태 별로 18개의 클래스로 분류하는 것이었다.

4월 12일부터 4월 20일까지 진행하였고, 하루에 10회 결과를 제출하며 성적을 비교할 수 있었다.

프로젝트 종료 후에는 private 데이터셋을 기준으로 다시 결과를 발표하는데, robust한 모델의 경우에는 순위 향상을 노려볼 수 있겠으나 대체로 큰 변화는 없었다.

베이스코드를 제공해 주어서 시작하기에는 편했다. 다만 베이스코드만으로 최상위 성적을 기대하기에는 무리가 있는 것 같다.

Base Model로 ResNet, EfficientNet, Vit 등을 사용했는데 프로젝트의 복잡도, 그리고 시간 등에 따라 적절히 선택해야 할 것 같다. 최종적으로는 EfficientNet을 사용했던 것 같은데, 실험 시에는 시간 단축을 위해 가장 가벼운 모델 중 하나인 ResNet18을 사용했다. 실험 결과 분석은 WandB를 이용하니 편리했다.

Center Crop : 적절한 Center Crop이 수행된다면 성능이 올라갔다. 데이터의 분포 자체가 얼굴이 중앙에 있는 사진들이 대부분이라 그렇다고 판단하였다.

Resize : (128,96), (256,192), (512,384) 3가지를 실험했는데, Resize가 클수록 성능이 좋았다. 이미지 크기를 줄이면 데이터 손실이 있으니 당연한 결과일지도. 하지만 사이즈가 크면 시간이 엄청나게 오래 걸려서 추후 실험을 진행하는 경우에는 128*96을 주로 이용하였다.

LR & Batch Size : Learning Rate와 Batch Size를 적절히 조절하면 성능이 올라간다. Learning Rate를 고정하고 Batch Size를 바꾸는 실험의 경우에는 Batch가 작아질수록 성능이 향상되었지만, 시간이 더 오래 걸렸다.

Loss : validation set 기준으로 f1 Loss가 가장 좋았는데 실제 제출 결과는 어떨지 모르겠다.

Optimizer : 기본은 SGD인데 Adam, AdamW 등을 실험했다. 모두 SGD보다는 낫더라.

이외에도 FC Layer, Labeling 등등...을 실험해봤다.

무엇보다 가장 큰 혁신은 3Head Model. 기존 모델은 성별, 연령, 마스크 착용을 한번에 예측하였는데 이를 모두 분리하였다. 성별과 마스크 착용의 예측은 거의 완벽했지만 연령을 예측하는 것에 어려움을 겪고 있었다. 지금 다시 보니 EDA를 잘 했으면 빠르게 도달할 수 있었던 결론이라고 생각이 들어 아쉽다. 어쨌든 이후의 실험은 연령을 더 잘 예측하는 것에 초점을 두고 진행하였다. 30세 미만의 데이터를 60세 이상으로 예측하거나 그 반대의 경우는 적었지만, 인접한 나이대를 구분하지 못하는 경우가 많았다.

외부 데이터셋을 가져오는 것은 대회 규칙에 어긋나서 포기. Miss Labeling 데이터를 제거하고, 60세 이상 데이터를 augmentation하여 추가 데이터셋을 만들어서 모델을 학습시켰는데 오히려 점수가 떨어졌었다. 아이디어는 조금씩 생겨나고 있는데 남은 시간도 점점 줄어들고.. 30세 미만인지 아닌지를 판별하는 모델과 60세 이상인지 아닌지를 판별하는 모델 두 가지를 만드는 방법도 생각했었는데 시간이 부족해 구현에는 실패했다.

이후 앙상블을 진행했더니 성능이 올라갔다. 신기하긴 했지만 실험으로 얻은 결과가 아니라.. 조금 아쉬웠다.

대회가 끝난 후에는 보고서를 작성해야 한다. 팀이 진행했던 일들과 개인 회고.. 그리고 멘토님의 피드백이 온다. 잘 정리해서 다음 프로젝트에서는 비슷한 실수를 하지 않도록 하자. 개인적으로 느꼈던 점들은 다음과 같다.

GitHub 사용이 서툴렀다. 같은 코드를 통해 같은 환경에서 실험한 결과들이 비교가 가능하고, 의미를 가지는데, 서로 다른 코드를 사용하여 현재 상황에 대한 의사소통이나 공유가 이루어지지 않아 같은 실험을 여러번 반복하거나, 실험 검증의 유효성이 떨어져 무의미한 시간을 쏟았습니다. 멘토링을 통해 이와 관련된 문제 의식을 공유하고, 수정하여 같은 베이스라인 코드를 사용하여 역할을 분배한 후 실험을 진행할 수 있었고, 기존보다 적은 시간을 사용하여 더 많은 가설을 검증하는 것이 가능해졌습니다. 프로젝트의 끝이 가까워지면서 더 많은 아이디어가 떠올랐지만 시간이 부족해 미처 검증을 완료하지 못했고, 부족한 의사소통으로 허비했던 시간이 더욱 아쉽게 느껴졌습니다. 라고 작성했었다.

EDA가 부족했다. EDA는 단순히 데이터를 분석하는 과정이 아니라 인사이트를 얻고, 실험의 진행 방향을 제시하는 과정인데 처음 EDA 수행 시 실험으로 연결할 수 있는 분석을 진행하지 못했고, 분석 결과를 시각화하는 등의 과정에서 부족함이 있었습니다. 이후 추가적인 EDA를 수행하여 Age Label을 개선하기 위한 가설을 세우고 검증하였고, 비록 유의미한 성능의 향상이 일어나진 않았으나 실험의 방향성을 쉽게 설정할 수 있었기에 EDA의 중요성을 느낄 수 있었습니다. 라고 적었다.

WandB 그래프와 실제 제출 성적간 괴리가 있었다. Validation 단계에서 나타난 지표와 실제 Test 단계의 성능에 괴리가 있었습니다, 자연스럽게 실험의 진행 방향을 세우는 것 역시 어렵게 느껴졌습니다. 대회 종료 후, 성능의 괴리는 Validation 과정에서 이용된 데이터가 Train 데이터와 유사도가 높기 때문에 일어난 Overfitting 현상에 기인했기 때문이라고 판단하였습니다. 라고 적었다. 이 부분이 정말 힘들었다. WandB에 찍힌 그래프는 분명히 가장 좋은 성능으로 나왔는데 제출했더니 오히려 훨씬 낮은 점수가 나오고 ㅠㅠ

아쉬운 점이 한가득이지만 그래도 첫 프로젝트인 만큼 많은 것을 느끼고 배울 수 있었다. 일단 가설을 설정하고 실험을 검증하는 과정을 경험해 볼 수 있었다. 그리고 멘토링 + 피드백이 방향성을 설정하고 대회를 분석해보는 것에 큰 도움이 됐다. 또 처음과 다르게 팀 분위기도 엄청 좋아져서 여러 아이디어나 대화도 쉽게 나눌 수 있었다. 관심 분야가 조금씩 달라 결국 떨어지긴 했지만, 좋은 팀원들이었고 대회가 끝난 후에는 줌으로 만나 맥주를 마시며 담소를 나누었다 ㅎㅎ CV-16 화이팅!