네이버에서 열렸던 ai 해커톤! 길고 짧았던 2달동안의 해커톤이 끝이났다.
2달동안 image retrieval 관련 논문 읽어보면서 tripletNet, triplet loss, embedding 등 여러 가지 용어에 대해서 배울 수 있었다. 사실 예선 1차 처음에는 image classification 문제인줄알고 나는 resnet50을 backbone으로해서 softmax classification을 했는데, 잘 안됬다. 내 생각으로는 query image와 똑같은 클래스라고 예측된 gallery image를 찾아주면 되는거 아닌가 싶었는데, 나중에 생각해보니 잘 안된이유가 query image에 대한 class를 정확히 예측하지 않으면 완전 꽝이게된다! 그러니 클러스터링이 아예 안된다고 볼 수 있을듯하다. 그래서 나는 image retrieval의 기본적인 모델인 tripletNet을 이용했다. 구체적으로 anchor 이미지에 대해서 positive는 최대한 가깝게 embedding되도록 하고 negative는 최대한 멀리 embedding되도록 triplet loss로 학습을 시켰었다. 그렇게 예선 1차는 통과할 수 있었다.
문제는, 예선 2차를 거치면서 모델도 학습을 하지만 경쟁팀들도 clever해지고 있었다. 리더보드에 올라오는 경쟁팀들의 점수가 점점 무서울정도로 높아졌다. 승부욕이 발동해서 나는 여러 논문들을 뒤져보다가 ABE, Delf, BFE와 같은 image retrieval model을 공부해서 BFE가 sota인걸 보고 구현에 들어갔다. Re ranking, query expansion과 같은 post processing없이 굉장히 높은 점수를 얻을 수 있었고, 2등에 들어왔다. 이때부터, 나는 새로운 모델을 뒤져보기보단 네이버 데이터셋에 대한 최적의 hyper parameter를 찾는데 주력했다. hyperparameter를 이리저리 바꿔보면서 분석하고, 정리했다.
문제는, 예선 2차를 거치면서 모델도 학습을 하지만 경쟁팀들도 clever해지고 있었다. 리더보드에 올라오는 경쟁팀들의 점수가 점점 무서울정도로 높아졌다. 승부욕이 발동해서 나는 여러 논문들을 뒤져보다가 ABE, Delf, BFE와 같은 image retrieval model을 공부해서 BFE가 sota인걸 보고 구현에 들어갔다. Re ranking, query expansion과 같은 post processing없이 굉장히 높은 점수를 얻을 수 있었고, 2등에 들어왔다. 이때부터, 나는 새로운 모델을 뒤져보기보단 네이버 데이터셋에 대한 최적의 hyper parameter를 찾는데 주력했다. hyperparameter를 이리저리 바꿔보면서 분석하고, 정리했다.
결선(온라인)에서는 query data가 50%(9000개) 만 사용되서, query와 gallery dataset에 대해서 feature embedding 뽑는데 10분+ Euclidean distance 계산 및 reranking 하는데 30분 해서 1시간(제출 제한시간)중 평균적으로 44분 정도 걸렸었다. 최종 결선(오프라인)에서는 query data를 100%를 쓰기 때문에 re ranking연산하다가 제출을 못할수 있다는 생각을 못했다. 사실 최종결선 날 아침에 샤워하면서 computation cost가 너무 클수도있다는 생각이 들었었다. 그렇게 최종결선에 가서도 나는 reranking 알고리즘을 50분안에 끝낼수있도록 하는데 주력했고 결국에는 성공하지 못했다. 오늘 아침, query 7000개에 대해서 각 query에 대해서 euclidean distance를 오름차순으로 정렬한 gallery image 1000개만 re ranking하도록해서 제출했는데, 제한시간을 넘겨서 제출하지 못했다. 2등->6등->12등으로 마무리 됬다.
오늘 1:30, 해커톤이 종료되고 1,2,3등의 개발 모델을 발표하는 것을 들을 수 있었다. 모두 공통점은 그들도 다 처음으로 image retrieval을 공부하였던 것이었으며 단지 시행착오를 정말많이 했다는 점이었다. 3등팀은 나처럼 triplet net부터 시작해서 최신 논문을 구현하면서 성능을 많이 올릴 수 있었다고 한다. 영리하다고 느꼈던 부분은 validation time때 test data에 대해서 mAP를 측정하는 것과 비슷한 효과를 내기 위해서 training data에서 random 하게 validation data를 가져오는게 아니라 하나의 덩어리를 가져오도록 했다고 한다. 그 이유는 대부분 dataset의 특성상 비슷한 데이터 끼리는 서로 뭉쳐있어서 실제 submit할때와 비슷한 상황에서 mAP를 측정할 수 있어서 mAP validation을 편하게 할 수 있었다고 한다.
2등팀은 모델자체가 신박했다. Auto encoder decoder구조를 사용해서 feature dimension을 축소하여 k manifold공간에서 비슷한 embedding들끼리 클러스터링이 더 잘될 수 있도록 했다. 정말 기발한 생각이었다.
1등팀은 생각보다 단순한 모델을 사용했다. 그러나 그들은 처음에 본질적으로 접근법이 좋았다. 그들은 backbone network를 중요하게 생각했다. 해커톤이 시작되자마자 imagenet에 pretrained된 여러가지 backbone network를 제출해봐서 제일 높은 mAP를 얻은 network -> DenseNet160을 사용했다고 한다. 그들이 pretrained된 backbone network를 신중하게 선택한 부분이 일단 클러스터링에 있어서 더 좋은 feature를 뽑는데 일조했다고 생각한다.
또한 그들은 network의 마지막단에 self channel attention을 사용해서 noise robust한 모델을 만들 수 있도록 하였다. 일반 상품 retrieval문제이기 때문에 noise가 많이 껴있는 경우가 있을 수 있는데 이를 잘 해결할 수 있는 메카니즘이라고 생각했다. 그 외에도 앙상블 2개, post processing등을 고려해서 최종적으로 mAP 0.986을 달성했다. 어마어마하다..
해커톤 개인적인 후기는 솔직히 매우 아쉽고 조금더 여러가지 모델을 조사해서 구현해볼걸 하는 아쉬움이 든다. Re ranking에 해커톤 1박2일을 다써버리고 그것마저 안되서 매우 짜증나고 아쉽다. 그렇지만 밤새서 내가 뭔가 모델을 이리저리 개발하는게 너무 재밌고 생산적이었다. 이번 해커톤은 아쉬웠지만 이를 기반으로해서 언젠가는 좋은 논문으로 돌아오리라!
아! 그리고 다음에 해커톤에 오면, 기숙사에서 코딩하는걸 추천한다. 정말 아늑하고 편안해서 집중이 잘된다. 밥도 정말 맛있다.
댓글
댓글 쓰기