새소식

Study/프로젝트

[AI factory, LG 해커톤] LG입자형태분석 대회 참가 후기

  • -
728x90

대회 막바지인 8월초 코로나 확진을 받고 이제야 써보는 첫 대회 후기입니다! 
주최에서 제공한 대회의 베이스라인 코드는 mmdetection이었지만 사진 데이터가 딱봐도 생산팀의 실제 데이터여서 보안 사항에 민감할 것 같았고 parameter tuning 위주로 진행했기 때문에 깃허브 업로드는 없이, 간략하게 정리해보겠습니다. 

1. 개요

주최/주관: LG화학, AIfactory
대회 목표: 각 입자의 형상을 최대한 정확하게 segmentation
Problem type: instance segmentation (이미지 내에 존재하는 객체를 탐지하는 동시에 각 class 내에서도 픽셀 단위로 분류 필요)
데이터 종류: 비정형 데이터 (이미지)

조 구성: 3명
Env: python 3.8, torch 1.12 (on Colab cuda 11.3)

2. 사용 모델 및 hyperparameter tuning

baseline 으로 제공받은 코드는 MMdetection을 기반으로 모듈화된 구조였습니다.모듈화된 코드를 사용하는 것은 처음이었지만 config 형태의 코드를 통한 hyperparameter 변경이 어렵지 않았고, 공식 document 도 잘되어 있어 공부하기가 수월했습니다.

 MMdetection 아키텍처에서 instance segmentation을 위해 사용할 수 있는 모델들은 깃허브에서 확인할 수 있었습니다.

출처: https://github.com/open-mmlab/mmdetection

 프로젝트를 진행하는 동안 2번의 멘토링 시간을 가졌고, 각 회마다 다른 분이 피드백을 진행해주셔서 조금 혼란스러운 감이 없지는 않았습니다. 첫 번째로 가졌던 멘토링 시간에는 점수를 올리기 위해서는 그저 노가다가 필요하다고 하셨고ㅎ 모델을 바꾸는 것보다는 hyperparameter tuning을 통해 성능을 개선하는 방향으로 진행할 것을 조언해주셨습니다. 

 조원끼리 모델이 겹치지 않도록 하여 총 6개의 모델을 사용해 성능을 확인해볼 수 있었습니다.  각 모델에 대해 찾아본 내용을 간략히 정리하면 아래와 같은데, 모델마다 추가되는 branch가 있거나 roi가 따로 지정되지 않는 등의 특징이 있기 때문에 config 에서도 입력값이 다 달라졌습니다. 

  • mask RCNN - faster RCNN의 각 RoI마다 segmentation mask를 예측하는 브랜치 추가
  • ms RCNN - mask RCNN 모델 기반, predicted instance masks의 품질을 체크하는 MaskIOU head를 추가
  • HTC (hybrid task cascade) - 여러 개의 classifier사용, classifier들은 전단의 classifier가 만든 bounding box를 받아서 새로운 classification task를 수행 및 반복하여 성능 개선
  • SOLO - 별도로 포스팅
  • mask2former - (pixel이 아닌) mask 단위로 intance를 학습 
  • yolact - 두 개의 병렬 subtask (prototype branch/prediction head branch)로 나누어 학습

각 모델마다 Hyperparameter 가 조금씩 달라지긴 했지만, 큰 틀에서의 tuning의 맥락은 비슷했습니다. 

    •  Epochs
      2, 5부터 시작해 120까지 늘려보는 등 다양한 시도를 해보았습니다. 120번의 학습 중 중간중간 save interval을 지정해 같은 조건의 30~40 epochs의 학습 결과로도 test data를 평가해보았는데, 오히려 적은 epoch 점수가 더 높았던 경우도 있었습니다. 
    • learning rate policy
      Cosine annealing, Poly, Step 등의 policy를 시도해보았습니다. 
    • Pre trained weight load
      각 모델에 맞는 weights.pth 파일을 모델의 깃허브에서 다운로드가 가능해, 미리 학습된 가중치와 bias들을 불러왔을 때 훨씬 성능이 좋아졌습니다. 
    • batch size
    • optimizer
  •  

2-1. error

사실 6개의 모델 외에도 추가적으로 시도해본 모델이 있었으나.. weight 를 load해서 사용할 때마다 다음과 같은 에러를 마주했습니다.

이런 warning 과 함께 loss 가 Nan이 되는 대참사(weight  exploding)가 일어남

 라이브러리의 기본 데이터셋이 coco dataset이고 이 데이터셋의 클래스 개수는 80개라고 합니다. 사전학습을 통해 고정된 weight의 개수와 input data의 class 개수와 차이가 있어 이런 에러가 생긴다고 추측하고 있는데, 해결 방법은 아직 못찾았습니다. 얕은 지식으로 관념적으로만 생각해보자면 첫 번째 레이어의 node 개수를 랜덤하게 input size만큼만 고르면 될 것 같은데.. 이 방법은 아직 못찾았습니다. 

 혹은 Pretrain weight&bias  저장된 학습한 조건을 확인해서 learning rate를 그에 맞게 조정해 해결해볼 수 있다고 합니다. 예를 들어 기존 weight의 학습이 GPU 8개로 이루어졌고 사용자의 GPU개수가 1개하면, lr을 8로 나누어 학습시키는 것입니다.

