常見問題

如何轉換 ImageFrame 和 GpuBuffers

計算機 ImageFrameToGpuBufferCalculatorGpuBufferToImageFrameCalculator 會在 ImageFrameGpuBuffer 類型的封包之間來回轉換。ImageFrame 是指各種點陣圖圖片格式的 CPU 記憶體中圖片資料。GpuBuffer 是指 GPU 記憶體中的圖片資料。詳情請參閱「架構概念」的 GpuBuffer 到 ImageFrame 轉換工具一節。您可以在下方查看範例:

如何以視覺化的方式呈現察覺結果

AnnotationOverlayCalculator 允許感知結果 (例如定界框、箭頭和橢圓形),以與已辨識的物件對齊的影片影格上疊加顯示。在工作站上執行時,結果會顯示在診斷視窗,或在裝置上執行時顯示在紋理頁框中。您可以在下列位置查看 AnnotationOverlayCalculator 的使用範例:

如何平行執行計算機

在計算機圖中,MediaPipe 會定期平行執行不同的計算機節點。MediaPipe 會維護執行緒集區,並會在執行緒可供使用且所有輸入內容準備就緒時,執行每個計算機。每個計算機執行個體一次只能執行一組輸入,因此大多數計算機只需要與執行緒相容,而不需要使用「執行緒安全」模式。

為了讓單一計算機平行處理多個輸入資料,以下提供兩種可能的方法:

  1. 定義多個計算機節點,並將輸入封包分派給所有節點。
  2. 確保計算機執行緒安全無虞,然後調整 max_in_flight 設定。

第一種方法是使用計算機將封包分配給其他計算機 (例如 RoundRobinDemuxCalculator)。單一 RoundRobinDemuxCalculator 可將連續封包分配給多個設定相同的 ScaleImageCalculator 節點。

第二種方法最多允許在同一個計算機節點上叫用 CalculatorBase::Process 方法的 max_in_flightCalculatorBase::Process 的輸出封包會依序自動依時間戳記排序,然後才會傳送至下游計算機。

無論使用哪一種方法,您都必須注意平行執行的計算機無法像一般依序計算機一樣,維持內部狀態。

使用 ImmediateInputStreamHandler 時的輸出時間戳記

ImmediateInputStreamHandler 會在每個封包到達輸入串流後立即傳送。因此,它可以從一個輸入串流傳送時間戳記較高的封包,然後再從其他輸入串流傳送時間戳記較低的封包。如果這些輸入時間戳記都用於傳送至一個輸出串流的封包,則輸出串流會說明時間戳記並非單調遞增。為解決此問題,計算機只有在處理完成的時間戳記後,才會輸出封包。這種情況可以先等待直到收到該時間戳記的所有輸入串流都接收到輸入封包為止,或是忽略抵達的封包具有已處理的時間戳記。

如何在執行階段變更設定

在應用程式執行期間,變更計算機圖的設定有兩種方法:

  1. 修改 CalculatorGraphConfig 修改計算機圖。
  2. 透過圖形輸入串流傳送新的計算機選項。

第一種方法是使用 CalculatorGraphConfig 處理工具,例如「subgraphs」。第二種方法的優勢是,讓使用中的計算器和封包在設定變更時,保持運作狀態。媒體管道貢獻者正在研究如何達成這兩種優勢的替代方法。

如何處理即時輸入串流

媒體管道架構可用來處理線上或離線的資料串流。為了離線處理,當計算器準備好處理這些封包時,封包就會立即推送至圖表中。進行線上處理時,每個影格的一個封包都會在記錄該影格時推送至圖表中。

MediaPipe 架構只需要為連續封包指派時間戳記,且只會增加時間戳記。按照慣例,即時計算器和圖表會使用錄製時間或呈現時間做為每個封包的時間戳記,每個時間戳記都代表自 Jan/1/1970:00:00:00 以來的微秒。這樣一來,系統就能以全域一致的順序處理來自不同來源的封包。

通常用於離線處理,每個輸入封包都會經過處理,而且會視需要繼續處理。進行線上處理時,通常需要捨棄輸入封包,才能跟上輸入資料影格的傳送速度。如果輸入內容太常送達,建議您採用專為這個目的設計的 MediaPipe 計算機,例如 FlowLimiterCalculatorPacketClonerCalculator

針對線上處理,您也必須及時判斷何時可以繼續處理。MediaPipe 透過在計算器之間傳播時間戳記邊界來支援這一點。時間戳記範圍表示不會包含輸入封包的時間戳記間隔,而且計算器可立即開始處理這些時間戳記。用於即時處理的計算機應謹慎計算時間戳記範圍,以盡可能迅速開始處理。舉例來說,MakePairCalculator 會使用 SetOffset API,將輸入串流的時間戳記邊界傳播至輸出串流。

我可以在 MS Windows 上執行 MediaPipe 嗎?

目前 MediaPipe 可攜權支援 Debian Linux、Ubuntu Linux、MacOS、Android 和 iOS。MediaPipe 架構的核心是符合 C++11 標準的 C++ 程式庫,因此轉移至其他平台相對簡單。