GPU Raspberry Pi

Salah satu kelebihan Raspberry Pi (RPI) dibandingkan Single Board Computer (SBC) lain adalah: harganya relatif murah dan memiliki GPU yang terdokumentasi resmi dan bisa dimanfaatkan dengan berbagai API low level. Beberapa SBC lain ada yang harganya lebih murah (misalnya Orange Pi) tapi dokumentasinya kurang, dan beberapa yang lain lebih powerful (misalnya NVidia Jetson) dengan dokumentasi yang cukup baik dari produsen (tapi masih kurang dari komunitas) tapi harganya 10x lipat dari RPi 3.

GPU Raspberry Pi cukup powerful, dan bisa melakukan beberapa hal menarik misalnya: tunelling dari kamera (dengan konektor CSI) langsung ke layar, colorspace conversion, video/image encoding and decoding,  resizing, dan overlay. Kita juga bisa meminta agar data dari kamera langsung dijadikan texture untuk OpenGL ES.

Secara praktis tunnelling artinya satu komponen ke komponen lain bisa bekerja langsung tanpa buffer. Contoh nyatanya begini: kita bisa membuat aplikasi yang kelihatan smooth karena data dari kamera tampil langsung di layar dengan kecepatan tinggi (30 fps) tanpa memakai CPU sama sekali. Sementara di latar belakang kita bisa mengambil gambar, memproses (misalnya face detection) dan menampilkan hasilnya.

Proses ini membypass windowing system, jadi bisa jalan bahkan tanpa X Window (mode teks sekalipun).

Video dari kamera bisa ditampilkan di mode teks

Fitur texture OpenGL ES artinya kita bisa menampilkan gambar kamera atau video (dari file atau jaringan) langsung di permukaan  misalnya kubus atau teko. Selain itu kita bisa menggunakan pixel shader untuk memproses data tanpa memakai CPU, contohnya membuat filter kamera secara real time, atau bahkan melakukan preprocessing untuk algoritma machine learning. Data yang sudah diproses bisa dibaca dan diproses lebih lanjut di CPU dengan glReadPixels.

Video dimainkan di atas kubus

Secara praktis fitur encoding video memungkinkan kita melakukan streaming kamera ke jaringan dengan memakai CPU yang minimal atau sekedar mengencode satu frame menjadi JPG/PNG. Fitur decoding memungkinkan kita memainkan (play) video 1080p dengan memakai CPU yang minimal dan mulus tanpa patah-patah.

Saya pernah melihat demo tidak resmi Nvidia Jetson di sebuah acara hacking (demo dari panitia). Demonya sangat sederhana, mendeteksi wajah orang-orang yang lewat. Tapi sayangnya demonya memakai kamera USB. Pemrosesannya kira-kira begini:

while true:
image = Getimage()
gray = ConvertToGrayScale(image)
faces = FindFaces(gray)
DrawBoxes(faces, image);
Display(image)

Gambarnya kelihatan patah-patah. Tidak menunjukkan kemampuan processing yang bagus dari Nvidia Jetson. Sebagai catatan: ada banyak opsi kamera untuk NVidia Jetson tapi yang kualitasnya bagus harganya relatif mahal. Demo serupa dengan kamera RPI dan GPU akan kelihatan lebih smooth dan harganya akan jauh lebih murah (10x lebih murah). Dengan RPI kita bisa mensetup seperti ini:

  1. Tampilkan preview langsung dari kamera ke layar.
  2. Di sisi CPU: grab satu frame dan proses frame tersebut.
  3. Kita bisa mensetup agar frame yang ditangkap menggunakan colorspace YUV 420, dengan mengambil komponen Y (luma) nya saya maka kita tidak perlu melakukan konversi warna ke grayscale.
  4. Gunakan fitur image overlay untuk menunjukkan di mana wajahnya
Layout memori YUV420. Mengambil komponen Y cukup dilakukan dengan mengambil 2/3 (66%) byte pertama dari  stream data.

Kelebihan Raspberry Pi adalah: didukung banyak pihak sehingga mudah menemukan aksesori tambahan jika diperlukan. Misalnya jika CPU kurang cepat untuk machine learning, processing bisa dioffload ke Intel Movidius USB stick yang bisa dipakai di Raspberry Pi.

Video dirender di permukaan teko

Kelemahan dari GPU raspberry pi adalah: dibutuhkan pemahaman yang baik berbagai API yang ada. Sebagian APInya sangat spesifik raspberry misalnya dispmanx. Sebagian lagi standar, misalnya OpenMAX (OMX), Open GL ES, dan OpenVG.

Sebagian lagi adalah API spesifik yang tujuannya mempermudah API low level, misalnya MMAL (multimedia abstraction layer) untuk membungkus OpenMAX. Meskipun OpenMAX merupakan standar terbuka tapi sangat kompleks dan  penamaan komponen pada OpenMAX sifatnya vendor specific.  Ada juga beberapa API tanpa nama untuk memudahkan pemakaian OpenVG.

Jika kita memakai distribusi default (Raspbian) maka berbagai contoh spesifik Raspberry Pi bisa dilihat di /opt/vc/src . Source code untuk berbagai aplikasi (misalnya raspivid) ada di repository userland. Contoh pemakaian dispmanx ada di github. Tadinya ada guide gratis memakai beberapa API Raspberry Pi, tapi kemudian dijadikan buku (Raspberry Pi GPU Audio Video Programming).  Sepertinya demi memenuhi jumlah halaman minimal, bukunya malah terlalu banyak membahas OpenGL ES.

Sebenarnya kita juga bisa memprogram langsung GPU RPI dalam assembly  atau memakai beberapa library yang ada. Dengan cara ini kita bisa melakukan processing yang non grafik misalnya FFT. Ini berguna untuk RPI versi pertama, tapi sekarang ini dengan instruction set NEON di RPI2 dan 3, kita bisa mendapatkan performance yang sama dengan NEON.

Memprogram GPU RPI ini tidak terlalu sulit tapi juga tidak terlalu mudah. Dokumentasinya minim, walaupun ada beberapa contoh program sederhana tapi kurang menjelaskan batasan GPU. Kebanyakan pertanyaan dan jawaban ada di forum Raspberry Pi. Emulasi APInya saat ini tidak ada jadi  perlu memprogram langsung di Raspberry PInya. Ini juga berarti bahwa debugging tidak mudah dilakukan.

Saya menuliskan ini karena sedang mengerjakan sebuah proyek yang memakai fitur low level RPI, jadi saat ini tidak bisa sharing kode. Saya juga belum mengeksplorasi semua API-nya, tapi saat ini sudah memiliki gambaran cukup baik dan sudah bisa melakukan apa yang saya targetkan. Harapannya posting ini bisa membuka mata mengenai berbagai fitur GPU RPI yang jika dimanfaatkan bisa dipakai untuk membuat aplikasi yang lebih cepat atau lebih smooth.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.