코딩하는 해맑은 거북이

[부스트캠프 AI Tech 5기] LV1 - Image Classification 본문

AI/부스트캠프 AI Tech

[부스트캠프 AI Tech 5기] LV1 - Image Classification

#CJE 2023. 4. 24.
본 게시물의 내용은 '부스트캠프 AI Tech lv1' 대회를 마치고 작성하였다.

Image Classification 대회를 마치며...

해당 대회는 마스크 착용여부, 성별, 나이를 기준으로 총 18개의 클래스를 구분하는 문제이다.
한 사람당 사진의 개수는 7 [마스크 착용 5장, 이상하게 착용(코스크, 턱스크) 1장, 미착용 1장]로 되어 있고, 총 4500명의 사람이 포함된 데이터셋을 제공해주었다. 전체 데이터셋 중 60%는 학습데이터, 40%는 평가데이터로 활용된다.

평가방법은 F1 Score 통해 진행한다.
 
- 프로젝트 전체 기간 : 23년 4월 10일 (월) 10:00  ~ 4월 20일 (목) 19:00
- 랩업 리포트 및 동료피드백 제출 : 23년 4월 24일 (월) 14:00 까지
 
총 프로젝트 기간은 약 2주지만, 강의를 듣는 시간을 빼면 1주일 간의 대회기간이나 마찬가지였다.
며칠동안 잠도 줄여가며 프로젝트를 진행했음에도 하루하루가 매우 짧다고 느껴졌다.
부스트캠프를 시작하면서 첫 프로젝트이기도 했고, 팀원들에게 민폐를 끼치지 말아야겠다는 생각이 앞섰던 것 같다.
팀원들과 합심하여 여러가지 시도를 해본 결과, 총 20팀 중 8등으로 대회를 마무리 지었다.
우리 팀은 엄청 땅 끝에서 시작해서 차근차근 스텝을 밟으면 올라와서 결과에 매우 만족스러웠고,
우리 조가 8조인데, 8조에 8등..!! 이라며 다같이 기뻐하고 오히려 멋있다고 생각했다. (진심)

그때 같이 느꼈던 감정은 팀원 모두가 같을 것이라 생각한다.
각자 해보고 싶었던 것들을 다 하지 못해 아쉬움은 남았지만,
아쉬움은 그만큼 열심히 노력했기에 느낄 수 있는 감정이며, 아쉬운 그 만큼 기억에 오랫동안 남을 것이다.
 
우리 팀원들이 마지막까지 열심히 해주어서 너무 고마웠고, 같이 프로젝트하는 동안 너무 재밌었다.
그리고 팀원과의 소통이 매우매우 중요하다는 것을 몸소 배우고 간다..
각 팀원마다 문제를 바라보는 시각과 관점이 다름으로 새로운 다양한 아이디어가 많이 도출되었었다.
문제에 대해 같이 고민해보고, 여러가지 시도를 해보고 실패도 겪으면서 한층한층 성장하는 모습을 볼 수 있었다.
생각해낸 아이디어 전부를 실험해보지 못한게 아쉽지만, 다양한 접근법에 대해 많이 배울 수 있었다.
이번 주를 마지막으로 팀원들이 흩어지게 되지만, 우리는 여기가 끝이 아니라는것..!! (다시 만날 그 날을 기약하며..)
 

나의 역할

해당 프로젝트에서 내가 했던 역할은 데이터증폭 및 배경제거, Stratified k-fold, CutMix 설계 및 실험, 사전학습모델찾기였다.
 
- 데이터증폭 및 배경제거
먼저 데이터에 대해 EDA를 할 때부터, 한 사람당 마스크를 쓴 데이터는 5개이지만, 마스크를 이상하게 쓰거나 쓰지 않은 데이터는 1개씩만 존재하는 문제에 대해 깨닫고 있었다. 이러한 imbalance한 문제를 해결하기 위해 먼저 든 생각이 Augmentation 기법을 통해 증폭시키보자였고 이를 실천하여 우리팀의 성능 향상에 큰 기여를 했다.
사실 해당 부분은 다른팀도 모두 같은 생각을 했을 줄 알았지만, 나중에 다른 팀과 얘기를 나눠봤을 때 다들 60대 데이터만 건들인 것 같았다. 이를 통해 데이터셋 크기가 학습에 매우 중요한 역할을 한다는 것을 또다시 깨닫고 간다.
 
