본문 바로가기
AI/Competition

[Dacon] 합성 데이터 기반 객체 탐지 AI 경진대회 후기

by Myungbin 2023. 10. 27.

개인의 의견을 바탕으로 작성되었습니다. 팀의 생각과 다를 수 있고 최종 결과물과 차이가 있을 수 있습니다.

이번엔 1등 했다. 대회에서 3, 2, 1등 순서로 수상을 하니 뭔가 계속 성장하는 느낌이라 기분이 좋다.

Object detection 분야를 처음 접해서 처음에 너무 어려웠지만, 팀원의 도움 덕분에 수상까지 이어질 수 있었던 것 같다. 이보다 더 완벽한 팀원을 만날 수 있을까 싶을 정도로 좋은 팀에서 대회 참여를 했던 것 같다.


대회

[주제]

합성 데이터를 활용한 자동차 탐지 AI 모델 개발

[설명]

학습용 합성 데이터를 활용하여 자동차 탐지를 수행하는 AI 모델을 개발해야 합니다.

평가는 실제 데이터를 바탕으로 진행되며, 자동차 탐지뿐만 아니라 34가지의 자동차 세부 모델까지 판별해야 합니다.

이번 대회는 합성 데이터를 이용해 Object Detection 모델을 개발해야 했다. 합성 데이터가 생소하기도 하고, Detection 분야를 해본 적이 없기 때문에 얼마나 잘하겠어?라는 생각으로 시작했다.

예상대로 처음 해보는 분야라 너무 어려웠다. 일단 Object Detection에서의 용어 자체가 머리에 담기지 않았다. 데이터에 대한 이해가 있기 전부터 Detection 분야의 이해가 없었기 때문에 처음에는 되게 어려웠던 것 같다. Detection 분야는 나한테 안 맞는다는 생각을 처음 시작부터 한거 같다.

처음엔 베이스라인같이 파이토치로 코드 구현을 했었다. 원래 쌩 구현(데이터 셋 구성, 전처리, 학습, 테스트)을 좋아해서 라이브러리를 안 썼는데, 이상하게 파이토치로 구현하면 결과가 안 좋았다. 같은 팀원분께서 mmdetection 이란 것을 알려주셔서 처음으로 라이브러리를 써서 모델링을 해본 것 같다.

처음 접해보는 분야라 모르는 게 되게 많아서 되게 궁금한 게 많았다. 너무나도 감사한 게 처음 회의할 때 디스코드로 팀원분이 2시간 넘게 Object Detection의 전체적인 기본 개념과 mmdetection 쓰는 방법을 잘 알려주셔가지고 되게 시작을 편하게 했던 것 같다.

처음 mmdetection을 썼을 때는 너무 어려웠다. config 파일로 모델을 학습시키는 게 익숙하지 않고, 디버그가 안돼가지고 불편하긴 했지만 그래도 일단 팀 내에서는 같은 라이브러리를 쓰는 게 협업 면에서도 좋기 때문에 그냥 mmdetection을 써서 하기로 했다.

Data

처음 데이터를 보고 했던 생각은 합성 데이터와 실제 데이터 간의 차이를 어떻게 해야 줄일 수 있을까?에 대한 고민이었다. 데이터의 특성이 다르다 보니 같은 특성으로 맞춰주려고 노력했던 것 같다.

color jitter, contrast 등을 통해 실제 데이터와 유사한 환경을 구축하려고 했고, 진짜 다양한 증강 기법을 사용했던 것 같은데, 핵심은 Mixup, Cutout 이였다고 생각한다.

처음 Mixup을 했을 때 갑자기 80,000개의 바운딩박스가 생겼었다. 근데 이상하게 Public 점수는 0.87쯤으로 잘 나왔던 걸로 기억을 해서 어이가 없었는데 아마 Mixup을 했을 때 객체가 겹치면서 그랬을 것 같다. 여기서 문제가 너무 많이 그려진다는 점과 이상한 거에 계속 바운딩 박스가 그려져서 엉뚱한 걸 차량으로 예측한다는 문제점이 있었다. 그래서 팀원들이랑 Mixup 코드 까보면서 조정하는 방안을 생각했던 기억이 난다. 그래도 클래스는 34가지나 되는데, 클래스별 데이터의 개수는 500개밖에 없어서 학습 데이터의 다양성을 위해 Mixup은 계속 유지했어야 했다고 생각한다.

