본문 바로가기

대외활동

2023 SW중심대학 공동 AI경진대회 리뷰

2023년 7월 3일부터 28일까지 데이콘 플랫폼에서 진행한 SW중심대학 공동 AI경진대회를 참가하게 되었다.

원래 여행가기 전에 어떻게든 쓰고 갔어야 하는데 체력 문제로.. 또 유럽으로 떠난다고 하니 너무 설레서 그만 다 던져버리고 말았다.

 

아무튼 이번 경진대회의 총평을 하자면, 특별히 이뤄낸 성과는 없었지만 이전에 해보지 못한 경험들을 하면서 동기부여도 되었고 내가 아직 많이 부족하다는 사실도 새삼스래 깨달았다.

 

또 아직은 이론이 너무 부족하다는 느낌이 든다. 데이터 분석도 방향성 없이 중구난방으로 했더니 유의미한 결과를 얻지 못했다. 아직 ~~인데 이정도면 잘하네! 하면서 언제까지고 위안 삼을 순 없다. 더 분발해야 한다. 다음 대회는 더 높은 목표를 가지고 제대로 시작해보자.

 

경진대회 개요


경진대회 주제는 위성 이미지 건물 영역 분할(Satellite Image Building Area Segmentation)이었다.

주어지는 학습 데이터 셋으로 세그멘테이션 모델을 학습하고, 테스트 데이터 셋을 추론하여 결과 점수를 산출한다.

 

학습 데이터 셋은 총 7,140장으로, 각 이미지 해상도는 모두 1024x1024로 동일했다.

학습 이미지 예시

테스트 데이터 셋은 총 60,640장으로, 각 이미지 해상도는 모두 224x224로 동일했다.

테스트 이미지 예시

한 가지 중요한 가정도 명시되어 있었는데, 학습 데이터 셋의 모든 이미지는 건물을 포함한다는 사실이다.

반대로 테스트 데이터 셋에는 건물이 없는 이미지도 포함되어 있었다. 

 

이미지 개수가 많아서 다운받는 데에도 오래 걸렸던 것 같다. 다음에는 대용량 데이터를 안정적으로 저장하고 공유할 수 있는 환경을 미리 구축해놓은 상태에서 대회를 시작하면 더 좋을 것 같다.

 

그리고 다른 대회는 어떤지 모르겠지만 이 대회에서는 법적 제약이 없으며 논문으로 공개된 베이스의 사전 학습 모델(Pre-trained Model)은 사용 가능하도록 명시되어있다. 하지만 외부 데이터 셋을 사용해서 학습 데이터 셋을 늘리거나, 테스트 데이터 셋이 포함된 데이터 셋으로 학습된 사전 학습 모델 사용은 엄격하게 제한되니 참고하도록 하자.

 

평가 절차는 크게 1차와 2차로 나누어져 있는데, 1차에서는 테스트 데이터 셋 추론 결과를 수치화해서 리더보드를 통해 경쟁하는 방식이었고, 2차에서는 전문가의 심층적인 분석을 통한 검증과 온라인 발표 평가가 예정되어 있었다.

이번 대회에서는 추론 결과를 dice score지표를 통해 수치화 하였다.

 

[23.06.19(월) ~ 23.07.02(일)] 대회 준비 기간


1학기 기말고사가 끝나자마자 대회 준비를 시작했다. 솔직히 이때까지는 대회 참가를 포기할까도 생각했었다. 팀원이 5명인데 그 중에 인공지능 모델을 돌려본 사람이 나 뿐이라서 여기에 시간을 쏟는게 과연 모두에게 의미가 있을까? 하는 회의감이 많이 들었다. (이후에 이것이 잘못된 생각이었다는 것을 깨달았다) 그래도 어찌어찌 우여곡절 끝에 참가를 결정했고, 결정했으면 빠르게 방향성을 잡고 나아가야겠다고 생각했다.

 

사실 많이 막막하긴 했었다. 경진대회 참가 자체가 처음이었기 때문에, 이미 있는 모델을 사용해도 되는 건지, 아니면 팀원들과 새로운 모델 구조를 만들어야 하는 건지, 막연한 두려움이 찾아왔다. 사실은 이 시점에서 빠르게 검색해보고 최대한 덜 막막하기 위해 노력했어야 하는데 시험이 끝난 직후의 해방감이 너무 컸던 것 같다.

 

