FAQ

Cara mengonversi ImageFrames dan GpuBuffers

Kalkulator ImageFrameToGpuBufferCalculator dan GpuBufferToImageFrameCalculator mengonversi bolak-balik antara paket jenis ImageFrame dan GpuBuffer. ImageFrame merujuk pada data gambar dalam memori CPU dalam sejumlah format gambar bitmap. GpuBuffer merujuk pada data gambar dalam memori GPU. Anda dapat menemukan detail selengkapnya di bagian Konsep Framework GpuBuffer ke Pengonversi ImageFrame. Anda dapat melihat contohnya di:

Cara memvisualisasikan hasil persepsi

AnnotationOverlayCalculator memungkinkan hasil persepsi, seperti kotak pembatas, panah, dan oval, untuk ditumpangkan pada frame video yang sejajar dengan objek yang dikenali. Hasilnya dapat ditampilkan di jendela diagnostik saat dijalankan di workstation, atau dalam frame tekstur saat berjalan di perangkat. Anda dapat melihat contoh penggunaan AnnotationOverlayCalculator di:

Cara menjalankan kalkulator secara paralel

Dalam grafik kalkulator, MediaPipe secara rutin menjalankan node kalkulator terpisah secara paralel. MediaPipe mengelola kumpulan thread, dan menjalankan setiap kalkulator segera setelah thread tersedia dan semua inputnya sudah siap. Setiap instance kalkulator hanya dijalankan untuk satu set input dalam satu waktu, sehingga sebagian besar kalkulator hanya perlu kompatibel dengan thread dan tidak aman untuk thread.

Agar satu kalkulator dapat memproses beberapa input secara paralel, ada dua kemungkinan pendekatan:

  1. Tentukan beberapa node kalkulator dan kirim paket input ke semua node.
  2. Buat kalkulator yang aman untuk thread dan konfigurasi setelan max_in_flight-nya.

Pendekatan pertama dapat diikuti menggunakan kalkulator yang dirancang untuk mendistribusikan paket ke kalkulator lain, seperti RoundRobinDemuxCalculator. Satu RoundRobinDemuxCalculator dapat mendistribusikan paket berturut-turut ke beberapa node ScaleImageCalculator yang dikonfigurasi secara identik.

Pendekatan kedua memungkinkan hingga max_in_flight pemanggilan metode CalculatorBase::Process pada node kalkulator yang sama. Paket output dari CalculatorBase::Process otomatis diurutkan berdasarkan stempel waktu sebelum diteruskan ke kalkulator downstream.

Dengan salah satu pendekatan tersebut, Anda harus menyadari bahwa kalkulator yang berjalan secara paralel tidak dapat mempertahankan status internal dengan cara yang sama seperti kalkulator berurutan biasa.

Menghasilkan stempel waktu saat menggunakan NearbyInputStreamHandler

ImmediateInputStreamHandler mengirimkan setiap paket segera setelah tiba di aliran input. Akibatnya, LLM dapat mengirimkan paket dengan stempel waktu yang lebih tinggi dari satu aliran input sebelum mengirimkan paket dengan stempel waktu yang lebih rendah dari aliran input yang berbeda. Jika stempel waktu input ini digunakan untuk paket yang dikirim ke satu aliran output, aliran output tersebut akan melaporkan bahwa stempel waktu tidak meningkat secara monoton. Untuk mengatasi hal ini, kalkulator harus berhati-hati untuk mengeluarkan paket hanya setelah pemrosesan selesai untuk stempel waktunya. Hal ini dapat dilakukan dengan menunggu hingga paket input telah diterima dari semua inputstream untuk stempel waktu tersebut, atau dengan mengabaikan paket yang tiba dengan stempel waktu yang telah diproses.

Cara mengubah setelan saat runtime

Ada dua pendekatan utama untuk mengubah setelan grafik kalkulator saat aplikasi berjalan:

  1. Memulai ulang grafik kalkulator dengan CalculatorGraphConfig yang diubah.
  2. Mengirim opsi kalkulator baru melalui paket di aliran input grafik.

Pendekatan pertama memiliki keuntungan yaitu memanfaatkan alat pemrosesan CalculatorGraphConfig seperti "subgrafik". Pendekatan kedua memiliki keuntungan karena kalkulator dan paket aktif tetap beroperasi saat setelan berubah. Kontributor mediapipe saat ini sedang menyelidiki pendekatan alternatif untuk mencapai kedua keuntungan ini.

Cara memproses streaming input realtime

Framework mediapipe dapat digunakan untuk memproses aliran data baik secara online maupun offline. Untuk pemrosesan offline, paket dikirim ke grafik segera setelah kalkulator siap memproses paket tersebut. Untuk pemrosesan online, satu paket untuk setiap frame dimasukkan ke dalam grafik saat frame tersebut direkam.

Framework MediaPipe hanya mengharuskan paket berturut-turut diberi stempel waktu yang meningkat secara monoton. Berdasarkan konvensi, kalkulator dan grafik realtime menggunakan waktu perekaman atau waktu presentasi sebagai stempel waktu untuk setiap paket, dengan setiap stempel waktu mewakili mikrodetik sejak Jan/1/1970:00:00:00. Hal ini memungkinkan paket dari berbagai sumber diproses dalam urutan yang konsisten secara global.

Biasanya untuk pemrosesan offline, setiap paket input diproses dan pemrosesan akan berlanjut selama diperlukan. Untuk pemrosesan online, sering kali Anda perlu menghapus paket input untuk mengimbangi kedatangan frame data input. Jika input terlalu sering datang, teknik yang direkomendasikan untuk menghapus paket adalah dengan menggunakan kalkulator MediaPipe yang dirancang khusus untuk tujuan ini seperti FlowLimiterCalculator dan PacketClonerCalculator.

Untuk pemrosesan online, penting juga untuk segera menentukan kapan pemrosesan dapat dilanjutkan. MediaPipe mendukung hal ini dengan menerapkan batas stempel waktu di antara kalkulator. Batas stempel waktu menunjukkan interval stempel waktu yang tidak akan berisi paket input, dan memungkinkan kalkulator untuk segera memulai pemrosesan stempel waktu tersebut. Kalkulator yang dirancang untuk pemrosesan realtime harus menghitung batas stempel waktu dengan cermat untuk mulai memproses secepat mungkin. Misalnya, MakePairCalculator menggunakan SetOffset API untuk menyebarkan batas stempel waktu dari aliran input ke aliran output.

Dapatkah saya menjalankan MediaPipe di MS Windows?

Saat ini portabilitas MediaPipe mendukung Debian Linux, Ubuntu Linux, MacOS, Android, dan iOS. Inti dari framework MediaPipe adalah library C++ yang sesuai dengan standar C++11, sehingga relatif mudah untuk ditransfer ke platform tambahan.