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:
- Tentukan beberapa node kalkulator dan kirim paket input ke semua node.
- 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:
- Memulai ulang grafik kalkulator dengan
CalculatorGraphConfig
yang diubah. - 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.