이미지의 배경 제거는 사람 주위의 배경을 제거하여 불필요한 정보를 학습하는 것을 방지하고, 사람 위주로 집중해서 학습할 수 있도록 하여 성능 향상을 기대했던 방법이다. 실제로도 배경 제거한 데이터셋을 사용했을 경우, 주어진 데이터셋 보다 성능이 향상된 것을 경험했고, 이를 증폭시킨다면 더 좋은 모델을 만들 수 있을 것이라 생각했다.
하지만, rembg 라이브러리를 사용해서 배경을 제거할 때 일부 Augmentation이 적용되지 않는 현상이 있어서 기존에 증폭시킬 때 ColorJitter와 RandomBrightnessContrast 함수를 적용하지 못하고, Rotate와 HorizontalFlip 함수만 적용되어 오히려 단순히 데이터 증폭된 데이터셋보다 성능이 떨어진 것을 볼 수 있었다.
배경을 제거하는데만 8시간 가량 소요되어, 증폭한 데이터셋에 배경을 제거하는 것을 차마 시도해보지 못했지만 이를 사용했다면 성능 향상에 많이 기여하지 않았을까하는 아쉬움이 남는다.
 
 
- Stratified k-fold
Stratified k-fold는 클래스 불균형 문제가 있는 데이터셋을 학습할 때, 클래스 비율을 고려해서 데이터를 나누어 학습하는 방법이다. 주어진 데이터셋은 나이, 성별, 마스크 등 클래스 불균형 문제가 크게 존재한다. 따라서 일반 학습보다 Stratified k-fold를 통해 학습하여 성능 향상을 기대해보았고, 직접 실험하고 비교해본 결과, 예상대로 일반 학습보다 성능이 조금 더 향상된 모습을 볼 수 있었다. 주어진 미션코드에서 Stratified k-fold에 문제가 있었고, 코드를 리뷰해볼 때 이를 발견함으로써 제대로 학습시킬 수 있어서 다행이라 느꼈다. 하지만, 팀원들에게 틀린 부분이 있어서 직접 수정을 했다고 말만 하고, 왜 틀려서 수정했는지에 대해 제대로 설명해주지 않아서 잘못 이해하여 Stratified k-fold를 제대로 사용하지 못하는 팀원도 있었다. 팀원과 이 문제에 대해 함께 토의해보는 시간을 가졌으면, 우리팀의 성능 향상에 Stratified k-fold가 기여될 수 있었을 텐데 해당 팀원도, 나도, 아쉬움이 많이 남는다.
 
 
- CutMix
주어진 데이터셋은 사람의 얼굴이 모두 중앙에 존재한다. 이를 통해 이미지를 세로로 절반씩 자르고 붙인 새로운 이미지를 학습시킨다면 일반화 성능이 오르지 않을까하여 시도해본 기법이다. 일반 학습으로 돌릴 때는 잘돌아가지만, 앞서 실험을 통해 Multi-Labeling과 합친 것이 더 성능이 좋게 나오는 것을 확인하고, CutMix도 Multi-Labeling과 적용해서 학습시키고 싶었지만, GPU 부족 에러로 제대로 실험하지 못했고 성능향상에도 크게 기여하지 못해 아쉽다. 하지만, CutMix를 찾아보며 직접 구현을 해본 것으로도 많이 만족스럽다.
 
 
- 사전학습모델 찾기
사전학습 모델 찾기에 역할을 맡았던 이유는, 앞서 ViT가 빠른 수렴과 최고 성능을 달하고 있었을 때 쯤이였다.
하지만 ViT는 과적합으로 Stratified k-fold가 적용되지 않았고, 이를 통해 저는 Stratified k-fold를 적용할 수 있는 사전학습 모델을 찾고자 했다. 그래서 사실은 장난삼아 ChatGPT에 image classification에 적용할 수 있는 사전학습 모델을 찾아달라고 해보았고, 그때 나온 것이 SwinTransformer 였다. 그리고 이전에도 실험을 했었지만 성능이 좋지 않은 줄만 알았던 EfficientNet이 label smoothing loss와 함께 썼을때 높은 성능을 보였다. 이를 통해 여러가지 실험으로 모델과 잘 맞는 하이퍼 파라미터가 존재하는 것을 깨닫게 되었고, SwinTransformer와 EfficientNet을 이용한 것 각각을 최종 모델로 제출하였다.
 
 

배웠던 키워드들

- EDA
- SSH
- Multi-Labeling
- Stratified k-fold
- CutMix
- TTA
- Early Stopping
- Label smoothing, F1 Loss
- AMP
- AdamW
- github, wandb
- Ensemble
- Augmentation
- Optuna
- VGGNet, ResNet, ViT, EfficientNet, SwinTransformer
 
 

Comments