만약 처음 나가보는 대회라면 준비 전에 다른 사람의 후기를 최대한 많이 찾아보자. 그 사람들이 겪었던 시행착오가 정말 도움이 많이 된다. (얻을 수 있는 정보는 최대한 많이 챙겨가자)

 

이때를 기점으로 교수님과 통화가 잦아졌다. (지금은 정든 것 같기도.. 그래도 RA는 안한다) 교수님이 인공지능 개발 프로세스에 대해서 설명해 주셨는데 인턴 하면서 알게 된 내용이랑 똑같았다.

 

  • 데이터 취득
  • 데이터 가공
  • 모델 생성
  • 모델 학습
  • 모델 평가

경진대회에서는 이미 가공된 데이터를 제공하므로 데이터 취득 및 가공 부분은 생략하고, 모델 단에서의 고민을 하는 상황이었다. 세그멘테이션 작업에 많이 사용되는 모델이 몇 개 있었는데, 그 중에서도 우리는 U-Net Segmentation 모델을 사용하기로 했다. U-Net은 FCN(Fully Convolutional Network)의 일종으로, 전체 아키텍쳐가 모두 컨볼루션으로만 이루어진 모델이다. 

U-Net 구조

왼쪽 날개 부분을 인코더(수축 경로)라고 하고, 오른쪽 날개 부분을 디코더(확장 경로)라고 한다. 컨볼루션을 통해 해상도를 줄였다 늘리면서 이미지의 더 다양한 특징을 추출하기 위함이라고 한다. 여기서 인코더를 다른 컨볼루션 모델로 교체할 수 있는데, 목적에 맞는 특징을 잘 추출하는 적합한 모델을 선택하면 된다.

 

이렇게 어떤 모델을 사용할지 결정했으니, 그 다음은 해당 모델이 잘 돌아가도록 만들어 놓은 git 문서를 찾아야 한다. 내 성격상 처음부터 만드는 게 더 견고할 것 같았지만 아직 직접 만들 수준은 안 되므로.. 

 

이것저것 시행착오를 겪으며 찾다 보니 인코더를 EfficientNet으로 바꾸고 학습/추론 코드까지 구현돼있는 git 문서를 찾았다! 대회가 시작되기 전에 검증 가능한 모델을 여러개 찾아 놓아야 대회가 시작되고 데이터가 공개되었을 때 빠른 판단이 가능하기 때문에 꽤 중요한 문제였다.

 

하지만 이 상황에 우리는 인공지능 학습 과정이 뭔지, 어떻게 돌리는지, 하나부터 열 까지 몰랐기 때문에 사실상 공부하느라 바쁜 상황이라 잘 돌아가는 모델 하나 찾은 것도 감지덕지할 일이었다. 학교에서 밤 새워가며 환경 구성을 마치고 샘플 데이터 학습 및 추론에 성공했을 때, "아, 그래도 점수는 낼 수 있겠구나" 싶었다.

 

환경 구성은 인턴 때도 경험했지만 패키지 한번 잘못 꼬이면 지옥을 맛볼 수 있는 까다로운 과정이다. CUDA, CuDnn, PyTorch 등등이 대부분의 상황에서 서로 같이 사용되기 때문에 호환되는 버전을 맞추려면 잘 생각하고 다운받아야 한다. 생각없이 다운받았다가 우분투 자체를 밀어버리고 처음부터 다시 시작해야 하는 상황이 빈번하게 일어난다. (나는 10번 넘게 밀었던 것 같다)

 

따라서 환경 구성할 때 꼭 가상환경을 사용하고, 구성하는 과정을 문서화 하는 작업이 귀찮더라도 꼭 필요하다. 그렇지 않으면 나중에 다 까먹고 똑같은 일을 또 하고있는 자신을 발견하게 될 것이다. 다음 링크는 내가 정리한 환경 구성 관련 노션 문서이니 참고하시길.

https://spiffy-macadamia-1a1.notion.site/Ubuntu-25a4fab599554b09937a99182d9b2f68?pvs=4                                         

 

마지막으로 대회가 시작되기 전에 팀원의 역할을 나누어야 한다. 팀원이 5명인데 동네 축구처럼 공 하나만 보이면 우르르 몰려가는 식으로 일해서는 안된다. 우리는 팀원의 역할을 다음과 같이 나누었다.

 

  • 데이터 분석
  • 모델 학습
  • 모델 평가

