실시간 영상 분석 인퍼런스 서버 개발

공공 치안기관의 보행 패턴 분석 시스템에서 학습된 YOLO 모델로 객체 탐지와 자세 추정을 수행하는 인퍼런스 서버를 개발했습니다. 초당 30프레임을 목표로 Kafka 로 수신과 추론을 떼어 놓고 결과를 MongoDB 에 쌓아 조회할 수 있게 했습니다. PoC 단계에서 멈춘 프로젝트입니다.

Architecture

동기

학습이 끝난 모델은 그 자체로는 아무 일도 하지 않습니다. CCTV 에서 들어오는 영상을 받아 프레임마다 모델을 돌리고 결과를 쌓아 두는 것이 있어야 시스템이 됩니다. 목표는 초당 30프레임을 따라가는 것이었습니다.

내가 담당한 트랙

서빙 쪽을 제가 맡았습니다. 영상을 받는 곳부터 추론, 결과 저장, 조회 API 까지입니다. 항목별 내역은 오른쪽 「주요 업무」에 있습니다.

트랙경계
모델 학습다른 분들 몫이었습니다. 저는 그 모델을 돌리는 쪽이었습니다

받는 쪽과 돌리는 쪽을 떼어 놓기

한 프로세스가 받아서 그대로 처리하면 모델 한 번 도는 시간이 프레임 하나 들어오는 간격보다 길어지는 순간 뒤가 계속 밀립니다. 그래서 Kafka 를 사이에 뒀습니다. 영상을 받는 쪽이 프레임을 큐에 넣고 추론하는 쪽이 큐에서 꺼내 갑니다. 결과는 MongoDB 에 쌓고 REST API 로 꺼내 볼 수 있게 했습니다.

추론 워커는 한 대로 운영했습니다. 큐를 사이에 두면 나중에 워커를 늘려도 앞뒤를 고치지 않아도 되는데, 실제로 늘려 본 적은 없습니다.

여기까지 갔습니다

이 프로젝트는 PoC 단계에서 멈췄습니다. 목표한 처리 속도를 실제로 내는지 재 보는 데까지 가지 못한 채 제가 회사를 옮겼습니다. 그래서 이 카드에 성능 수치는 없습니다.

배운 점

Kafka 와 MongoDB 를 고른 이유가 둘 다 나중에 늘릴 수 있다는 것이었습니다. 앞뒤를 큐로 떼어 놓으면 추론하는 쪽을 늘리는 일이 앞쪽과 무관해지고, 결과 스키마가 굳지 않은 상태에서는 문서 저장소가 편했습니다. 확장을 염두에 두고 구조를 잡아 본 것이 그때가 처음입니다.

다만 그 판단이 맞았는지는 확인하지 못했습니다. 늘려 봐야 알 수 있는 것이었는데 거기까지 가기 전에 끝났습니다.