서론
11월 3일 부로 CV기초 대회가 끝이 났다. 마스크 착용상태, 성별, 나이를 분류하는 문제였는데, 최종 15위로 브론즈 턱걸이를 하였다
이 대회에서는 점수보다는 배움에 조금 더 집중을 했었고, 그래서 무의미한 Hyperparameter Tuning 보다 다양한 것들을 시도해 보려고 노력했다. 2주 동안이라는 시간이 그렇게 길지 않았고, 그래서 더 해보고 싶은 것들도 많았지만 못해봐서 아쉬운 면도 있다
Phase 1: 아이디어 내기
오프라인으로 모인 첫날과 두 번째 날에 팀원들이 모여서 아이디어를 내었다. 모델 나누기, age regression 등 다양한 아이디어들을 도출해낼 수가 있었다. 이를 통해서 앞으로 점수를 올릴 수 있는 전략을 세웠다.
아이디어라는 것은 좋은 결과를 낼 수도, 낼 수 없을 수도 있지만, 이를 brainstorming 하는 과정에서 창의적인 사고를 기르는 방법을 배우기 때문에 중요한 과정이라 생각한다.
Phase 2: EDA(Exploratory Data Analysis)
이 과정에서는 다양한 기법을 이용해서 데이터 분석을 시도해 봤다. 주피터 노트북과 matplotlib를 열심히 사용해서 각종 그래프와 다이어그램을 그려보았다.
이 과정을 통해서 seaborn과 matplotlib에 더 친숙해질 수가 있었고, 이를 이용해서 나중에 학습 중에도 confusion matrix를 그려보았다.
EDA를 통해서 어떤 부분이 문제가 될 수 있는지 확인했고, 나이의 분포가 불균형하다는 것을 찾아내서 이를 해결할 방안을 찾았다
Phase 3: Baseline
대회에서 준 베이스라인 코드가 있었지만, 이를 사용하기에는 그냥 모델만 넣고 돌리는 것 같아서 다른 방식으로 만들어 봤다. 일단 코드의 구조 그 자체는 베이스라인과 아주 흡사했지만 dataset 부분을 바꾸어서 이미지 별로 dataset을 나누는 게 아니라 사람 별로 나누어 주는 코드를 짰다.
PyTorch로 학습 코드를 짜면서 발견한 것인데, PyTorch는 딱히 어떻게 코드를 짜라는 형식이 만들어져 있는 게 아니라서 이를 해결할 대체제를 찾았다. PyTorch Lightning이라는 Keras 같은 high-level wrapper 개념의 라이브러리이다. 이에 대한 글은 PyTorch Lightning 사용기 1 - 장점과 단점 — LimePencil's Log (tistory.com) 여기에 써두었다. 이를 통해서 training, validation, test를 구분하면서 구현할 수 있었고 이를 통해서 training, validation, test를 구분하면서 구현할 수 있었고 더욱더 코드가 간결해졌다.
이 과정을 거치면서 제일 많이 배운 부분이였다고 생각한다. 코드를 일일이 뜯어보면서 PyTorch 코드와 어떻게 학습을 수행하는지에 대한 지식을 많이 배울 수 있었다. 다음 대회부터는 베이스라인 코드를 미리 짜두어서 시간 낭비를 줄이고 싶다.
Phase 4: Model Comparison
이 부분에서는 다양한 모델들을 실험해 보면서 어떤게 이 주제에 적합할지 실험해 보는 과정을 가졌다. ResNet, EfficientNet, ViT, BEiT, Swin Transformer, ConvNet, ResNeXt, ConvNeXt 등등 다양한 모델들을 실험해 보았는데, 이중에서는 큰 모델들과 작은 모델들의 차이가 크지 않아서 나중에는 ResNet 기반이나 EfficientNet 기반들의 모델들을 사용했다.
작은 모델들의 장점은 빠른 실험과 테스트가 가능 하다는 것이다. 이게 왜 중요하냐면 대회 후반부로 갈수록 작은 것들을 하나하나 수정하면서 돌려보는데, 이때 parameter수가 큰 모델들을 사용하면 epoch당 시간이 길어져서 어렵기 때문이다. 이때 baseline 코드들을 모듈화 시켜놓은 게 도움이 되었다. 이를 통해서 새로운 모델을 실행하고 싶으면 그냥 model.py에 새로운 class를 하나 더 정의해주면 되기 때문이다.
Phase 5: Various Testing
이 파트에서는 삽질을 많이 해봤다. 불균형한 데이터를 해소하기 위해서 Imbalaced Dataset Sampler도 적용해 봤고, 또한 60대 이상으로 분류하는 카테고리를 57대 이상으로 바꾸어 보기도 했다. 다른 팀이 발표한 결과를 보니까 이제 유효한 정답이였다는 것을 알고 조금은 슬펐다. 그리고 얼굴 인식을 해서 cut-mix를 하는 방식도 생각을 해보았지만 이를 적용하기에는 시간이 부족할 것 같아서 하지 않았는데 이 또한 유효한 정답이었던 거 같다.
끝에 가서는 Albumentation을 사용해 여러가지 augmentation 기법들을 적용해 보았다. 얼굴 형태를 더 도드라지게 만들어주는 CLAHE와 다양한 다른 (Colorjitter, gaussian noise)등 사용해 보았지만 성능이 두드러지게 올라가지는 않았다.
Final Thinking...
일단 이 대회를 잘 마무리한 우리 팀원 분들께 감사의 인사를 올리고 싶다. 아침부터 저녁까지 줌을 계속 키면서 작업을 하니까 집중이 더 잘 되었던 거 같다. 특히 평소에 코딩을 할 때에는 혼자 했었던 경험밖에 없어서, 이런 경험은 신선하고 재미가 있었다. 처음에 협업 부분에서 조금 삐걱거리던 부분이 있었지만, 열심히 다 같이 해서 헤쳐 나갔다.
베이스라인을 통일하지 못하고 각자 다른 일을 한 부분이 있었지만, 이를 통해서 많은 것들을 배웠기 때문에 후회는 없다. 다음 대회에선 기록과 베이스라인 코드들 더 잘 짜놓고 시작해서 성능보다 깔끔한 정리를 해보고 싶다. 이런 다른 사람과의 커뮤니케이션 능력을 올려서 나중에 유용하게 쓸 거 같다. 그리고 V100서버를 사용해 보았는데, 그전에 연구실에서 서버를 사용했을 때는 다른 석사, 박사 분들도 쓰고 계셔서 환경을 잘 건드리지 못했었다. 이 기회에 ssh연결도 해보고 다양한 configuration을 배우면서 나중에 이런 부분을 더 잘할 수 있다는 생각이 든다.
'잡다한 것들 > 부스트캠프 AI Tech 4기' 카테고리의 다른 글
부스트캠프 9주차 학습 일지 - Object Detection 1 (0) | 2022.11.14 |
---|---|
부스트캠프 8주차 학습 일지 - AI 서비스 개발 기초 (0) | 2022.11.07 |
6주차 학습 일지 - CV 기초대회 (0) | 2022.10.24 |
부스트캠프 5주차 학습 일지 - Computer Vision Basics (0) | 2022.10.18 |
부스트캠프 4주차 학습 일지 - Computer Vision Basics (0) | 2022.10.11 |