Cutout 적용이 제일 좋았다고 생각하는데, Cutout을 통해 모델이 데이터 학습하는 방향성을 유도할 수 있었다고 생각한다.

우리 팀이 데이터에서 중요하다고 생각하는 것을 의도적으로 Cutout을 통해 학습시킬 수 있다고 생각하고, 결과도 생각에 맞게 좋게 나왔다고 생각한다. Cam으로도 확인했을 때 Cam이 우리가 생각한 대로 히트맵이 그려져서 진짜 팀원분의 아이디어가 대단하다는 생각을 했다.

마지막 평가에서도 Cutout을 언급한 거 보면 데이터 증강 전략이 합리적 선택이었던 것 같다.

Model

Private 2등을 하면서 아직까지 시도한 모델이 왜 좋은지에 대한 설명은 자세히 못하겠지만 논문이 자주 말하는 "경험적으로"라는 말을 할 수밖에 없는 것 같다. 아직 AI에 대한 깊은 이해가 없어서 그런 건지는 몰라도 왜 이 모델이 이 Task에서 좋아?라고 말하면 그냥 "경험적으로 좋았어"라고 말할 거 같긴 하다.

처음엔 Faster R-CNN을 쓰다가 Cascade R-CNN을 썼을 때 바운딩 박스의 수는 줄어드는데, mAP는 비슷하게 유지가 돼서 방향을 Cascade RCNN으로 잡았다. Cascade에 들어가는 Backbone 같은 경우도 다양하게 실험해 봤는데 Cascade R-CNN에 Resnest depth200 Backbone을 썼을 때가 가장 성능이 좋았다.

그리고 중간부터 다른 비슷한 대회 수상한 사람 코드를 보고 Weighted Boxes Fusion으로 앙상블을 시도했었는데 바운딩 박스가 반쪽짜리만 그려져서 "아니 이거 왜 이래" 하고 안 쓰고 있었다. 그러다가 팀원분이 뭔가 이상하다고 올려주신 사진을 보는데, w, h로 나눠야 할게 w로만 나눠져 있었다. 내가 긁어왔던 코드는 정사각형 이미지였어서 w로만 나눠져있었다. 이때 아 진짜 코드 그냥 긁어오더라도 좀 제대로 보고 긁어와야겠다는 생각을 했다. 그때 사진 안 보내주셨으면 Weighted Boxes Fusion은 썼을라나 모르겠다. 이 앙상블도 효과적인 방법이긴 했는데 Production 레벨에선 잘 모르겠다 ㅋㅋ.. 쓸려나?

중간에 클래스를 잘 못 맞추는 느낌이 들어서 바운딩 박스를 그리고, 그 부분을 잘라 classification 모델로 자른 이미지를 학습시켜 분류 모델로 만들어보자!라는 생각을 했는데, 구현상의 이유로(ㅋㅋ...) 이건 시도 안 했던 것 같다.

후기

이번 대회는 팀원에게 정말 많이 배웠다. 다들 엄청 열정적이시고 아는 것도 많으셔서 Detection뿐만 아니라 다양하게 배웠던 것 같다. 이번 대회가 아니었다면 평생 Detection 분야는 몰랐을 것 같다. 팀원분이 나한테 기본기를 깔아주신 것 같아 좋았다.

할때마다 느끼는거지만, 대회마다 팀원의 여러 생각을 듣고 고민하는게 너무 재밌는 것 같다. 팀원들의 데이터에 대한 해석과 직관을 들으면 계속 배울 수 있어서 좋은 것 같다.

마지막 정성평가를 위해 PPT를 만들면서 팀원이랑 우스갯소리로 우리 팀 1등할 수밖에 없다고 발표날에 1등 못하면 조용히 카톡방 나간다고 했던 게 기억이 난다. 그만큼 뭔가 1등 할 거라는 확신이 들었다.

밖으로 나가면 정말 AI를 잘하는 사람이 많다. 나는 한참 부족하다는 걸 느끼고 더 열심히 해야겠다는 생각을 하게 된다. 팀원들이 나를 더 성장시키는 성장판인 것 같다. 그래서 항상 팀원에게 감사함을 느낀다.

감사합니다!

끝.

+ Github

https://github.com/Myungbin/Synthetic-Data-Object-Detection