Local Binary Pattern with NumPy

Dulu saya pernah menulis tentang menghitung fitur LBP (Local Binary Pattern) menggunakan OpenCV di python. Waktu itu interface opencv yang digunakan masih OpenCV 2.1 . Saya juga sempat membahas bagaimana mempercepat perhitungan LBP tersebut dengan kode inline C++ menggunakan scipy.weave. Kemarin saya penasaran, bagaimana caranya mempercepat operasi tersebut tanpa menggunakan inline code (yang membuat ada penundaan di awal karena harus melakukan kompilasi dan import native extension) dan hanya menggunakan apa yang tersedia di numpy (di versi-versi terakhir, python OpenCV menggunakan numpy array sebagai representasi citra).

Setelah mencari dokumentasi dari numpy, Akhirnya ketemu dua cara. Cara yang pertama masih lebih lambat (200-300ms) sedangkan cara kedua ternyata cukup cepat (100-150ms). Pada dasarnya adalah melakukan pengurangan menggunakan operator broadcast terhadap seluruh elemen array dengan pengurangnya adalah array tersebut yang digeser sesuai dengan posisi 8 tetangga tiap piksel sehingga total array yang perlu dibuat adalah 8 array. Dalam praktiknya, array tersebut dibuat dengan cara melakukan slicing.

Read More

Tracking Using Local Binary Pattern

Oke, terakhir kali saya membuat tulisan di blog ini adalah akhir april. Jeda yang cukup panjang untuk memulai membuat tulisan. Ada banyak hal yang terjadi pada saya selama masa jeda tersebut. Mulai dari kegiatan diklat prajabatan CPNS pada bulan mei, panggilan wawancara beasiswa dikti di bulan juni, hingga akhirnya per tanggal 1 Oktober ini saya resmi menjadi abdi negara yang bertugas di kampus.

#devfestjkt

Pada penghujung bulan september kemarin, saya mendapat kesempatan berbicara pada acara Google DevFest di Jakarta. Awalnya memang saya berniat mengisi acara Google DevFest yang di Bandung akhir minggu ini. Pada acara di jakarta saya diminta membahas tentang Computer Vision. Saya sendiri memang suka ngoprek citra untuk diutak-atik, tapi untuk menjadi pembicara tentang computer vision sepertinya kompetensi saya masih jauh dari seorang pakar. Oleh sebab itu dan karena yang meminta adalah rekan satu almamater, saya menyetujui dan mencoba tampil sebagai seorang enthusiast bukan sebagai expert.

Awalnya saya agak grogi karena tidak terbiasa berbicara membawakan materi teknik di hadapan orang yang banyak. Mengajar di kampus pun paling banyak mungkin hanya 100-an, itupun kuliah wajib. Kalau menjadi dosen pengganti di kuliah “Interpretasi dan Pengolahan Citra”, pesertanya jauh lebih sedikit lagi. Mungkin bisa dihitung dengan jari. OK, jari-jari di kedua tangan. 🙂 Di luar perkiraan, ternyata responnya cukup memberi semangat.

Nah, ceritanya di acara itu saya menampilkan beberapa video yang sudah diproses dengan menggunakan OpenCV sebagai demonstrasi hal-hal yang bisa dilakukan dengan menggunakan teknik-teknik computer vision. Nah, salah satu video yang saya tampilkan sebetulnya adalah pengembangan dari apa yang pernah saya tuliskan di sini. Karena keterbatasan waktu dan tema presentasi, di acara itu saya hanya sempat menampilkan videonya saja. Oleh sebab itu di tulisan ini saya akan bedah bagaimana hal tersebut dilakukan.

frame pertama

frame pertama

frame terakhir

frame terakhir


Read More

Mempercepat Operasi OpenCV di Python dengan scipy.weave

Tadi pagi saya mencoba menerapkan kode tentang LBP (Local Binary Pattern) dari yang tadinya hanya memroses satu citra menjadi memroses tiap frame pada video. Saya mencoba LBP lebih dahulu dibanding HOG karena berdasarkan kode yang dibuat sebelumnya, waktu eksekusi HOG memang lebih lambat dibanding LBP. Namun ternyata waktu eksekusi perhitungan fitur LBP cukup berat yang membuat frekuensi penggambarannya turun hingga 1 frame per detik! Setelah diidentifikasi ternyata perulangan bersarang (nested loop) di python sangat lambat walaupun sudah menggunakan generator function xrange. Akhirnya teringat kode yang dibuat oleh Tom Haines yang memanfaatkan modul weave dalam paket scipy yang mempermudah membuat kode inline dalam bahasa C++ yang akan dikompilasi pada saat run-time sehingga yang dijalankan adalah kode native tanpa harus membuat kode dalam file terpisah.

Di awal-awal mencoba dengan hanya bermodalkan google, sempat seringkali gagal compile. kegagalan pertama, scipy.weave akan mencari compiler MS Visual C++ sehingga saya harus memaksa untuk menggunakan gcc. Kesalahan berikutnya adalah gagal compile. Perjuangan masih berlanjut ketika kode sudah berhasil dikompilasi, tetapi Image tidak berubah padahal di dalam kode inline nilainya sudah berubah. Hal lain yang perlu dicatat adalah saya mulai menggunakan interface opencv versi 2 (cv2) yang sudah terintegrasi dengan numpy karena untuk melakukan manipulasi piksel dengan menggunakan scipy.weave lebih memudahkan untuk menggunakan representasi numpy.array dibandingkan dengan IplImage (ya iyalah, scipy kan pake numpy).

OK, Pembahasan akan saya mulai dengan penggunaan fungsi inline dari scipy.weave. Perhatikan kode berikut:

import cv, cv2
import numpy as np
from scipy.weave import inline

MASK = np.array([[0,-1],[1,-1],[1,0],[1,1],[0,1],[-1,-1],[-1,0],[-1,1]])
def calc_lbp(src, dst):
    code = r"""
        for (int y=1; y<Nsrc[0]-1; ++y){
            for (int x=1; x<Nsrc[1]-1; ++x){
                unsigned char px = SRC2(y,x);
                unsigned char n = 0;
                for(int m=0; m<8; ++m) 
                    if(SRC2(y+MASK2(m,1),x+MASK2(m,0))>px) 
                        n |= 1 << m;
                DST2(y,x) = n;
            }
        }
    """
    inline(code, ['src','dst','MASK'], compiler='gcc')
    return dst

Read More

Local Binary Pattern in OpenCV (Python)

Masih melanjutkan tulisan sebelumnya, sengaja disambung karena isinya sangat sederhana (gatal kalau tidak ditulis). LBP (Local Binary Pattern) atau Pola Biner Lokal merupakan salah satu informasi yang dapat dianalisis dari citra. Informasi LBP biasanya digunakan sebagai deksriptor dari tekstur. Salah satu kelebihan dari LBP adalah sifatnya yang invarian terhadap perubahan fotometri dari objek yang sama karena sifatnya yang merupakan ukuran intensitas relatif suatu piksel dengan intensitas piksel di sekitarnya.

Read More