2021. 10. 22. 18:25ㆍ코딩연습장/Dacon
이번에는 Dacon에서 개최한 교통 수신호 동작 인식 AI 경진대회에 참여를 하였다.
Action Recognition Task를 한번도 경험해보지 못했기 때문에 어떤 식으로 문제를 풀어나갈지 두렵기도 하면서 동시에 흥미로웠다. ㅎㅎ...
참조: https://www.semanticscholar.org/paper/Chapter-9-Action-Recognition-in-Realistic-Sports-Soomro-Zamir/a000149e83b09d17e18ed9184155be140ae1266e
먼저 같은 경진대회에 참여하는 분들과 팀도 맺었고, 회의를 통해서 어떻게 문제를 풀 것인가 토의를 하였다. 분류 문제나 object 인식 문제와는 다르게 연속적인 이미지에 대한 예측이기 때문에 어떠한 시계열적인 모델이 필요하다고 생각하였다.
일단 base 코드를 만들어야했고, 분류모델도 어느정도까지 돌아가는지 궁금하였기 때문에 keras를 사용하여 generator와 trainer등을 코딩하였고, keras내장 pretrained 모델을 돌아가면서 실험해보기로 하였다.
나는 EfficientNetB2를 해보았고, 실제로 돌려본 결과 의외로 나쁘지 않은 결과를 보였다. 하지만 그 때 당시 1위였던 팀의 score와 매우 큰 차이가 났기 때문에 분류문제로는 일정 수준까지의 score까지밖에 못 얻을 것이라고 판단하였다.
다음 회의 때는 Action Recognition 모델을 만들 팀과 Super-Resolution 모델을 개발할 팀을 나누기로 결정하였다. 이미지의 해상도가 매우 낮았기 때문에 이를 SR을 통해 보완한다면 Classification Task이든 Action Task이든 성능을 높여주는데 도움이 될 것이라고 판단하였다.
참조: https://zentralwerkstatt.org/blog/pulse
나는 Action Recognition 개발 팀에 참여하였고, slow-fast와 LSTM 및 Attention 계열 시계열 이미지 모델이 언급되었는데, 남은 시간 상, 우리 팀의 LSTM과 Attention 모델 개발 경험이 전무하였기에, 비교적 간단하고 효율적인 slow-fast모델을 개발하기로 하였다.
해당 논문을 읽어보면 원리는 매우 간단하지만 좋은 성능을 보이고, 모델에 대한 설명도 비교적 자세히 나와있어 개발하는데 큰 어려움이 없을 것이라 판단하였다.
간략하게 slow-fast가 어떤 원리로 동작하는지 살펴보자!
모델의 이름처럼 low frame rate를 가지는 slow pathway와 high frame rate를 가지는 fast pathway로 나뉘고, 나중에 두 pathway에서 나온 output이 Concatenate를 통해 합쳐진다.
이 논문의 주장은 이러하다.
slow pathway와 fast pathway는 서로 배우려고하는 feature가 다르고, 데이터 또한 그에 맞게 frame rate가 느리고 빠른 종류로 나뉜다.
먼저 slow pathway의 경우, low temporal rate를 가지기 때문에 좀 더 spatial domain과 semantic한 특징을 배우는 데 초점을 맞추어 설계되었고,
반대로 fast pathway는, high temporal rate를 가지므로 어떠한 빠른 변화, 움직임을 잡아내는데 특화되어 설계되었다고 한다.
따라서 이러한 두 pathway를 거친 output을 서로 합치면 spatial하고 semantic한 특징과 object의 temporal change를 인식하는 특징(능력?)을 함께 가지는 모델이 만들어진다는 것이다!
이렇게 원리는 간단하지만 꽤 좋은 성능을 보이는 걸 알 수 있다.
이외에도 다양한 hyper-parameter라던가, 모델 architecture에 대한 설명 및 디테일한 내용들을 더 알고 싶다면 밑 논문을 읽어보기를 권한다. 꽤 인용수가 있는 논문이고 내용도 어렵지 않기 때문에 한 번 읽어보는 것도 굳!
https://arxiv.org/pdf/1812.03982.pdf
서론이 매우 길었는데...ㅎㅎ
논문에 나와있는 resnet50기반의 slow-fast architecture를 keras기반으로 하여 개발을 진행하였다.
처음에 slow pathway와 fast pathway에 input을 넣는 방법이 조금 헷갈렸는데 논문과 기타 참고자료등을 참고하여 파악하였다. 결국 temporal channel을 아래 처럼 stride를 각기 다르게 주어서(실제로는 stride를 사용하지 않고, 파이썬의 ::stride 방식을 사용하여 구현) 뽑아내면 된다!
그 이후로는 딱히 어려운 점은 없었다.
그리고 이제 드디어 evaluation의 시간....데이터셋이 워낙 적어 validation set은 따로 만들지 않았고, 그냥 loss가 가장 낮은 ckpt를 사용하여 prediction을 진행.....결과는!!!....별로였다...
classification으로 내보낸 결과보다 안좋았는데 시간이 별로 남지 않았기 때문에 하이퍼 파라메터정도만 바꾸어보고 대회가 끝나게 되었다.
대회가 끝나고....다른 팀들이 코드를 공유하는 게시판이 있는데 그 곳에 private 점수 2등이 slow-fast를 사용하였다고 말하는 것이다..! 아니 뭐지...내가 모델을 잘못만들었나...여러 생각이 들었지만 일단은 그 팀들의 코드를 살펴보았다.
일단은 그 팀들은 slow-fast를 직접 개발하진 않았고, facebook에서 제공하는 pretrained모델을 사용하였다(pretrained model 있는줄도 몰랐던 나의 잘못....)
위 게시글을 보고 생각한 나의 고찰점!
- 우리는 Resnet50을 backbone으로 하였는데 위 팀은 Resnet101을 기반으로 하였다. 좀 더 큰 모델로 backbone을 개발했어야 좋은 성능을 낼 수 있었나 싶었다(데이터셋이 워낙 적었기 때문에...)
- 데이터셋이 적은 이유로 validation set을 따로 만들지 않았는데 위 팀은 K-Fold Cross validation 방식을 사용하여 val loss를 측정한 것 같다. 최근 다른 데이콘도 해보았는데 데이터가 적을 때, 이 K-Fold 방식을 사용하여 generalized 모델을 찾는 것이 은근 성능을 높이는데 큰 도움이 된다. 또한, K개로 데이터를 나누어서 학습시키기 때문에 약간의 ensemble효과도 보지 않을까 하는 생각도 들었다.
- 마지막으로 ensemble....역시나...명불허전이었다. 우리는 1개의 모델만 학습시킨 반면 위 팀은 5개의 모델을 학습 시킨 뒤 결과를 평균화하였다. 이러한 대회에서 ensemble은 정말 뺄 수 없는 technique인거 같다.
물론 좋은 성적을 내어 높은 순위를 차지한 것은 아니지만 처음으로 action recognition task를 경험해보고 또 관련한 모델도 개발하면서 경험을 쌓는 좋은 기회가 되었다. 그리고 다시 한 번 느끼지만 데이콘이나 캐글이나 고수들은 정말로 많고, 나는 우물안의 개구리라는 것을 새삼 알게 된다....더 열심히 실력을 기르도록 노력하겠다는 말로 마무리를 하겠다!
화이팅!!
keras-based slow-fast model github
https://github.com/gihyunkim/handSignalPrediction/blob/main/slow-fast_network.ipynb
모델에 어떠한 문제가 있거나 고칠 점이 있다면 코멘트나 메일 부탁드립니다!
'코딩연습장 > Dacon' 카테고리의 다른 글
[Dacon] 이미지 품질향상(HiNet) (0) | 2021.07.21 |
---|