mediapipe framework를 C++을 이용해서 사용하려면 다음과 같은과정을 겪는다.
1. bazel 설치
- bazel은 구글에서 만든 멀티 플렛폼 빌드 및 테스트 자동화 툴이다. mediapipe를 c++에서 사용하기 위해서는 다음 빌드툴을 이용해서 빌드해야한다.
2. mediapipe 프로젝트를 github에서 해당 리포지토리를 다운받아야함
https://developers.google.com/mediapipe/framework/getting_started/install
3. open cv설치
4. msys2 (윈도우에서 build를 편하게 하는 라이브러리들을 가지고 있는 플랫폼이라 생각하면됨) 설치
(pre-built open-cv는 wsl에서 카메라가 지원이 안된다.. 그외에도 자잘자잘한 답답한점들이 많아서, 차라리 linux환경을 따로 파거나, window 환경에서하는 것을 추천한다.)
https://developers.google.com/mediapipe/framework/framework_concepts/overview
Framework concepts | MediaPipe | Google for Developers
Framework concepts Stay organized with collections Save and categorize content based on your preferences. Before using MediaPipe Framework, familiarize yourself with the following concepts. The basics Packet The basic data flow unit. A packet consists of a
developers.google.com
다음 overview를 보고 정리를 좀 하고자 한다.
Packet : 데이터의 흐름의 단위, timestamp와 변경불가능한 payload로의 shared pointer로 이루어져있다. 각 복사본은 payload의 소유권을 reference-counting 으로 가지고있다.
(reference-counting : 객체를 참조하고 있는 횟수를 추적해서 0이되면 해제하는것 )
Graph : 미디어파이프의 동작 방식은 Graph와 많이 흡사하다. 두 노드 사이에서 edge를 통해서 packet이 흐른다고 생각하면 된다, 그래프는 어떤수의 input과 output을 가지고 있으며, data flow는 분기되거나 합쳐 질 수 있다. 일반적으로 data flow는 한 방향으로 움직이지만, 가끔 Loop문을 위한 backward는 허용된다.
Node : Node는 packet을 생성하거나 소비하는 주체이다. mediapipe에서는 calculator 라고도 명칭한다. 각 node의 인터페이스는 다양한 수의 input과 output ports로 존재하고 각각이 태그나 인덱스로 구분되어진다.
Streams : 두 노드 사이의 커넥션 패킷의 수열을 옮겨주고, timestamp는 점진적으로 늘어야한다.
Side packets : 두 nodes 사이의 side packet connection은 timestamp가 특정되지 않은 single packet을 옮긴다. 상수로 쓰일 몇몇 데이터를 제공한다. stream과 반대되는 개념
Packet Ports : port는 어떤 연관된 타입이 존재한다, port를 지나는 packet들은 무조건 그 타입이어야 한다. output stream의 port은 여러개의 input stream port와 매칭될 수 있따. port 는 connection이 graph에서 만들어질때 필요하다.
Input and Output
- 데이터 흐름은 source node 에서 시작한다. 이건 input stream은 존재하지 않고 자발적으로 packet을 주거나 graph input stream(application은 packet을 줄 수 있다)에서부터 packet을 만들어낸다.
Runtime behavior
Graph lifetime
- 그래프가 initialized될때 데이터를 프로세싱하고 , 각 스트림이 종료되거나 graph가 취소될떄까지 작동한다음, 그래프는 삭제되거나 다시 시작한다.
Node lifetime
노드는 3가지의 중요 생명주기 함수가 있다. (nodebase.h에서 상속 받아서 씀)
- Open : 다른 메서드전에 한번만 호출된다, 모든 input side에서의 packet들은 사용가능해진다.
- Process : 새로운 인풋들이 사용가능할 떄마다 multiple하게 시행된다.
- Close : 모든것이 끝날때 한번 불린다.
각 calculator(Node)는 생성자와 소멸자를 정의할 수 있다. 독립적이거나 정제된 데이터을 만들거나 삭제할때 도움이 된다.