The basics
Packet
기본적인 데이터 플로우 유닛. the basic data flow unit. 패킷은 숫자로 나타낸 timestamp 와 변경할 수 없는 payload 를 위한 shared pointer 로 구성되어있습니다. 이 payload는 어떤 C++ type이라도 가능하고, payload의 type은 또한 패킷의 type으로써 참조됩니다. 패킷들은 value 클래스들이고 싸게 복사될 수 있습니다.(copied chealpy) 각 복사본은 reference-counting semantics와 함께 payload의 소유권을 공유합니다. 각 복사본은 각자의 timestamp를 가지고 있습니다. Packet을 참고하세요.
Graph
Mediapipe 처리는 그래프 내에서 이루어집니다. 이 그래프는 노드들 nodes 사이에서 패킷 흐름 경로들 packet flow paths 을 정의합니다. 그래프는 임의의 개수의 입력과 출력을 가질 수 있고, data flow는 branch 되고 merge 될 수 있습니다. 일반적으로 data flow는 순방향이지만 역방향 루프가 발생할 수 있습니다. Graphs를 참고하세요.
Nodes
노드들은 packets를 생산하거나 혹은 소비합니다. 그리고 그들은 그래프 작업의 대부분이 이루어지는 곳입니다. 그들은 역사적(historical) 인 이유로 "calculators"라고도 알려져 있습니다. 각 노드의 인터페이스는 입력과 출력의 포트들의 수를 정의하고, 태그 그리고/혹은 인덱스에 의해 정의됩니다. Calculators를 참고하세요.
Streams
스트림은 패킷들의 연속을 전달하는 두 개의 노드 사이의 연결입니다. 이 패킷들의 timestamp는 단조롭게 증가해야만 합니다.
Side pakcets
노드 사이의 사이드 패킷 연결 a side packet connection 는 하나의 패킷 (명시되지 않은 timestamp) 을 전달합니다. 이것은 일정하게 남아있을 일부 데이터를 제공하는데에 사용됩니다. 반면에 스트림은 시간에 따라 변화하는 데이터의 흐름을 나타냅니다.
Packet Ports
포트는 associated type을 가지고 있습니다; 포트를 지나는 패킷 전송은 반드시 해당 타입이어야 합니다. 출력 스트림 포트는 같은 타입의 임의의 수의 입력 스트림 포트들에 연결될 수 있습니다; 각 소비자 consumer 는 출력 패킷들의 독립된 복사본을 전달받고, 그것이 가지는 queue를 가집니다. 그래서 그것은 그 자신의 속도 대로 그것들을 소비할 수 있습니다. 비슷하게, 사이드 패킷 출력 포트는 필요한 수의 사이드 패킷 입력 포트들을 연결할 수 있습니다.
포트는 필요할 수 있고, 즉 이것이 의미하는 것은 그래프가 유효해지기 위해서 접속이 확립 되어야만 합니다, 혹은 추가적으로, 의미하는 것은 아마도 연결되지 않은 상태로 있을 수 있습니다.
Note: 만약 스트림 연결이 요청될지라도, 스트림은 모든 타임스탬프를 위한 패킷을 전달하지 않을 수 있습니다.
Input and output
source nodes로부터 데이터 플로우는 비롯될 수 있습니다. 이 source nodes는 입력 스트림이 없고 자연스럽게 패킷을 생산합니다.(예를들면 파일에서 읽어들임으로써); 혹은 그래프 입력 스트림으로부터, 이 그래프 입력 스트림은 애플리케이션이 그래프에 패킷을 전달하도록 합니다.
비슷하게, sink nodes라는 것이 있는데, 이것은 데이터를 받거나 다양한 목적지에 데이터를 씁니다(예를 들어 파일, 메모리 버퍼 등등), 그리고 애플리케이션은 또한 callbacks을 사용하여 그래프로부터 출력을 받을 수 있습니다.
Runtime behavior
Graph lifetime
한번 그래프가 초기화되면, 데이터를 처리하는 것을 시작하기 위해 시작 started 될 수 있습니다, 그리고 각 스트림이 닫히거나 그래프가 calceled 취소될 때까지 패킷의 스트림은 처리될 수 있습니다. 그러면 그래프는 소멸되거나 다시 시작될 started 수 있습니다.
Node lifetime
여기에는 세 개의 주요 lifetime 메소드가 있으며 프레임워크는 이것들을 노드에서 호출할 것입니다:
- Open: 다른 메소드들 전에 한번 호출됩니다. 호출될 때, 노드에 의해 요청된 모든 입력 사이드 패킷들은 사용할 수 있게 됩니다.
- Process: 여러 번 호출됩니다, 노드의 입력 정책에 따라, 새로운 입력 세트를 사용 가능할 때.
- Close: 마지막에 한번 호출됩니다.
추가적으로, 각 calculator는 생성자와 소멸자를 정의할 수 있습니다. 이것은 생성과 처리된 데이터의 독립된 리소스를 할당 해제하는 것에 편리합니다.
Input policies
기본 입력 정책은 timestamp에 의한 패킷의 결정론적인 분석 deterministic collation 입니다. 노드는 같은 시간에 같은 timestamp를 위해 모든 인풋을 전달받습니다. 그것의 Process 메소드의 호출로부터; 그리고 연속적인 입력 셋은 그들의 timestamp 순서대로 전달받습니다. 이것은 일부 패킷들의 처리를 미루는 것을 요청할 수 있습니다. 같은 timestamp를 가진 패킷이 모든 입력 스트림에서 전달받을 때까지, 혹은 해당 timestamp를 가진 packet 이 해당 패킷을 받지 않은 스트림에 도착하지 않을 것이라는 것을 보증할 수 있을 때까지 입니다.
다른 정책들은 또한 가능합니다, InputStreamHandler라고 알려진 다른 종류의 컴포넌트를 사용하면서 구현될 수 있습니다.
Synchronization 를 참고하세요.
Real-time streams
Mediapipe calculator graphs는 비디오의 스트림이나 상호작용적인 애플리케이션을 위한 오디오 프레임을 처리하는 데에 사용됩니다. 보통, 각 calculaotr는 주어진 timestamp를 위해 모든 입력 패킷이 사용가능하게 되는 즉시 실행됩니다. Calculators는 실시간 그래프에서 사용되는데, downstream calculators를 신속하게 스케줄링 할 수 있도록 입력 timestamp경계에 따라 출력 timestamp 경계를 정의해야합니다. Real-time Streams 를 참고하세요.
References
https://google.github.io/mediapipe/framework_concepts/framework_concepts.html
'개발 > mediapipe' 카테고리의 다른 글
mac intel 에서 xcode로 opencv 설치 후 실행하기 (0) | 2022.04.23 |
---|---|
m1 에서 lldb 로 실행시키기 (0) | 2022.04.23 |
Framework Concepts - Real-time Streams (0) | 2022.03.22 |
Framework Concepts - GPU (0) | 2022.03.21 |
Framework Concepts - Synchronization (0) | 2022.03.14 |