ImageFrame と GpuBuffer を変換する方法
計算ツールの ImageFrameToGpuBufferCalculator
と GpuBufferToImageFrameCalculator
は、ImageFrame
タイプと GpuBuffer
タイプのパケット間を相互変換します。ImageFrame
は、さまざまなビットマップ画像形式の CPU メモリ内の画像データを参照します。GpuBuffer
は GPU メモリ内の画像データを指します。詳細については、フレームワークのコンセプトの GpuBuffer から ImageFrame へのコンバータをご覧ください。次の例をご覧ください。
知覚の結果を可視化する方法
AnnotationOverlayCalculator
を使用すると、境界ボックス、矢印、楕円などの認識結果を、認識されたオブジェクトに合わせて配置された動画フレームに重ねることができます。結果は、ワークステーションで実行する場合は診断ウィンドウに、デバイスで実行する場合はテクスチャ フレームに表示できます。AnnotationOverlayCalculator
の使用例は、次の場所で確認できます。
計算ツールを並行して使用する方法
電卓グラフ内では、MediaPipe は定期的に個別の計算ノードを並行して実行します。MediaPipe はスレッドのプールを維持し、スレッドが利用可能になり、すべての入力の準備が整うとすぐに各計算ツールを実行します。各計算ツールは、一度に 1 つの入力セットに対してのみ実行されます。そのため、ほとんどの計算ツールは、スレッドセーフではなくスレッド互換であることだけで済みます。
1 つの計算ツールで複数の入力を並行して処理できるようにするには、次の 2 つの方法があります。
- 複数の計算ノードを定義し、入力パケットをすべてのノードにディスパッチする。
- 計算ツールをスレッドセーフにして、
max_in_flight
設定を構成します。
最初の方法では、パケットを他の計算ツール(RoundRobinDemuxCalculator
など)に分散するように設計された計算ツールを使用します。1 つの RoundRobinDemuxCalculator
で、同一構成の複数の ScaleImageCalculator
ノードに連続するパケットを分散できます。
2 番目の方法では、同じ計算ノードで CalculatorBase::Process
メソッドを最大 max_in_flight
回呼び出せます。CalculatorBase::Process
からの出力パケットは、ダウンストリームの計算ツールに渡される前に、タイムスタンプ順に自動的に並べ替えられます。
どちらのアプローチでも、並列で実行される計算ツールでは、通常の順次計算ツールと同じ方法で内部状態を維持できないことに注意してください。
ImmediateInputStreamHandler を使用する場合の出力タイムスタンプ
ImmediateInputStreamHandler
は、各パケットが入力ストリームに到着するとすぐに配信します。その結果、1 つの入力ストリームからタイムスタンプがより高いパケットを配信してから、別の入力ストリームからタイムスタンプがより小さいパケットを配信できます。これらの入力タイムスタンプの両方を 1 つの出力ストリームに送信されるパケットに使用すると、タイムスタンプが単調に増加していないことが出力ストリームに表示されます。これを修正するには、タイムスタンプの処理が完了した後にのみパケットを出力するように計算ツールが注意を払う必要があります。これは、そのタイムスタンプのすべての入力ストリームから入力パケットを受信するまで待機するか、すでに処理されたタイムスタンプで到着したパケットを無視することで実現できます。
実行時に設定を変更する方法
アプリケーションの実行中に電卓グラフの設定を変更する方法は主に 2 つあります。
CalculatorGraphConfig
を変更して計算ツールのグラフを再起動します。- グラフ入力ストリームのパケットを介して新しい計算オプションを送信します。
最初の方法には、「サブグラフ」などの CalculatorGraphConfig
処理ツールを利用するという利点があります。2 つ目のアプローチには、設定の変更中もアクティブな計算機とパケットを処理中のままにできるという利点があります。Mediapipe のコントリビューターは現在、この両方のメリットを実現するための別のアプローチを調査しています。
リアルタイム入力ストリームの処理方法
メディアパイプ フレームワークを使用して、オンラインまたはオフラインでデータ ストリームを処理できます。オフライン処理では、計算ツールでパケットを処理する準備が整うとすぐにパケットがグラフに push されます。オンライン処理では、フレームごとに 1 つのパケットがグラフに push され、そのフレームが記録されます。
MediaPipe フレームワークでは、単調に増加するタイムスタンプを連続するパケットに割り当てる必要があります。慣例により、リアルタイムの計算とグラフでは、各パケットのタイムスタンプとして記録時間または表示時間を使用し、各タイムスタンプは Jan/1/1970:00:00:00
からのマイクロ秒を表します。これにより、さまざまな送信元からのパケットをグローバルに一貫した順序で処理できます。
通常、オフライン処理では、すべての入力パケットが処理され、必要な期間だけ処理が継続されます。オンライン処理では、多くの場合、入力データフレームの到着に対応するために入力パケットをドロップする必要があります。入力が頻繁に到着する場合は、パケットをドロップするために、この目的のために特別に設計された MediaPipe 計算ツール(FlowLimiterCalculator
や PacketClonerCalculator
など)を使用することをおすすめします。
オンライン処理の場合は、処理を続行できるタイミングを速やかに判断する必要もあります。MediaPipe は、計算ツール間でタイムスタンプ境界を伝播することで、これをサポートします。タイムスタンプの範囲は、入力パケットを含まないタイムスタンプ間隔を示します。これにより、計算機はこれらのタイムスタンプの処理をすぐに開始できます。リアルタイム処理用に設計された計算ツールでは、できる限り迅速に処理を開始するために、タイムスタンプの範囲を慎重に計算する必要があります。たとえば、MakePairCalculator
は SetOffset
API を使用して、入力ストリームから出力ストリームにタイムスタンプ境界を伝播します。
MS Windows で MediaPipe を実行できますか?
現在、MediaPipe のポータビリティは Debian Linux、Ubuntu Linux、MacOS、Android、iOS をサポートしています。MediaPipe フレームワークのコアは、C++11 標準に準拠する C++ ライブラリであるため、他のプラットフォームへの移植は比較的簡単です。