안녕하세요! SKT AI Fellowship 5번 연구과제 <라이브 트래킹>을 연구하고 있는 Team금쪽이들의 김지은 입니다.
지금부터 제가 AIF과제를 위해서 공부해왔던 것들에 대해 소개해보려고 해요! 😀
처음 제 글을 읽으시는 분들을 위해, 간단하게 과제 소개를 해볼게요. 라이브 트래킹이란 실시간으로 촬영 중인 영상 내에서 움직이는 피사체를 인식해 자동으로 트래킹해주는 기술이에요.
기술의 배경 및 필요성에 대해서도 궁금하시죠? 현재 비디오 스트리밍 분야에서 유튜브, 트위치 등의 라이브 스트리밍 플랫폼이 활발하게 이용되고 있어요. 이러한 환경 속에 직접 콘텐츠를 제작, 스트리밍하려는 개인 콘텐츠 창작자들이 다수 등장하고 있으며, 라이브 콘텐츠 제작에 관심이 커지고 있는 트렌드입니다. 이런 트렌드 속 라이브 트래킹 기술은 창작자 입장에서도, 시청자 입장에서도 편리하고 필요한 기술이라고 할 수 있어요! 기술 이해를 조금 더 쉽게 도와드리자면, mediapipe의 Autoflip과 아이패드의 center stage 기술을 비슷한 기술로 꼽을 수 있어요.
최종 산출물은 다음과 같은 웹사이트 형태로 산출될 예정이에요. 광각카메라를 통해 입력되는 영상에서 피사체를 detection하고 사용자가 원하는 화면 비율에 따라 crop및 트래킹하여 실시간으로 스트리밍 하는 서비스가 될 예정입니다!
그럼 이제 제가 공부한 분야에 대해 소개해볼게요! 개발 분야는 크게 모델링과 WebRTC 부분으로 나뉘는데요. 저는 모델링 개발을 담당하였습니다. 모델 개발 초기 진행 상황부터 현재 개발 상황까지의 과정에 대해 살펴볼게요! 저희 팀은 2-3주의 sprint를 설정하고 그에 따라서 정한 task들을 해결하며 개발 과정을 설정하였습니다.
각 Sprint 별로 과제 연구가 어떻게 이루어졌는지 궁금하시죠? Sprint1에서는 환경 세팅 및 자료 조사를 진행하였어요. AIF 과제를 진행하며 Mac을 처음 사용해보았기 때문에, 익숙해지는 과정을 거쳤답니다. 제일 먼저 앞서 말씀드린 mediapipe의 Autoflip 코드를 사용해보았어요.
**Autoflip 코드 실행** 김연아 선수의 무대 영상을 Autoflip을 이용하여 트래킹한 결과 입니다. 물론 Autoflip을 사용해보는 것도 쉽지는 않았어요. 하지만 많은 에러들을 해결하고 저희가 구현하고자하는 라이브 트래킹과 비슷한 기술을 경험해보았습니다!
원래 계획은 mediapipe의 이 Autofilp을 사용하여 실시간 입력을 통해서 라이브 트래킹을 구현하려고 하였어요. 하지만 직접 사용해보니, Autoflip의 로직 자체가 많이 복잡하고, 실시간 Input을 사용하는 저희 팀의 과제에 사용하는 것은 불가능하였습니다. 그래서 객체를 인식하는 기술인 Object Detection과 Tracking알고리즘을 통해서 직접 개발하기로 결정하였습니다. 앞으로 말씀 드릴 개발 내용은 Autoflip의 로직을 많이 참고하여서 연구하였습니다!
저는 Object Detection을 구현한 모델 중에서도 가장 널리 알려지고, 익숙한 YOLO모델을 사용해보았어요. Yolov3 tiny model로 object detection 후 박스 범위에 따라 자동 크롭을 구현하였습니다.
객체를 중심을 잡히는 박스의 x,y,w,h을 기준으로 임의로 어느정도 범위를 정해서 크롭 되도록 하였습니다. 매 Sprint 중간과 사이사이 팀원들과 주기적으로 회의 시간을 가졌는데요. 팀원들과 회의 후, 박스 기준으로 크롭할 필요성을 없다고 판단되었습니다. Detection된 객체의 중심 좌표값만 알면, 그것을 중심으로 16:9, 3:4 와 같이 일정 비율로 crop할 수 있다는 거죠! !
회의 후, 수정한 비율로 crop해보았습니다. Yolo tiny 모델을 사용하였을 때, 몇가지 문제점이 존재했습니다. Real-time은 fps가 30이상으로 나오면 안정적으로 구현 가능합니다. 하지만 yolo-tiny를 사용하였을 때, fps가 23-24 정도로 나왔습니다. 또한 crop기능을 넣으면서 detection이 느려지고 부드럽게 crop이 이어지지 않았습니다. 또한 아무래도 속도를 위해서 tiny모델을 사용하다보니, Detection의 정확도도 떨어지는 단점이 존재하였습니다. 팀원 중 같이 모델링 개발 부분을 담당한 민솔 팀원이 Mobilenet v1 SSD lite라는 detection 모델로 테스트를 진행중이었습니다. SSD 모델이 fps 성능이 더 좋았고, tracking도 더 자연스럽게 진행이 되었기 때문에, Object Detection 모델을 Mobilenet v1 SSD lite로 사용하기로 결정하였습니다. 또한 mediapipe의 blazeface를 Object Detection과 함께 사용하기로 하였습니다. mediapipe - blazepose
객체를 인식하는 것만 하는 것이 아니라, 얼굴 좌표 값을 통해 얼굴을 인식한다면 조금 더 높은 정확도로 객체를 트래킹할 수 있기 때문이에요! Blazeface를 통해 인식한 얼굴과 Object Detection모델을 통해 인식한 객체 중, 더 높은 정확도를 보이는 Box를 기준으로 Tracking을 진행하도록 알고리즘을 작성하였습니다. 하지만 여전히 tracking이 보기에 부드러울 정도로 진행되지 않는다는 단점이 존재하였습니다. Sprint3가 끝나고 멘토님과 진행한 미팅에서 매 프레임 마다 detection을 진행하기 때문에 요구되는 연산이 많으니, detection을 듬성듬성 수행해서 연산량을 줄이라는 피드백을 받았습니다.
더하여 Tracking 알고리즘도 더 좋은 성능을 위한 방법을 고민해보았습니다. Object Tracking Methods 자료 조사를 진행한 결과, SORT(Simple Online Realtime Tracker)에 대해 알게되었습니다. SORT는 다중 객체 탐지 알고리즘 MOT(Multi Object Tracking) 입니다. 탐지된 객체의 경계상자를 이용하여 객체의 속도를 칼만 필터(Kalman Filter)로 추정하여 다음 프레임에서 객체의 위치를 예측하는 방식으로 사용됩니다.
Kalman filter는 이전 프레임에 등장한 개체를 이용하여 다음 프레임의 개체의 위치를 예측하고 측정합니다. Detection 중 발생되는 Noise를 처리하는데 도움을 준다는 특징이 있습니다. 영상에서의 Tracking은 선형성(물체가 순간적으로 사라지거나 나타나지 않음)을 나타내기 때문에 영상 Tracking에서 적합하다고 할 수 있습니다. 예를 들어, **N번째 프레임에서 탐지된 경계상자 F는 칼만 필터로 N+1번째 프레임에서의 F*를 추정하게 됩니다. 여기서 N+1**번째 프레임에서 새롭게 탐지된 객체 정보 **F'와 예측된 F*의 유사도를 IOU의 거리값 그리고 헝가리안 알고리즘 등을 통해 정렬하고 매칭하여 N번째에서 탐지된 객체의 정보를 N+1**에서 이어나갈 수 있게 합니다. 이 칼만필터를 통해서 빠른 속도와 실시간 가능성을 확보할 수 있게 됩니다!
여기서 IoU란 Intersection over Union로 Object Detection 분야에서 예측 Bounding Box와 Ground Truth가 일치하는 정도를 0과 1 사이의 값으로 나타낸 값을 말해요. Object Detection에서 단순히 box의 좌표 차이를 통해 loss를 구하는 것보다 IoU를 loss에 활용하는 것이 regression loss에 더 적합해요.
헝가리안 알고리즘(Hungarian matching algorithm) 은 O(|V^3|)의 시간복잡도로 좀 더 효율적이고 빠르게 해결하는 알고리즘이에요. 가중치가 있는 이분 그래프(weighted bitarted graph)에서 maximum weight matching을 찾기 위한 알고리즘이죠. 헝가리안 알고리즘에 적용되는 핵심 아이디어는 바로 “Cost matrix에서 row, column 방향으로 값을 빼거나 더한 후 최적의 연결(optimal matching)을 찾는 것은 Original Cost matrix에서 최적의 연결을 찾은 결과와 동일하다” 이에요. 즉, 복잡한 숫자로 이루어진 인접 행렬을 쉽게 변형해서 최적의 선택이 무엇인지 알기 쉽게 만든 후, 선택하자는 것이에요.
Deep SORT는 sort를 확장한 개념인데요. Sort는 Kalman filter가 뛰어나긴 하지만, 그 효율성에도 불구하고 실제 상황에서 발생하는 Occulusion이나 ID switching 에는 불안정하다는 한계점이 있기 때문이에요. 다른 사람들에 의해 혼자 걷고 있는 남성의 BBox가 사라진 상황(Tracking X)
* Occulusion은 위와 같이 개체가 어떤 상황에 의해 가려지는 현상을 말합니다. * ID Switching은 MOT의 특징 중 다양한 개체가 움직일 때, ID의 추적이 변경될 수 있다는 것이에요 예를 들어 위와 같이 축구 경기를 위에서 관찰하고 있을 때, 선수들의 ID를 추적하는 상황이 제대로 이뤄지지 않는다는 점이 있습니다.
DeepSORT의 가장 큰 특징으로는Deep Appearance Descriptor 으로 Re-identification(ReID) 모델을 적용하여 ID Switching 문제를 해결 & Matching Cascade 로직으로 더 정확한 추적을 가능하게 해요. 장점은 매우 빠른 추적으로 real-time 가능하고 높은 정확도를 가져 sort에 비해 ID swithing이 감소한다는 점이에요. Deep Sort와 Sort의 성능을 분석한 논문 자료입니다.
위와 같이 조사한 SORT 알고리즘을 사용해서 Tracking 성능을 개선해보기로 하였습니다! SORT를 사용하였을 때, Tracking이 끊기면서 실행이 되는 문제점이 발생해서 Deep SORT로 시도를 해보았습니다. Deep SORT는 기존 SORT와 차이점이 있다면 matching cascade를 진행한다는 점이에요. Matching cascadefks track과 detection과의 정보를 유사도가 큰 순서대로 matching하는 것이에요. SORT에서는 이부분이 구현되어있지 않았습니다. 또 sort랑 다르게 이미지를 feature extracting한다는 점이 큰 차이였습니다. 하지만 Deep SORT를 사용하였을 때도, Tracking이 잘되지 않는 문제가 발생하였습니다. 결국 최종적으로 FastMOT의 로직을 따와서 해결하여 현재 모델을 완성하였습니다!
멘토님께서 연구를 위해서 GPU서버를 사용할 수 있게해주셔서, Object Detection 모델 테스트용으로 사용해보았습니다. Real-time을 구현할 수 있다고 널리 알려진 YOLOv4와 YOLOv7을 테스트 해보기로 하였습니다. YOLOv4는 make 단계에서 에러가 계속해서 발생하였습니다. 그래서 YOLOv4를 테스트 해보는 데는 실패하였습니다. GPU를 ssh로 연결해서 사용해본 적은 처음이라, 많이 헤매고 시간이 들었습니다. 특히 cuda와 pytorch 버전 호환 문제가 계속 발생하였습니다. YOLOv7은 YOLOv4보다는 실행시키는 것이 간단해서 실행시키는 데는 성공하였습니다.
모델 테스트에 있어서 몇가지 한계점이 존재하였습니다. 먼저 테스트의 정량적 기준 설정의 어려움과 영상의 실시간 입력을 받아오는 저희 팀의 코드를 GPU서버를 이용해서 사용하기 어려웠습니다. 또한 CPU를 사용한 지금 모델과 web과의 연결도 안정적인 상황이 아니기 때문에, GPU를 사용한다고 해도 web과 안정적으로 연결이 될 지 확신이 서지 않았습니다. 현재는 CPU를 이용해서 연구를 진행하기로 결정하였습니다.
현재는 특허 관련한 Sprint6 단계로, 특허 출원 방법에 대한 조사와 특허 아이디어 구현을 목표로 연구 단계가 진행중입니다.
그럼 앞으로도 Team 금쪽이들의 연구 지켜봐주세요! 감사합니다.
[Reference] - SORT와 DeepSORT의 혼합을 이용한 실시간 다중객체 추적 : http://ki-it.com/xml/30742/30742.pdf - Deep Sort paper : https://arxiv.org/pdf/1703.07402.pdf - Sort paper : https://arxiv.org/pdf/1602.00763.pdf
-
위 파일들과 yolov3-tiny.weights 파일 다운 https://velog.io/@jeongm/yolov3-weight%EA%B0%80%EC%A4%91%EC%B9%98-%EB%8B%A4%EC%9A%B4
-
LiveTracking 파일 실행