Google Summer of Code 2013: Hello world!

Hello world! This is my first post about GSoC. I usually write post to this blog using Indonesian language so people who are from Indonesia can easily understand and also to contribute to probably technical corpora which is written in Indonesian. For the next posts that will be using gsoc2013 tag also will be written in English.

Now, a little bit of background won’t hurt.
This is my first experience in Google Summer of Code, applying and being accepted. My last status as student was 2010 which is almost three years ago. Now that I am back as student, I am eligible to apply as participant. Yay!

The project I am working on is under the organization of Computational Science and Engineering of Vienna University of Technology. Altough I am also a student in TU Wien, The Mentors are from different institute. My Mentors are from Department of Geodesy and Geoinformation. The project itself is implementing transformation algorithm for vertical datums. For me, this is something that is quite new. I did projects using spatial data before, but the inner working of the knowledge behind that was actually done by another person which background is geodesy. Well, the availability of libraries like PROJ.4, GDAL/OGR really helped me a lot back then. That’s why I thought this might be the way I can contribute back.
Read More

Iklan

Converting XML Schema to OWL in Python

Beberapa minggu terakhir saya dapat mainan baru setelah bermain-main dengan scraping (ini bukannya serius belajar malah main-main terus). Persoalannya adalah mengonversi skema data dari bentuk XML Schema ke Ontologi (dalam OWL). XML Schema adalah dokumen XML yang berisi spesifikasi komposisi sebuah dokumen XML.

XML Schema
Pada dasarnya dokumen XML Schema berisi tag-tag “element” yang mengacu pada tag di dokumen yang dispesifikasikan. Untuk mempermudah spesifikasi, jenis dari element ini dibagi menjadi dua tipe yaitu simpleType dan complexType. simpleType adalah tag yang hanya berisi data (numerik/string) sedangkan complexType adalah tipe tag yang memiliki paling tidak atribut tag atau child tag (tag di dalam tag). Komposisi tag di dalam tag dapat berupa komposisi sederhana seperti simpleType tapi memiliki atribut, hanya berisi tag, atau berisi campuran antara teks dengan tag (seperti pada tag body dalam HTML). simpleType dan complexType dapat dideklarasikan tersendiri dan diberi nama. Untuk alasan reusability, maka type dibuat memiliki sifat inheritance dan polymorphism. yaitu suatu tipe dapat dideklarasikan sebagai turunan dari tipe lain yang lalu dispesialisasi/dibatasi atau diperluas.

Web Ontology Language (OWL)
Ontologi merupakan deskripsi formal pengetahuan tentang konsep2 dan hubungan antar konsep. Pada kasus pendefinisian skema basis data, hal yang biasanya dilakukan adalah membuat representasi konseptual (conceptual data model) dari pengetahuan yang dimiliki oleh pengembang sistem. Adanya formalisasi pengetahuan dalam bentuk ontologi bertujuan agar mesin juga dapat ‘mengerti’ sehingga proses integrasi data dapat berlangsung secara otomatis.

Sekian dulu bahasan abstraknya, selanjutnya adalah bagaimana menyelesaikan persoaln konversi XML Schema ke OWL. Sayangnya saya tidak menemukan ada tool konversi yang ditulis dalam python sehingga saya membuat dari awal. Saya menggunakan dua pustaka pembantu yaitu lxml untuk mengurai data dari dokumen XML dan RDFLib untuk membangkitkan ontologi. Sayangnya RDFLib belum memiliki serializer untuk OWL sehingga saya tidak bisa menggunakan format OWL (XML) sebagai keluaran dan sebagai gantinya saya menggunakan format Turtle yang sepertinya juga lebih mudah dibaca oleh manusia.

Sebetulnya makalah yang berisi cara melakukan konversi ini lumayan banyak jadi saya pakai yang paling banyak dikutip dan posisi teratas dari pencarian di google scholar saja:

Bohring, Hannes, and Sören Auer. “Mapping xml to owl ontologies.” Leipziger Informatik-Tage 72 (2005): 147-156.

Read More

Web scraping dengan Python : cuaca kota Wina

Ketika saya masih di Indonesia, Saya jarang sekali memeriksa temperatur udara. Setelah sampai Wina jadi sering memeriksa temperatur karena penasaran dengan temperatur yang terukur di cuaca musim semi tetapi terasa masih dingin dan masih bersalju. Kebetulan akhir-akhir ini sedang sering bermain dengan scraping (ekstraksi data dari dokumen web), akhirnya pada suatu malam sebelum tidur saya iseng membuat skrip untuk mendapat cuaca saat ini di kota Wina.

Saya menggunakan library beautifulsoup untuk mengurai isi dokumen HTML yang kemudian bisa diekstrak bagian tertentu (dalam hal ini adalah elemen DIV yang mencakup data temperatur). Elemen ini diketahui dari mengaktifkan panel “Inspect Element” di peramban Google Chrome (atau bisa juga dengan menampilkan kode sumber dari halaman aktif di peramban lain).

from urllib2 import urlopen
from BeautifulSoup import BeautifulSoup as BS

temps = [float(tag.string.replace(u"\xb0", '')) for tag in BS(urlopen("http://www.wetter.at/wetter/oesterreich/wien").read()).findAll("div", {"class": "temp"})]
if len(temps)>0: print "%0.2f C" % (sum(temps)/len(temps))

Data temperatur yang diberikan halaman tersebut merupakan data pengukuran temperatur di beberapa distrik kota. Karena saya hanya perlu tahu satu data saja sebagai gambaran umum temperatur kota maka saya menghitung rata-rata dari data tersebut.

Oya, tulisan ini juga sekalian untuk mencoba aggregator blog dari komunitas Python Indonesia. tampil tidak yaa..? tampil tidak yaa…?

7 Habits of Highly Disruptive People

*sedang ikut pelatihan 7 Habits of Highly Effective People yang diselenggarakan oleh kampus untuk para dosen trus iseng bikin improvisasi untuk topik lain*

Habit 1: Be Provocative
Habit 2: Begin with bending the mind
Habit 3: Put first traps’ first
Habit 4: Think Lean and Mean
Habit 5: Seek first to be concealed, and then to conquer
Habit 6: Make surprise!
Habit 7: Tighten the claw

Poisson Image Editing (revised)

Tulisan ini melengkapi tulisan sebelumnya yang berjudul serupa. Waktu itu hasilnya masih kurang memuaskan dan sepertinya implementasinya masih ada yang salah. Akhirnya saya coba membuat implementasi ulang dengan Delphi, mulai dari pendefinisian persoalannya pada ruang berdimensi 1 secara diskret.

Sederhananya, misalkan Saya punya fungsi 1D yang terdefinisi oleh nilai di posisi awal f(a) dan akhir f(b) sementara nilai diantara selang (a,b) tidak diketahui. Kalau saya berasumsi bahwa turunan keduanya adalah konstan 0, maka interpolasi yang dibuat antara titik a dan b adalah sebuah garis lurus seperti gambar berikut.

interpolasi dengan turunan kedua = 0

interpolasi dengan turunan kedua = 0


Kalau fungsi turunan keduanya saya buat konstan positif atau negatif maka interpolasinya akan menjadi melengkung.

interpolasi dengan turunan kedua konstan positif ( = 2 )

interpolasi dengan turunan kedua konstan negatif ( = -2 )

Ide dari poisson image editing adalah dengan menggunakan informasi dari turunan kedua citra sumber untuk mengarahkan interpolasi ini pada citra tujuan.

interpolasi dengan turunan kedua pengarah berasal dari turunan kedua fungsi lain

Read More

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