brunch

You can make anything
by writing

C.S.Lewis

by sebatyler Jul 03. 2019

비프로 픽스캠 시스템

 우리 회사 즉, 비프로 컴퍼니에서 픽스캠 시스템을 고안하고 실제로 서비스에 적용하기 시작한 지 아직 1년이 되지 않았다. 이 시스템을 만들고 운영하고 개선하고 있는 개발자 입장에서 정리의 시간을 한 번 가져보려고 한다.


https://youtu.be/lJjRF5k--60?si=QqGe9aK6IyBr_ifG


픽스캠이란 무엇인가?

비프로 서비스 소개

 위의 서비스 소개 페이지를 보면 3대의 카메라가 설치되어 있는 것이 보인다. 3대의 카메라를 설치하고 말 그대로 고정해둔다. 이 3대의 카메라를 동시에 촬영하면 경기장 전체를 다 볼 수 있고 촬영 이후 3D 카메라 스티칭(이하 스티칭)을 하면 하나의 영상에서 경기장 전체를 다 볼 수 있게 된다. 볼 주변의 일부 화면만이 아닌 경기장 전체와 모든 선수의 움직임을 볼 수 있게 되는 것이다. 축구에서는 볼을 소유하고 있는 선수의 움직임뿐만 아니라 볼을 소유하고 있지 않는 나머지 21명의 움직임도 중요하다. 이 오프더볼 움직임이 좋기로 유명한 박지성 선수의 경기를 본 적이 있는 한국 사람이라면 경기장 전체를 한눈에 볼 수 있음의 유용함을 인정해야 할 것이다.



픽스캠 시스템 구성


1. PoE 카메라 3대

 경기장 전체를 다 커버하기 위해 카메라 3대를 설치한다. PoE는 Power over Ethernet을 의미하는데 PoE 카메라는 별도의 전원을 연결하는 대신 UTP 케이블 하나로 데이터와 전력을 공급받을 수 있다.


2. PoE 스위치

 PoE 카메라에 전력을 공급하기 위해 PoE 기능을 가진 스위치를 사용한다. 스위치 기능을 통해 로컬 네트웍을 구성한다.


3. 나스 (NAS. Network attached storage)

 카메라의 영상을 SD 카드 대신 나스에 저장한다. 이를 위해서 나스는 스위치에 연결해서 로컬 네트웍에 들어가야 하고 카메라 설정에서 저장소를 나스로 지정해서 영상이 나스의 디스크에 저장되도록 한다.


4. 라우터

 라우터의 포트포워딩 기능을 사용해서 외부에서 카메라와 나스에 접근할 수 있게 한다. 카메라의 경우 http를 포트포워딩하고 나스의 경우는 http, rsync 등을 포트포워딩한다. 포워딩한 포트별로 접근하기 위해서 라우터의 공인 IP를 알아야 하는데 대부분 고정 IP를 사용하지 않기 때문에 동적 IP를 주기적으로 업데이트해서 시스템 연동이 되도록 해야 한다. 이를 위해서 나스에 IP 업데이트하는 스크립트를 심어놓고 cron으로 주기적으로 실행한다.


5. UPS (Uninterruptible power supply)

 라우터, 나스, 스위치의 경우 별도의 전원을 필요로 하고 전원이 연결되어 있어야 시스템 연동과 제어가 가능하다. 시스템이 설치된 곳의 전원이 짧은 시간 동안 불안정하거나 정전이 되는 경우에도 바로 전원이 나가서 라우터, 나스, 스위치가 꺼져버리지 않도록 UPS를 통해서 전원을 공급하고 있다. 특히 나스의 경우 디스크가 들어있기 때문에 전원이 갑작스럽게 나가버리면 디스크 손상이 발생할 수 있다. UPS는 전원이 잘 공급되는 경우에는 전원을 사용하고 전원이 나간 경우에는 내장되어 있는 배터리를 통해서 전원을 공급한다. UPS와 나스를 USB 케이블로 연결하면 전원이 나간 시점에 UPS가 나스에 신호를 보낼 수 있고 나스는 이를 받아서 몇 분 후에 안전하게 종료해서 디스크를 보호할 수 있다.



