My supervisor said the accuracy will be better if I separate each of the marker network, so now I dissect each of the XML by its letter to prepare it for training.
What if the accuracy still lame? Oh I don't know, maybe I'll die :|
...
uh... no, it's new year, d'oh.... But I'll severely confused
Showing posts with label POME. Show all posts
Showing posts with label POME. Show all posts
Thursday, January 1, 2015
Tuesday, December 2, 2014
Error kalau kegedean
Jadi kalau gambarnya kegedean jadinya error. Errornya aneh, bagian bawah layar tiba-tiba flicker jadi warna merah dan kemudian si aplikasi tertutup. Kayaknya masalah memori yang nggak cukup sih, jadinya segitu deh. Huhu.
Jadi yang awalnya 576x768 sekarang diresize jadi 384x512
BTW untuk klasifikasnya jelek banget. Hiiiy....
Jadi yang awalnya 576x768 sekarang diresize jadi 384x512
BTW untuk klasifikasnya jelek banget. Hiiiy....
Wednesday, October 22, 2014
Progress Skripsi: Metode Thresholding Sauvola
Di *UHUK* skripsi yang saya buat, saya perlu memproses gambar untuk dipisah menjadi foreground dan background. Dalam kasus saya yang perlu diproses adalah gambar dokumen form. Foregroundnya adalah tulisan dan backgroundnya adalah warna putih dari kertas. Metode ini disebut sebagai thresholding. Ternyata thresholdingnya sendiri banyak metode-metodenya loh! Salah satu metode yang bikin saya kagum namanya metode Sauvola.
Umumnya gambar punya warna-warna yang banyak. Dalam image processing warna-warna ini biasanya dipisah dalam channel-channel yang berbeda. Contohnya yang paling sering saya pakai gambar dipisah jadi 3 channel yaitu RGB( Red, Green, dan Blue).
Di channel-channel ini terdapat nilai keabuan masing-masing. Nilai keabuan ini memiliki rentang dari 0-255. Representasinya bisa dibentuk jadi matriks yang punya masing-masing nilai keabuan di tiap elemen. Kalau pakai RGB jadinya satu piksel ada 3 nilai keabuan. Secara umum matriksnya bisa direpresentasikan berdimensi mxnxo.
Gambar dengan nilai RGB ini juga bisa dikonversi jadi gambar abu-abu saja (yang sering kita kenal sebagai grayscale) dengan aturan gini:
pixel_abu = pixel_r*0.299 + pixel_g*0.587 + pixel_b*0.114
Kalau dilihat sekilas sih bagus-bagus aja ya, tapi itu intensitasnya berbeda-beda. Bagian kertas yang dekat dengan cahaya lebih terang dibandingkan dengan bawah. Nah, inilah kelemahan dari metode Otsu.
Akhirnya saya googling lagi dan ketemu dengan beragam keyword, antara lain threshold, local thresholding, dan adaptive thresholding.
Keabuan
Mari kita ngebahas keabuan dulu.Umumnya gambar punya warna-warna yang banyak. Dalam image processing warna-warna ini biasanya dipisah dalam channel-channel yang berbeda. Contohnya yang paling sering saya pakai gambar dipisah jadi 3 channel yaitu RGB( Red, Green, dan Blue).
Di channel-channel ini terdapat nilai keabuan masing-masing. Nilai keabuan ini memiliki rentang dari 0-255. Representasinya bisa dibentuk jadi matriks yang punya masing-masing nilai keabuan di tiap elemen. Kalau pakai RGB jadinya satu piksel ada 3 nilai keabuan. Secara umum matriksnya bisa direpresentasikan berdimensi mxnxo.
Gambar dengan nilai RGB ini juga bisa dikonversi jadi gambar abu-abu saja (yang sering kita kenal sebagai grayscale) dengan aturan gini:
pixel_abu = pixel_r*0.299 + pixel_g*0.587 + pixel_b*0.114
Thresholding
Nah, kalau konversi grayscale mengubah dari gambar RGB jadi nilai keabuan saja, thresholding membuatnya lebih sederhana lagi. Metode thresholding membuat gambar dengan nilai keabuan menjadi gambar biner, yakni hitam dan putih saja.
Metode thresholding dibagi dua berdasarkan cakupan nilai thresholdnya. Global threshold dan local threshold. Kalau global threshold menggunakan nilai threshold untuk semua gambar, local threshold memiliki nilai threshold yang berbeda-beda di bagian-bagian gambarnya.
Nah, coba kita lihat perbedaannya masing-masing ya.
Metode Otsu
Salah satu metode global threshold yang umum dipakai adalah metode Otsu. Ide dasar dari thresholding ini adalah terdapat dua kelompok nilai keabuan. Nah, metode Otsu memberikan nilai threshold untuk memisahkan nilai tersebut.
Yang mau tahu lebih detilnya metode Otsu bisa lihat di wikipedia
Kelebihan dan Kekurangan Metode Otsu
Kalau cahayanya cukup merata, metode Otsu ini cukup baik loh untuk dipakai.
Sayangnya cahaya yang ada di citra tidak semulus paha Cherry Belle *halah*. Uh... maksudnya cahaya yang ada di kertas berbeda-beda intensitasnya. Misalnya kita punya gambar yang kayak gini
![]() |
| bagian yang dithreshold menjadi hitam seperti ini karena sebaran cahaya yang tidak merata |
Metode... Uh... Galau...
Hal ini membuat saya galau berhari-hari. Saya bingung. Saya lelah. Saya hina. Aah. Aah.
Awalnya saya mencoba agar cahaya yang didapatkan merata. Caranya saya membuat instrumen sebuah kotak dilapisi kertas putih agar cahaya membias dan disinari dengan lampu emergency. Tapi ternyata bahkan dengan instrumen seperti ini mendapatkan gambar dengan cahaya yang merata tetap susah. Lampu yang saya gunakan tetap saja memberikan cahaya yang lebih terang di bagian depan. Kalau lampunya diletakkan di atas (misalnya digantung) nanti pas pakai kamera handphone cahayanya kehalangan handphone dong? Hmmm...
![]() |
| si kotak bercahaya |
Dari kesimpulan saya, Otsu benar-benar memisahkan gambar menjadi dua kelas relatif berdasarkan gambar. Jadi walaupun gambarnya terlihat cukup terang bagian gambar yang lebih gelap akan dinyatakan sebagai background *hiks*. Nah lucunya kalau gambarnya tidak terlalu terang dan tidak terlalu gelap metode Otsu sukses untuk memisahkannya menjadi dua bagian.
![]() |
| Gambar yang cukup abu-abu ternyata bisa di threshold. Wah. |
Local Thresholding
Ternyata permasalahan dengan cahaya yang tidak merata adalah hal yang umum di thresholding. Banyak penelitian yang mengulas hal ini. Sub topik bidang ini dinamakan sebagai local thresholding. Kenapa local? Karena nilai threshold berbeda-beda di seluruh bagian gambar.
Ada teknik-teknik keren seperti Chow-Kaneko yang memotong-motong gambar dan diberikan thresholding dengan Otsu method pada masing-masing gambar, ada juga yang nyari rata-rata kebuan di sekeliling tiap-tiap pixel. Salah satu penelitian yang hasilnya menurut saya cukup bagus untuk digunakan di skripsi saya adalah metode Sauvola.
Metode Sauvola
Metode Sauvola sebenarnya pengembangan dari metode Niblack. Katanya Sauvola, metode Niblack itu dirumuskan gini:
T = m + k*s
dimana T itu nilai thresholdnya, m itu rata-rata keabuan, k konstanta, dan s itu standar deviasi.
Alamak, ternyata saya banyak ketemu statistika di image processing.
Eh, balik lagi. Jadi kata Sauvola nilai metode Niblack kurang memuaskan kalau gambar yang di threshold memiliki tekstur yang terang. Sauvola kemudian memodifikasi metode Niblack menjadi seperti ini:
T(x,y) = m(x,y) * (1+( k*( (s(x,y)/R)-1) ) );
dimana R adalah "dynamic range standard deviation". Di penelitiannya Sauvola nilai R itu paling bagus 128 dan k-nya 0.5;
Algoritma Sauvola
Heh, itu semua cuma rumus geje woy. Cara pakainya gimana?
Jadi algortima metode Sauvola tuh gini
- Untuk masing-masing piksel (Loop i dan j) telusuri sejauh n window, kita sebut piksel ini sebagai P_threshold. Hal ini dlakukan agar beban komputasi kecil. Besar n bebas. Semakin kecil n nya maka gambar yang memiliki keabuan merata akan dibuat menjadi background.
- Cari m dari sekeliling P_threshold.
- Cari s dari sekeliling P_threshold.
- Tentukan besar T dan simpan di matriks_threshold.
- end for (i dan j)!
- Untuk masing-masing piksel (Loop i dan j) telusuri lagi sejauh n window, kita sebut piksel ini sebagai P_abu.
- Untuk masing-masing piksel (Loop ii dan jj) dari i hingga n dan j hingga n (kita sebut piksel ini sebagai P_window).
- Cek apakah indeks i dan j tidak memiliki sisa bagi dengan n. Jika ada berarti merupakan piksel acuan. Tentukan keabuannya dari indeks di matriks_threshold. Tentukan nilai piksel berdasarkan T.
- Jika bukan merupakan piksel acuan kita cari rata-rata thresholdnya dengan rumus ini:
T = (matriks_threshold[i][j]+ //titik kiri atas
matriks_threshold[i][j+n]+ //titik kanan atas
matriks_threshold[i+n][j]+ //titik kiri bawah
matriks_threshold[i+n][j+n] //titik kanan bawah
)/4;
Tentukan nilai piksel berdasarkan T.
- end for (i dan j)!
- end for (ii dan jj)!
Untuk penelitian saya menggunakan n = 30, R = 128, dan k = 0.3. Hasilnya cukup memuaskan loh
![]() |
| gambar yang sebelumnya jelek kalau di threshold dengan metode Otsu ternyata dengan metode Sauvola menghasilkan hasil yang bagus |
Bahkan yang cukup ekstrim, yaitu gambar yang diambil menggunakan lampu blitz. Permasalahan di gambar ini adalah cahaya berada di tengah dan intensitasnya berubah menjadi gelap semakin ke arah luar.
![]() |
| Form yang diambil dengan lampu blitz |
![]() |
| menggunakan metode Sauvola |
![]() |
| menggunakan metode Otsu |
Keep fighting!
Yaay. Nah sekarang udahan buat image processingnya. Sekarang mari kita ulik lebih lanjut di Neural Networknya. Yuhu!
p.s: Kalau mau kasih semangat boleh loh komen-komen disini, huehue.
Tuesday, October 7, 2014
Progress Skripsi: Homography
Kali ini pakai bahasa Indonesia aja ya, the scientific english is still too hard for me, haha *padahal males*.
Di postingan sebelumnya saya membahas sedikit tentang homography, kali ini saya coba elaborasi sedikit ya.
\[\overrightarrow{q} = H \overrightarrow{p} \]
dimana \(H\) adalah matrix dengan dimensi 3x3. Pemetaan tersebut dinamakan homography.
Intinya adalah terdapat sebuah matrix berukuran 3x3 (homograph matrix) yang bisa memetakan dari satu titik awal ke titik akhir. Homography berguna bagi proses image rectification (rektifikasi gambar), yakni proses koreksi spasial pada citra.
Menurut pak David Kriegman di mata kuliah Computer Vision 1 penjelasan homography adalah sebagai berikut:
persamaan homography dapat dinyatakan sebagai
\[X_2 = HX_1\]
Jika dituliskan elemen per elemen, persamaan homography dapat kita tuliskan sebagai berikut
\[
\begin{bmatrix}
x_2 \\
y_2 \\
z_2 \\
\end{bmatrix}
=
\begin{bmatrix}
H_{11} & H_{12} & H_{13} \\
H_{21} & H_{22} & H_{23} \\
H_{31} & H_{32} & H_{33} \\
\end{bmatrix}
\begin{bmatrix}
x_1 \\
y_1 \\
z_1 \\
\end{bmatrix}
\]
Pada ruang dua dimensi tidak terdapat kordinat Z, maka nilai x dan y dapat dinyatakan sebagai \(x'_2 = x_2/z_2\) , \(y'_2 = y_2/z_2\), dan \(z = 1\). Dari justifikasi ini nilai \(x'_2\) dan \(z'_2\) dapat dinyatakan sebagai berikut
\[ x'_{2} = \frac{H_{11}x_{1} + H_{12}y_{1} + H_{13}z_{1}}{H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}} \]
\[ y'_2 = \frac{H_{21}x_{1} + H_{22}y_{1} + H_{23}z_{1}}{H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}} \]
atau dapat ditulis sebagai
\[ x'_{2}(H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}) = H_{11}x_{1} + H_{12}y_{1} + H_{13}z_{1} \]
\[ y'_{2}(H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}) = H_{21}x_{1} + H_{22}y_{1} + H_{23}z_{1} \]
dan dikelompokkan menjadi persamaan linear berikut
\[ H_{11}x_{1} + H_{12}y_{1} + H_{13}z_{1} - x'_{2}(H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}) = 0 \]
\[ H_{21}x_{1} + H_{22}y_{1} + H_{23}z_{1} - y'_{2}(H_{31}x_{1} + H_{32}y_{1} + H_{33}z_1) = 0 \]
Persamaan tersebut dapat dinyatakan kembali sebagai berikut
\[a^T_xh = 0\]
\[a^T_yh = 0\]
dimana
\[h = (H_{11},H_{22},H_{23},H_{31},H_{32},H_{33})^T\]
\[a_x = (x_{1},y_{1},1,0,0,0,-x'_{2}x_{1},-x'_{2}y_{1},-x'_{2})^T\]
\[a_x = (0,0,0,x_{1},y_{1},1,-y'_{2}x_{1},-y'_{2}y_{1},-y'_{2})^T\]
Dengan persamaan tersebut kita dapat menyatakan persamaan linear untuk permasalahan homography sebagai:
\[Ah = 0\]
dimana
\[A = \begin{pmatrix}
a^T_x1\\
a^T_y1\\
.\\
.\\
.\\
a^T_xn\\
a^T_yn
\end{pmatrix}
\]
matriks \[A\] ini dinamakan matriks estimasi.
Oke, kita bisa masukkin variabel-variabel tadi ke \(Ah = 0\). Terus bagaimana cara menentukan nilai H nya? Untuk menyelesaikannya kamu bisa menggunakan Singular Value Decomposition
\[A_{mn} = U_{mm} S_{mn} V^T_{nn}\]
Pada penjelasan oleh pak David Kriegman disebutkan pula bahwa nilai \(V\) memiliki hubungan dengan nilai eigenvector dari \(A^TA\). Penjelasannya saya masih belum begitu paham kenapa, tapi sejauh yang saya tangkap hal ini dibuktikan dengan pendekatan squared error. Penjelasan beliau bisa dibaca di halaman 2 dan 3.
Hubungan \(V\) dan nilai eigenvector dari \(A^TA\) tersebut memungkinkan penghitungan diringkas dengan mencari nilai eigenvalue terkecil dari eigenvector \(A^TA\) dan mengambil kolom dari \(V\) berdasarkan posisi nilai eigenvalue tersebut. Kode implementasinya bisa kamu lihat di project The-Imp berikut.
Seperti diketahui, rumus yang kita ketahui adalah \(X_2 = HX_1\). Jika kita menggunakan rumus ini berarti kita memetakan dari \(X_1\) ke \(X_2\), padahal pertanyaannya adalah
"saat di sebuah titik pada \(x_2\), dimanakah titik \(x_1\) yang dikalikan matriks \(H\)?"
Dari pertanyaan tersebut padahal nilai yang diketahui adalah \(H\) yang merupakan matriks homograph dan \(X_2\) yang merupakan setiap titik akhir yang diinginkan. Jika tetap dilakukan dengan rumus awal maka akan terjadi pembulatan yang akhirnya terbentuk bagian yang kosong.
Berarti apa yang harus kita lakukan? Yak! Invers!
\[X_2H^{-1} = X_1\]
Saya kemudian mengimplementasikan rumus ini ke program. Matriks estimasi yang saya inputkan adalah titik kontrol pada form. Dan hasilnya cukup memuaskan *fyuuuh*. Akhirnya euy, semingguan belajar tentang homography *jadi curhat*.
Oh iya, btw saya pakai library Apache Commons Math untuk proses matriks seperti transpose, invers, dan mencari nilai eigen. Kok gitu? Otak saya masih belum cukup professor, heheh.
Oke deh. Sekarang kembali ke skripsi. Saya menginginkan untuk melakukan ekstraksi di form seperti ini.
Gambar di atas adalah contoh yang bagus untuk jenis form yang memiliki kasus kemiringan dan proyeksi.
Seperti dilihat angka 9,8,7, 6, dan 5 cukup terpotong
Namun permasalahannya adalah metode homography tidak membuat titik-titik kontrol sejajar seperti yang saya harapkan. Artinya jika form terlalu miring maka tidak dapat dideteksi.
Ya atuhlah... pan skripsi teh eksperimen, kumaha ih.
Jadi kemarin saya bimbingan dengan dosen pembimbing saya. Karena saya khawatir dengan program saya yang belum punya arahan yang pasti maka saya menunjukkan mockup tampilan program yang akan dibuat. Ternyata lumayan dapat banyak pencerahan, salah satunya adalah
"Kerjakan diagram dulu baru ngoding"
*uhuk*
Ini penyakit yang sudah terlalu dibiasakan. Ngoding dulu akhirnya acakadut. Berarti sekarang saya mengerjakan doktek (dokumen teknis) dulu sembari revisi bab 1.
Di postingan sebelumnya saya membahas sedikit tentang homography, kali ini saya coba elaborasi sedikit ya.
Homo-what?
Pemetaan antara vektor \(\overrightarrow{p}\) menuju \(\overrightarrow{q}\) dapat dinyatakan dengan\[\overrightarrow{q} = H \overrightarrow{p} \]
dimana \(H\) adalah matrix dengan dimensi 3x3. Pemetaan tersebut dinamakan homography.
Intinya adalah terdapat sebuah matrix berukuran 3x3 (homograph matrix) yang bisa memetakan dari satu titik awal ke titik akhir. Homography berguna bagi proses image rectification (rektifikasi gambar), yakni proses koreksi spasial pada citra.
Menurut pak David Kriegman di mata kuliah Computer Vision 1 penjelasan homography adalah sebagai berikut:
persamaan homography dapat dinyatakan sebagai
\[X_2 = HX_1\]
Jika dituliskan elemen per elemen, persamaan homography dapat kita tuliskan sebagai berikut
\[
\begin{bmatrix}
x_2 \\
y_2 \\
z_2 \\
\end{bmatrix}
=
\begin{bmatrix}
H_{11} & H_{12} & H_{13} \\
H_{21} & H_{22} & H_{23} \\
H_{31} & H_{32} & H_{33} \\
\end{bmatrix}
\begin{bmatrix}
x_1 \\
y_1 \\
z_1 \\
\end{bmatrix}
\]
Pada ruang dua dimensi tidak terdapat kordinat Z, maka nilai x dan y dapat dinyatakan sebagai \(x'_2 = x_2/z_2\) , \(y'_2 = y_2/z_2\), dan \(z = 1\). Dari justifikasi ini nilai \(x'_2\) dan \(z'_2\) dapat dinyatakan sebagai berikut
\[ x'_{2} = \frac{H_{11}x_{1} + H_{12}y_{1} + H_{13}z_{1}}{H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}} \]
\[ y'_2 = \frac{H_{21}x_{1} + H_{22}y_{1} + H_{23}z_{1}}{H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}} \]
atau dapat ditulis sebagai
\[ x'_{2}(H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}) = H_{11}x_{1} + H_{12}y_{1} + H_{13}z_{1} \]
\[ y'_{2}(H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}) = H_{21}x_{1} + H_{22}y_{1} + H_{23}z_{1} \]
dan dikelompokkan menjadi persamaan linear berikut
\[ H_{11}x_{1} + H_{12}y_{1} + H_{13}z_{1} - x'_{2}(H_{31}x_{1} + H_{32}y_{1} + H_{33}z_{1}) = 0 \]
\[ H_{21}x_{1} + H_{22}y_{1} + H_{23}z_{1} - y'_{2}(H_{31}x_{1} + H_{32}y_{1} + H_{33}z_1) = 0 \]
Persamaan tersebut dapat dinyatakan kembali sebagai berikut
\[a^T_xh = 0\]
\[a^T_yh = 0\]
dimana
\[h = (H_{11},H_{22},H_{23},H_{31},H_{32},H_{33})^T\]
\[a_x = (x_{1},y_{1},1,0,0,0,-x'_{2}x_{1},-x'_{2}y_{1},-x'_{2})^T\]
\[a_x = (0,0,0,x_{1},y_{1},1,-y'_{2}x_{1},-y'_{2}y_{1},-y'_{2})^T\]
Dengan persamaan tersebut kita dapat menyatakan persamaan linear untuk permasalahan homography sebagai:
\[Ah = 0\]
dimana
\[A = \begin{pmatrix}
a^T_x1\\
a^T_y1\\
.\\
.\\
.\\
a^T_xn\\
a^T_yn
\end{pmatrix}
\]
matriks \[A\] ini dinamakan matriks estimasi.
Oke, kita bisa masukkin variabel-variabel tadi ke \(Ah = 0\). Terus bagaimana cara menentukan nilai H nya? Untuk menyelesaikannya kamu bisa menggunakan Singular Value Decomposition
Singular Value Decomposition
Sejauh yang saya tangkap dari pembahasan di MIT OCW dan tutorial SVD dari pak Kirk Baker, inti dari SVD adalah sebuah proses untuk memecah sebuah matriks menjadi 3 matriks. Rumusan umumnya adalah sebagai berikut
\[A_{mn} = U_{mm} S_{mn} V^T_{nn}\]
Tutorial yang sangat lengkap dan jelas mengenai SVD ada di tutorialnya pak Kirk Baker. Bagi rekan-rekan yang ingin belajar lebih lengkap tentang SVD silahkan mengunjungi tutorial tersebut.
\(S\) merupakan matriks diagonal. Nilai \(S_{mn}\) yang paling kecil akan berkorespondensi dengan salah satu kolom pada matriks \(V^T\). Kolom tersebut berisi nilai-nilai \(H\) yang kita inginkan sebagai matriks homograph.
Pada penjelasan oleh pak David Kriegman disebutkan pula bahwa nilai \(V\) memiliki hubungan dengan nilai eigenvector dari \(A^TA\). Penjelasannya saya masih belum begitu paham kenapa, tapi sejauh yang saya tangkap hal ini dibuktikan dengan pendekatan squared error. Penjelasan beliau bisa dibaca di halaman 2 dan 3.
Hubungan \(V\) dan nilai eigenvector dari \(A^TA\) tersebut memungkinkan penghitungan diringkas dengan mencari nilai eigenvalue terkecil dari eigenvector \(A^TA\) dan mengambil kolom dari \(V\) berdasarkan posisi nilai eigenvalue tersebut. Kode implementasinya bisa kamu lihat di project The-Imp berikut.
Yang saya kerjakan
Saya pun mengimplementasikan homography tersebut ke program ekstraksi huruf-huruf. Saya pun menemukan masalah.Seperti diketahui, rumus yang kita ketahui adalah \(X_2 = HX_1\). Jika kita menggunakan rumus ini berarti kita memetakan dari \(X_1\) ke \(X_2\), padahal pertanyaannya adalah
"saat di sebuah titik pada \(x_2\), dimanakah titik \(x_1\) yang dikalikan matriks \(H\)?"
Dari pertanyaan tersebut padahal nilai yang diketahui adalah \(H\) yang merupakan matriks homograph dan \(X_2\) yang merupakan setiap titik akhir yang diinginkan. Jika tetap dilakukan dengan rumus awal maka akan terjadi pembulatan yang akhirnya terbentuk bagian yang kosong.
![]() |
| garis-garis hitam karena pembulatan. Garis ini adalah bagian gambar yang tidak terpetakan. |
Berarti apa yang harus kita lakukan? Yak! Invers!
\[X_2H^{-1} = X_1\]
Saya kemudian mengimplementasikan rumus ini ke program. Matriks estimasi yang saya inputkan adalah titik kontrol pada form. Dan hasilnya cukup memuaskan *fyuuuh*. Akhirnya euy, semingguan belajar tentang homography *jadi curhat*.
Oh iya, btw saya pakai library Apache Commons Math untuk proses matriks seperti transpose, invers, dan mencari nilai eigen. Kok gitu? Otak saya masih belum cukup professor, heheh.
Eksperimen
Oke deh. Sekarang kembali ke skripsi. Saya menginginkan untuk melakukan ekstraksi di form seperti ini.
Gambar di atas adalah contoh yang bagus untuk jenis form yang memiliki kasus kemiringan dan proyeksi.
Uji Coba 1
Di postingan sebelumnya saya sempat memberitahu saya menggunakan affine transformation berupa shearing agar titik-titik kontrol dapat sejajar. Hasilnya hanya dengan shearing adalah sebagai berikut![]() |
| Rektifikasi hanya dengan shearing |
Uji Coba 2
Uji coba ini hanya menggunakan homography. Pada angka 9, 8, 7, 6, dan 5 lebih baik dan cukup terlihat.Namun permasalahannya adalah metode homography tidak membuat titik-titik kontrol sejajar seperti yang saya harapkan. Artinya jika form terlalu miring maka tidak dapat dideteksi.
![]() |
| Rektifikasi hanya dengan homography |
Uji Coba 3
Percobaan kali ini menggunakan homography dan shearing. Ternyata hasilnya lebih baik, bahkan sebagian besar border hilang.
![]() |
| Rektifikasi dengan homography dan shearing |
Dengan metode ini form yang cukup miring pun bisa ditangani. Saya belum menghitung kemiringan berapa derajat. Seingat saya metode hanya dengan homography tidak sanggup saat kemiringan mengakibatkan titik kontrol tidak melewati titik-titik penanda kolom/baris jika ditarik garis lurus.
[UPDATE 7-Oct-2014] Uji Coba 4
Saat implementasi Homography ternyata saya salah kordinat yang dikalikan. Saya salah memasukkan koordinat x dan y, keduanya terbalik! Ternyata hanya dengan homography hasilnya sangat bagus!
![]() |
| Woow! Align perfectly! |
Saya mengetahui keanehan ini saat memperhatikan uji coba 3 terdapat karakter "d koreksi" terpotong (di bawah angka 7 pada gambar yang sudah diekstraksi). Karena khawatir maka saya bereksperimen dengan melakukan pemindaian menggunakan form yang penuh dengan grid.
![]() |
| form yang sengaja saya beri transformasi proyektif agar bisa dilihat hasil rektifikasi nya |
Berikut percobaan dengan hanya homography. Di ujung gambarnya keluar dari grid yang diinginkan
![]() |
| percobaan cek semua grid dengan homography |
Berikut percobaan dengan shear kemudian homography. Ternyata salah juga!
![]() |
| percobaan cek semua grid dengan shear kemudian homography |
Kemudian saya melakukan debugging dan menguji kembali percobaan untuk mengecek semua grid. Hasil dengan hanya menggunakan homography ternyata sangat memuaskan!!
![]() |
| Aku terpuaskan!!! |
Jadi kesimpulannya homography dan rektifikasi adalah sahabat terbaik. Ciye ciye.
Skripsinya
Ini kok eksperimen mulu sih? Skripsinya kapan dikerjain woy!Ya atuhlah... pan skripsi teh eksperimen, kumaha ih.
Jadi kemarin saya bimbingan dengan dosen pembimbing saya. Karena saya khawatir dengan program saya yang belum punya arahan yang pasti maka saya menunjukkan mockup tampilan program yang akan dibuat. Ternyata lumayan dapat banyak pencerahan, salah satunya adalah
"Kerjakan diagram dulu baru ngoding"
*uhuk*
Ini penyakit yang sudah terlalu dibiasakan. Ngoding dulu akhirnya acakadut. Berarti sekarang saya mengerjakan doktek (dokumen teknis) dulu sembari revisi bab 1.
Terus?
That's it! Mari kita lanjut ngerjain skripsi lagi. Ulalala. Ulalala. Ulala.Friday, September 12, 2014
POME: Research on neural network
Hi guys! It's been a long time. Well you know, procrastinating is awesome. LOL
The ANN
This week I managed to code the trainer program. Yay! What I have done is just made a GUI and integrated it with my already coded ANN. I have coded it last month.
Because I had the opportunity to play around with the ANN, then I tried to make a simple classifier network. Just to tested it out. Interestingly the ANN needed specific number to get it right. The more complex the network doesn't mean it's become more accurate.
For example, I gave 3 hidden layers with 50 hidden neurons each. When I tested it out the result was only 86% accuracy.
But when I used only 1 hidden layers with only 10 hidden neurons in it, the result of my classifier was 100% accuracy! Awesome!
These all still looks like a magic for me. Hahaha. But nevertheless it's still one same dataset, of course I expected exactly same result. For next experiment I'll try different person to write the character and tweak the parameters again.
Homography
Oh anyway, I've found out the problem from the last post of my data extractor (the strangely distorted and unaligned image at the corner). Looks like I need to use the homography.
Have you ever wonder how a person see through a camera but the camera itself produce a 2D image? Yep, it's all because homography plot the 3D world onto the 2D space. Can we reverse this effect? Of course we can! But how? Uh.. that's what I struggled on. I am still reading (and watching) about it. There's a good lecture about homography on YouTube!. I need this!!!
Humm.. That's it for now. I think now I can see my advisor again on this Monday. I asked by him to work on this part of research first. Well then, see ya!
Wednesday, September 3, 2014
Progress About My Paper 2 : The Corner
It was a lot of journey. I experimented to extract the letters from the form. But you know what? The problem is always lurking at the corner. Literally.
The Corner
I learned about the affine space from Tutsplus' tutorial . From the tutorial I managed to shear my image. The idea was like this. I have 3 points, which are top-left, bottom-left, and top-right. First, I set the top-left point as static point. Then I shear the bottom-left point so it's parallel to the top-left point. At last I shear the top-right point so it's parallel to the top-left point.
At the top-left-side part, the image looked correct.
From this result I concluded that I can't simply correct this with affine space. The image was on projective space.
I talked about this problem to my advisor. My advisor told me to ignore this problem for a moment. For the beginning step he told me to assume the form is perfectly aligned. I have to start to experimenting with Neural Network. Luckily I have a Wacom's pen tablet, so I can create handwritten form with it.
My extractor managed to export the XML format of letters. Here's how my extractor looks like.
To extract 52 characters it need about 5 seconds. Quite long eh? But it's enough for the moment. Now I need to create the program for ANN.
Wish me luck then. Ngoahahaha.
p.s: guhe lagi ngambil kursus bahasa Inggris. Lumayan nulis ginian, buat belajar structure.
I talked about this problem to my advisor. My advisor told me to ignore this problem for a moment. For the beginning step he told me to assume the form is perfectly aligned. I have to start to experimenting with Neural Network. Luckily I have a Wacom's pen tablet, so I can create handwritten form with it.
My extractor managed to export the XML format of letters. Here's how my extractor looks like.
To extract 52 characters it need about 5 seconds. Quite long eh? But it's enough for the moment. Now I need to create the program for ANN.
Wish me luck then. Ngoahahaha.
p.s: guhe lagi ngambil kursus bahasa Inggris. Lumayan nulis ginian, buat belajar structure.
Thursday, August 14, 2014
Progress about my paper
Today I spoke to my advisor lecturer about my final project. It's called POME (in case you don't remember you can check my previous post).
In my campus there's a rule that the student need to see the advisors at least 6 times per semester. I haven't seen him for a couple of month, so.. yeah, my final project also got stuck. By the way I have two advisor, but I haven't got time to see the second ones.
Before I saw my advisor I had prepared my questions correlated about my project. We talked a bit, and here's the resume.
First, I misunderstood about erosion and dilation. These two processes is to do morphological change. At first, I thought this process expand every pixel in structuring element. But I was wrong. I rechecked the sample at HIPR2. It's only the center of pixel affected.
Here's an example. Assume there's a 5x5 binary image like this (0 is background and 1 is foreground)
00000
00100
00000
00000
00100
and we have a structuring element for dilation of 3x3
111
111
111
At first I thought the image is going to be like this
11111
11111
11111
11111
11111
Why? Because I change every 3x3 pixel around the foreground's. But, the right answer is this
01110
01110
01110
01110
01110
I reported my finding to my advisor and he told me to rewrite my second chapter of my paper.
For more detail explanation go to its website at http://homepages.inf.ed.ac.uk/rbf/HIPR2/dilate.htm
Second, I rethought for data decode and need to learn scaling. For this project at first I have to create a trained network for my classifier so I need to do training. The input is every correct input letters. I thought it's going to be more convenient to decode those extracted training forms to XML data. Because I need to input the same amount of pixels for every data but the data itself can be different for each extraction so I have to scale them appropriately.
My advisor told me to use the available library out there for scaling. He said scaling can be quite complex. But... I don't know, I thought a simpler scaling because it's binary image. I had read about bilinear interpolation and I think it's quite simple for 2D image. The concept is the original pixels spread out then a structuring element count the gray value.
Err.. that's convenient for shade of grays, maybe I'll find another simpler method for binary images.
I'll try to learn it a little bit and do some experimenting to use it. If it's quite complex (it took me 5 days to develop it, haha) then it's better for me to use image processing library, even though that's rather overkill.
Third, I made up my finding pattern. I made my paper forms. It's consist of white boxes for write text and black boxes for my finding pattern algorithm. I made it up and have no reference. Then I thought it will be great to use QR Code method to find the mark.
Fourth, feature extraction of text.
It's quite long story.
At first, I thought Sobel Edge Detector is great to extract the feature of the text, but then I realize it's no need because I had thresholded it. Sobel Edge Detector maybe will be more useful for noisy and many object on image, not like my paper forms which is quite obvious to remove the background colors.
Then I found thinning from my elder alumni's paper. His method is quite sophisticated. He detect japanese characters. A letter can be 3 or 5 pixel width. He then do "thinning" to it, find its intersection, and count the strokes. Really cool, but complicated. I don't want to use the intersection and stroke counting, but I like the way he do thinning.
Then I tried the thinning method from HIPR2 (which I think still bad, maybe my algorithm is wrong) but I found the image looks so strange. The N letter become looks like W after it's thinned. I'm not sure thinning is good, but maybe it's just because my thinning algorithm.
There's also a paper from Farhad Soleimanian, he put the letter's pixel directly to its neural network.
So what should I use? Directly put it to neural network, thinning method, or Sobel edge detector? My advisor told me to STOP TINKERING IMAGE PROCESSING FOR FEATURE EXTRACTION and do the simplest thing first. Use the "direct input" and do the training to see how much the classification correctness.
What's next? I think I have to do these
- Implement "Finding Pattern" method in extractor app
- Implement "segmentation" in extractor app
- Implement "export form to XML" in extractor app
- Implement "import form XML" in training app
- Implement "Neural Network Training" in training app
- Implement "export network XML" in training app
- Implement "import network XML" in testing app
- Implement "testing" in testing app
- Try each "direct input", Sobel edge detector, and thinning method then count how big are the correctness
- Recheck thinning method, because my algorithm output differ with HIPR2's images
Wednesday, May 21, 2014
POME - Aplikasi handphone penilaian otomatis lembar jawaban komputer
Aplikasi yang menilai secara otomatis lembar jawaban komputer tanpa harus menggunakan komputer, cukup gunakan handphone.
Lembar Jawaban Komputer (LJK) sering digunakan sebagai alat untuk melakukan ujian tertulis karena mudah untuk diperiksa. Ini adalah cara yang hebat untuk menyelenggarakan tes. Mengapa tidak semua orang menggunakannya? POME hadir agar semua orang dapat menikmati kemudahan lembar jawaban komputer.
POME adalah aplikasi handphone yang dapat mengecek dan memberi nilai secara otomatis dari Lembar Jawaban Komputer. Peserta ujian dapat dengan mudah menuliskan nama dan langsung menulis jawaban di lembar yang telah disediakan, kemudian dengan POME nilai akan langsung diperoleh.
Di aplikasi POME kamu tinggal memasukkan kunci jawaban, kemudian memotret lembar jawaban yang telah diisi, dan nilai akan langsung muncul. Keren kan?

Lembar Jawaban Komputer merupakan alat yang bagus untuk menyelenggarakan kuis tertulis. Alat ini mudah dan cepat untuk diperiksa. Namun alat untuk melakukan cek otomatis lembar jawaban komputer harganya cukup mahal. Misalnya OMR (Optical Mark Reader), harganya bisa mencapai lebih dari 15 juta. Selain mahal, bentuknya besar dan susah untuk dibawa.
Dengan POME kamu hanya cukup memiliki handphone. Tidak perlu lagi membawa OMR yang besar. Dan, hey! OMR tidak bisa digunakan untuk selfie!
Selain itu peserta tidak harus membulati pilihan untuk menandakan nama, karena dengan POME nama dan angka yang ditulis di kolom lembar jawaban langsung dideteksi. POME juga bisa membedakan tanda silang yang benar dan tanda silang koreksi. Peserta yang salah menyilang tinggal membubuhkan dua garis mendatar di atas tanda silang untuk mengoreksi jawaban yang dipilih.

Sihir atau sains?
POME melakukan hal ini semua dengan sihir sains! Ilmu komputer memiliki bidang ilmu yang bernama kecerdasan buatan (artificial intelligent) dan pengolahan citra (image processing). Dengan dasar teori dua bidang tersebut sebuah huruf dapat dideteksi. POME memanfaatkan pendeteksian karakter dengan Jaringan Syaraf Tiruan (artificial neural network), dengan metode ini tulisan akan dikonversi menjadi huruf yang dikenali komputer.
Very geeky isn't it? Jangan khawatir, saya akan mengurus hal ini semua di belakang layar dan kamu tinggal menggunakan POME.

POME dibuat oleh Giri Prahasta Putra, seorang pemain biola, tukang gambar, game programmer, pencinta kucing, dan seorang mahasiswa yang sebentar lagi lulus (amin...) dari Ilmu Komputer UPI. In fact, POME is his final project.
Kejutannya, Giri adalah saya! Yay! Kamu bisa kontak saya melalui twitter di @igrir.
Saya belum pernah mengerjakan aplikasi mobile secara serius sebelumnya. Selain itu saya memiliki handphone yang sangat low-end (Sony Xperia Tipo ST21i), jadi mungkin pengerjaannya akan saya lakukan terlebih dahulu dengan target desktop. Memang ini pengerjaan dua kali (karena saya harus melakukan porting ke Android setelahnya), tapi saya rasa ini pengembangan paling cepat untuk dilakukan dengan mengujinya di desktop terlebih dahulu.
Bidang pengolahan citra dan kecerdasan buatan (fokus kepada Jaringan Syaraf Tiruan) adalah hal baru bagi saya. Saya harus mempelajari lagi dasar-dasar pengolahan citra dengan menguji coba gambar-gambar sederhana. Sejauh ini saya sudah mencoba melakukan rotasi, menggunakan convulution matrix, erotion, dilation, dan sobel edge detector. Sedangkan untuk Jaringan Syaraf Tiruan saya baru sebatas mempelajari caranya bekerja dan belum mencobanya lebih dalam.
FAQ
Kenapa saya membuat postingan ini mirip Kickstarter?
Biar gaya aja, haha.
Kapan POME rilis?
Setelah skripsi saya selesai. Jadi doakan saya untuk menyelesaikannya bulan Agustus ya!
Apa yang bisa saya bantu?
Kamu bisa memberi saya bantuan berupa dana yang saya gunakan untuk membeli kertas, jajan, dan hal *uhuk* teknis lainnya. Kamu juga bisa membelikan saya handphone, yang ini kurang enak nih buat develop *matabelo*
Kamu pengennya dibeliin hape apa?
Seriusan nih pengen dibeliin?? Asyik! Saya pengennya Nexus. Kenapa? Karena Android di dalamnya masih beneran Android. Selebihnya saya perlu menggunakan handphone dengan fitur lampu blitz, kamera yang bisa dengan jelas memotret tulisan di atas kertas, dan memorinya besar untuk menampung 300 foto.
Kalau saya bantu doa aja nggak apa-apa?
Nggak apa-apa kok, doakan cepet lulus ya! Doakan juga supaya dapat hape baru, amin.
Ini FAQ nya nanya sendiri ya?
Iya, nanya sendiri jawab sendiri, kekekeke
Subscribe to:
Posts (Atom)




































