네이버 AI 부스트캠프 4기 : P-stage Semantic segmentation 대회 후기

nask·2023년 1월 7일

부스트 캠프의 마지막 대회인 재활용 쓰레기 semantic segmentation 대회, 그 3주 간의 일정이 모두 끝이 났다. 대회 기간동안 내가 시도해 보았던 것들과 그 도전의 결과로 느낀 점들에 대해 이야기해보고자 한다.

Streamlit data distribution page

What I did

우리 팀은 Streamlit repository를 따로 만들어 대회에 필요한 기능을 구현해뒀다. 그 중에서 나는 대회에서 사용되는 이미지 데이터들의 여러가지 분포를 분석하고 시각화하는 페이지를 만들었다. 구현 기능은 1) 쓰레기 카테고리 개수 분포 2) 이미지 데이터의 rgb 분포 3) 쓰레기 Anootation 영역의 크기 비율 분포 4) 이미지 당 쓰레기 객체의 개수 분포이다. 확인하고 싶은 데이터 분포를 옵션에서 선택할 수 있게 하였으며, plotly 라이브러리를 활용했다. 특히 속도 향상을 위해 그래프를 한번만 계산하여 png 파일로 저장한 후, 다음부터는 파일만 로드하도록 했다.

Lessons learned

지난 번에 한번 streamlit data distribution tab을 만들어 둔 경험도 있고, 팀원 분들의 코드를 참고했기 때문에 크게 어려운 점은 없었다. 하지만 아무래도 plotly 라이브러리를 처음 사용하다보니 구글링 시간이 조금 소요되었다. 아쉬운 점이 있다면, 시간 내에 만드는 데 급급하다 보니 그래프의 레이블이나 함수 이름 등에 신경을 쓰지 못했다는 점이다. 물론 팀원들의 피드백 이후 이를 수정하기는 했지만, 다음부터는 처음부터 생각을 정리한 후 개발에 임해야겠다.


Model & Architecture : SeMask-Mask2Former-SwinL

What I did

팀원이 이전 기수 깃헙 레포에서 가져온 Mask2Former 환경 세팅을 이용했다. 이후 SeMask 학습을 위해 추가적인 세팅을 진행한 뒤 Swin Large 모델로 첫 학습을 했다. 학습이 끝난 후 인퍼런스 결과를 제출하여 75.74라는 점수로 당시 leader board 1위를 했다. 하지만 SeMask의 S 자도 모르는 상황이라 왜 성능이 좋은지 알지 못했고, 그 주의 논문 스터디에서 SeMask 논문을 읽고 발표했다. 논문을 통해 SeMask는 이미지의 semantic information을 잘 추출하기 위해, backbone 모델의 각각의 transformer layer에 semantic layer을 추가했다는 것을 알 수 있었다. 이후에도 pretrained weights 파일을 변경한다거나, num_obj_queries를 변경한다거나, 아니면 데이터 구성을 변경해보는 시도를 했다. 결과적으로 내가 시도한 모델이 leader board 78.3점으로 팀에서 단일 모델 기준 최고 점수를 기록했다.

Lessons learned

처음에는 SeMask github에서 권장하는 세팅으로 학습을 시도해봤지만, 에러가 발생하여 앞서 말한 Mask2Former 환경 세팅을 이용했다. 이전 기수 분들과 팀원들 덕분에 환경 세팅에 큰 어려움이 없었다. 역시 이미 만들어 둔 파일이나 세팅을 이용하는 것이 현명하다는 것을 몸소 체감했다. 대회 마지막 주차에 그동안 사용한 pretrained weight 파일이, 전체가 아니라 backbone model인 SwinL에 대한 pretrained weight임을 알게 되었다. 물론 이미 78.3이라는 점수를 달성한 상황이었지만, 뒤늦게라도 ADE20K 데이터셋에 대해 SeMask-Mask2Former로 pretrained된 파일을 체크포인트로 사용했다. 하지만 제출 가능 횟수가 얼마 안 남은 상황에서, 심지어 validation set도 없이 학습을 진행한 터라 결과를 제대로 비교해볼 수 없어서 아쉬웠다.


Pseudo labeling

What I did

test dataset에 대해 inference한 결과를 pseudo label로 사용하고자 했다. 원래는 inference 시 256x256으로 이미지 사이즈를 줄여 inference하는데, pseudo labeling을 위해서는 원본 사이즈로 새롭게 inference해야 했다. 이를 위해 팀원들 각자 가장 성능이 우수한 pth 파일을 선정해 inference 했고, 그 결과를 hard voting으로 앙상블한 파일을 최종적으로 Pseudo labeling에 사용했다. 이때 test data를 images/masks 구조로 만들어야하는데, 기존의 팀원들의 코드를 참고했다. 하지만 두 폴더의 파일 네이밍 방식이 달라 문제가 발생했고, 다른 팀원의 도움을 받아 이를 해결했다.

Lessons learned

처음으로 학습 기법을 적용해보았다. pseido labeling에 대해 자세히 알지 못했기에 팀원에게 내가 생각하는 적용 방식이 맞는지 물어보았고, OK라는 답을 받아 구현에 성공했다. 코드가 길거나 로직이 어렵지는 않았고, 적용 후 모든 모델의 성능이 유의미하게 올라 뿌듯하였다. 하지만 대회 마지막 날 제출 서버가 불안정하여 제대로 된 앙상블 성능을 파악할 수 없어서 아쉬웠다.


Conclusion

이전 대회들에 비해 주체적으로 대회에 참여했던 것 같다. streamlit code는 이전보다 깔끔하게 작성했으며, 새롭게 시도한 기법이나 모델은 성능이 우수해 팀에 도움이 된 것 같아 좋았다. 최종 결과도 private leader board 1위로 좋았지만, 마지막 날 제출 서버의 상태가 좋지 않아 찝찝한 면도 남아 있는 것 같다.

한편 학습 중 서버 저장 공간이 부족해 최고 점수를 달성한 모델의 pth 파일을 삭제하였는데, 이로 인해 pseudo labeling에 그 좋은 성능을 활용할 수 없었던 점은 많이 아쉽다. 또한, 2등팀 역시 SeMask 구조를 사용했는데, 발표를 들어보니 나에 비해 좀 더 근거를 가지고 해당 모델을 시도했다는 점이 인상 깊었다. 그 외에도 디테일한 데이터 분석 및 대회 전략 설정, 그리고 피피티 제작과 발표 진행 등 모델링이나 엔지니어링 외적으로도 배워야할 점이 많다고 생각했다.

0개의 댓글