2-2. 기록

MMdetection 에서 Wandb 연동이 가능했기 때문에 (document) 편하게 학습 진행 상황을 눈으로 볼 수 있었습니다.  

학습 중의 loss를 실시간으로 시각화해줍니다.

Wandb의 좋은 점 중 하나는 log를 자동으로 저장하기 때문에 의도치 않게 학습이 중지되어도 학습된 pth 파일을 불러올 수 있다는 점이었습니다. 물론 config 내에서 save interval을 따로 지정해줄 수 있지만 모종의 실수로 경로가 잘못 지정되었다던가 하는 상황에서 코드가 모델 학습 결과를 저장하지 못해도 wandb에 저장되어있는 파일을 사용할 수 있습니다. 
 loss 뿐만 아니라 validation에서의 Average precision과 Average Recall 혹은 F1 score 등의 evaluation metric, GPU usage 등의 시스템 로그도 확인할 수 있고, team project를 따로 만들어 데이터를 이관시켜 팀원들이 각자 진행한 실험들의 데이터를 모아서 따로 볼 수도 있어 여러모로 편한 기록 툴이었습니다. 

3. 최종 결과&피드백

최종 점수 58.7점, 전체 16등으로 마감했습니다! 사실 제가 얻은 점수는 아니고 Mask RCNN 모델로 계속 실험을 진행했던 조원이 이룬 점수입니다. 공부를 목적으로 참여했던 대회였기 때문에 등수에 대해서는 기대 안했는데, 같이 으쌰으쌰하다보니 뿌듯한 결과를 얻을 수 있었습니다 (◕‿◕✿)

3-1. 두 번째 멘토링 피드백

1차 때와 방향이 꽤나 달랐습니다. 모델을 다양하게 시도해보는 것도 적극적으로 추천해주셨고, input image 의 resolution 높이기, backbone size 변경하기, b-box negative term loss 적용하기, 중간 단계 feature를 concat해주는 feature pyramid 사용하기 등등 시도해 볼 수 있는 다양한 방법들을 제안해주셨습니다. 몰라서 못했던 시도 중에는 이미지가 '연속적'이라는 특성을 고려했을 때 one shot segmentation, video segmentation 이라는 것도 있었습니다. 마감 3일 전에 피드백을 받아서 남은 3일간 불태워야지! 라고 생각했지만, 당일 코로나 확진을 받아서 체력이슈로 더 자세히 살펴보지 못했던게 조금 아쉽습니다.

3-2. 아쉬웠던 점

 대회 마감 기간에 가까워질수록 '더 잘 할 수 있지 않았을까?'하는 아쉬움이 커져 앞으로 더 잘하자!라는 의도로 조원들끼리 아쉬웠던 점을 정리해봤습니다.

  1. 처음에 프로젝트를 시작할 때 무턱대고 epoch를 늘려서 학습시킨 후에 public score를 확인한 것이 지금 돌이켜보니 비효율적이었습니다. hyperparameter tuning 시 적은 epoch 로 먼저 여러가지 시도를 해보고 그 중에 성능이 좋으면 해당 모델만 epoch를 늘렸다면 한정된 자원으로 더 효율적으로 학습을 진행할 수 있지 않았을까요? 이처럼 프로젝트를 할 때 아무런 계획 없이 이것저것 건드리며 시작하는 것보다는, 어느정도 큰그림을 잡아놓을 필요가 있다는 생각이 들었습니다. 
  2. 학습 데이터의 수 자체가 적었고, 사용할 수 있는 외부 데이터 소스가 찾기 어려워 모델의 성능을 높이는 데 애를 먹었습니다.
  3. MMdetection의 기본 evaluation metric이 대회 메트릭과 달라서, 아무 생각 없이 모델 학습을 시키다가 프로젝트 후반부에 metric을 수정하여 사용했습니다. 이건 꼼꼼함의 부족이었던 것 같습니다. 베이스라인과 대회 내용을 하나하나 뜯어봤다면 조금 더 일찍 발견할 수 있었던 포인트였을 것 같습니다.
  4. 마지막으로 딥러닝 공부에 대한 근본적인 고민을 했습니다. 최고점이 나오거나 점수가 올라도 왜 성능이 좋아졌는지 등 인과추론을 하기 어려워서 답답했기 때문입니다.

아쉬운 점도 꽤 있었지만 배운 게 더 많은 프로젝트&대회 참가였습니다! 다음 번 다른 프로젝트를 진행하게 되면 다시 돌아오겠습니다~ 

 

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.