사실 정한대로 팀의 영역을 지키면서 일하지는 못했지만, 이렇게 해야 한다는 사실을 알고 실제로 나눠봤다는 사실만으로도 도움이 된다고 생각한다. 다음에 더 잘하면 된다.

 

대략적인 흐름은 이렇다. 데이터 분석 팀에서는 대회 시작 후 제공받은 데이터를 분석하여 유의미한 정보를 찾아내고, 모델 학습 팀에서 이를 통해 학습 전략을 설정한다. 모델 학습이 끝나면 학습 과정에서의 loss값 추이와 테스트 데이터 셋을 추론하여 얻어낸 결과를 정성적으로 분석하여 학습 전략 수정에 기여한다.

 

[23.07.03(월) ~ 23.07.09(일)] 대회 1주차


[23.07.03(월) ~ 23.07.07(금)] 경진대회 모델 제출 시스템 구축 및 Efficientunet++ 모델 성능 개선 (완료)

  • 경진대회 모델 제출 시스템 구축 (완료)
    • 데이터 취득 시스템 구축 (완료)
      • 데이콘 데이터 셋 다운로드
      • 정답 이미지 생성
    • 데이터 셋 분할(수작업) 시스템 구축 (완료)
    • 모델 코드 테스트 (완료)
      • Efficientunet++ 모델 학습 코드 테스트
      • Efficientunet++ 모델 추론 코드 테스트
    • 모델 평가 시스템 구축 (완료)
      • Tensorboard 차트 분석
      • 추론 결과 이미지 분석
    • 모델 제출(수작업) 시스템 구축 (완료)
      • 테스트 데이터 셋 60,640 이미지 추론 결과 생성
      • submission.csv 파일 제출
  • Efficientunet++ 모델 성능 개선 (완료)
    • epoch 수에 따른 비교 (완료)
    • 이미지 resize 여부에 따른 비교 (완료)
    • 이미지 사이즈에 따른 비교 (중단)
    • 전처리 수식에 따른 비교 (완료)

 

대회가 시작되고 나서는 결과를 제출하는 시스템이 잘 돌아가도록 구축하는 작업과 모델 성능 개선에 집중했다. 모델 제출 시스템에서 데이터 취득 시스템은 데이콘에서 제공되는 데이터를 사용했기 때문에 생각할 필요가 없었다. 다만 7,140장의 학습 데이터 셋을 전부 학습에 사용하는 것은 아니기 때문에 내부적으로 학습/검증/테스트 데이터 셋으로 분할하는 과정이 필요했다. 원래 이 과정도 코드를 미리 짜 놓으면 비율을 달리 설정하면서 비교할 수 있었을 텐데 시간 관계상 생략하고 수작업으로 진행했다. 또한 평가 코드가 없었기 때문에 내부적인 테스트 데이터 셋을 따로 만들지는 않았다.

 

학습 데이터 셋은 내부적으로 학습/검증 데이터 셋으로 세분화했고 비율은 8:2로 설정했다. 개수로 따지면 학습 데이터 셋은 약 5,600장, 검증 데이터 셋은 약 1,400장으로 구성되었다. 다음으로 모델 코드가 잘 돌아가는지 확인하기 위해서 분할된 데이터 셋으로 학습 코드를 실행해 보았다. 그런데 왠걸, 배치 사이즈가 최대 2밖에 들어가질 않았다..! 그 이상 설정할 경우 Cuda out of memory 오류가 뜨면서 GPU 메모리가 터져버린다.. GPU는 RTX 3080으로 꽤 좋은 걸 사용했다고 생각했는데 큰 이슈였다.

 

아이러니 한 것은 이미지의 해상도가 1024x1024로 높은 것을 원인으로 생각하고 4등분하여 512x512이미지 4장으로 크롭한 후 학습해도 여전히 최대 배치 사이즈는 2보다 높게 설정되지 않았다는 것이다. 단순하게 계산하면 1024짜리 이미지가 최대 2장이 들어가는데 당연히 512짜리 이미지는 최대 8장이 들어가야 정상 아닌가? 안에서 어떤 일이 일어나는 지 모르니 참으로 답답하지 않을 수 없다... 해상도와 관련이 없다면 28x28 MNIST 손글씨 이미지 학습은 GPU가 특출나게 좋지 않아도 배치 사이즈를 두 자리 이상 설정할 수 있다는 것이 설명되지 않는다. 이 문제는 아직까지 답답함으로 남아있어 기록해 두었다가 나중에 정답을 꼭 찾아야겠다고 마음먹었다.