경기 촬영 시나리오


1. 등록된 경기 스케줄에 맞춰서 촬영을 시작한다. 시간 싱크, 오토 포커스, 화이트밸런스 고정 등을 먼저 해서 카메라를 경기 촬영하기에 최적의 상태로 만든 후에 촬영을 시작한다. 모든 작업은 카메라가 제공하는 API를 통해서 이루어진다.


2. 픽스캠 시스템이 설치된 지역과 가장 가까운 리전에 구글 컴퓨트 엔진 인스턴스를 실행해서 경기 영상 처리를 시작한다. 3번부터의 과정은 모두 이 인스턴스에서 제어한다.


3. 영상 파일은 5분마다 생성되는데 카메라 별로 첫 번째 파일 생성이 완료되면 스티칭을 위한 파라미터 예측을 한다. 카메라 자체는 고정되어 있지만 시간이 지남에 따라 3축으로 미세하게 움직일 수 있어서 기존에 세팅되어 있던 파라미터가 정확하지 않을 수 있다. 카메라 별 영상의 겹치는 영역의 유사도를 판단하여 스티칭 파라미터를 업데이트해서 전체 영상 스티칭에 사용한다.


4. 전반에 해당하는 5분 단위 영상을 시간 순서에 맞게 차례대로 rsync를 사용해서 나스에서 인스턴스로 전송한다.


5. 전반 영상 전송이 완료되면 카메라 별로 5분 단위 영상을 합쳐서 영상 파일 3개를 생성한다.


6. 5번에서 생성한 영상 파일 3개와 3번에서 업데이트한 파라미터를 입력으로 넣어서 스티칭을 시작한다. 단 이것도 영상 파일 처리와 마찬가지로 별도의 구글 컴퓨터 엔진 인스턴스를 실행해서 병렬로 돌아가도록 한다. 전반, 후반 모두 스티칭이 완료되면 비프로 서비스에서 경기 영상을 볼 수 있게 된다.


7. 스티칭에 사용한 입력을 동일하게 사용해서 디텍션, 트래킹도 실행한다. 스티칭과 마찬가지로 별도의 인스턴스에서 실행한다. 전반, 후반 모두 디텍션, 트래킹이 완료되면 비프로 서비스에서 경기의 선수별 피지컬 데이터를 볼 수 있게 된다.


8. 후반에 대해서도 영상 전송을 하고 5,6,7 과정을 실행한다.



맺음말


 서두에 쓴 것처럼 픽스캠 시스템을 적용하기 시작한 지 채 1년이 되지 않았다. 위에서 설명한 시스템 구성과 촬영 시나리오 모두 최초의 설계, 구현과 동일하지 않다. 수많은 시행착오를 겪으면서 조금씩 개선하고 자동화해온 것이 쌓여서 현재의 모습을 갖추게 된 것이다. 최초에는 카메라 업체가 제공하는 프로그램을 사용해서 직접 촬영을 시작하고 나스에서 파일을 직접 받아서 스티칭 준비를 했었다. 이후에는 촬영 시작, 종료 버튼을 만들고 경기 시작, 종료에 맞춰서 비프로 멤버들이 돌아가면서 영상을 실시간으로 봐가면서 촬영을 하기도 했다. 이런 식으로 점진적으로 자동화를 하고 문제를 찾아서 해결하는 과정이 쉽지는 않았지만 꽤나 흥미로웠다. 특히나 시스템을 설치하는 팀이 빠르게 늘어나는 것을 보면서 보람을 느끼기도 했다. 그 과정에서 네트웍 관련 지식과 시스템 구성을 위한 온갖 기술을 끄집어내고 공부하면서 개발자로서도 조금은 성장한 기분이다. 아직도 개선할 것은 많고 해야 할 일도 많기에 많은 훌륭한 개발자 분들이 비프로에 조인하면 좋겠다는 마음을 표현하며 글을 마친다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari