Sabtu, 01 Juni 2013

JST untuk Pengenalan Karakter (II)

Halooo teman-teman. Tulisan ini adalah sambungan dari posting sebelumnya yaitu JST untuk Pengenalan Karakter (I).

Nah, pada pembahasan terakhir kita sudah membahas bahwa resolusi webcam kita masih tetap yaitu 240x340 piksel. Namun, dengan block processing, kita membuat semua warna seragam di setiap 40x40 piksel dari webcam tersebut, sehingga seolah-olah kita hanya mempunyai matriks berukuran 6x8 piksel. Hasilnya adalah citra hitam dan putih saja, Pada citra tersebut, telah kita tentukan bahwa hitam bernilai nol sedangkan putih bernilai satu.


Langkah selanjutnya adalah mengolah data ini agar sesuai dengan format untuk inputan JST. Caranya adalah dengan membuat citra tersebut menjadi matriks baris (dari berukuran 6x8 menjadi 48x1). Berikut ilustrasinya:

Ada cara yang sangat mudah sekali untuk menentukan nilai 0 atau 1 dari matriks 6x8, yaitu dengan menghitungnya satu persatu. Kita tahu bahwa nilai setiap 40x40 piksel adalah seragam, bukan? jadi, ambil saja satu angka dari matriks tersebut. Sebagai contoh, piksel ke (1,1) akan mewakili 40x40 matiks pertama, kemudian piksel ke (1,41) mewakili matriks kedua, dst. Memang agak repot, namun hanya sebagai ilustrasi saja. Nanti teman-teman bisa membuat program yang lebih sederhana.
Setelah mendapatkan nilai-nilai tersebut (sebanyak 48), ubahlah dari matriks 6x8 ke 48x1. Berikut contohnya (anggap nama variabel gambar saya adalah b):

%cari data2 piksel secara manual saja
%baris 1

piksel(1)=b(1,1);piksel(2)=b(1,41);piksel(3)=b(1,81);
piksel(4)=b(1,121);piksel(5)=b(1,161);piksel(6)=b(1,201);
%baris 2
piksel(7)=b(41,1);piksel(8)=b(81,41);piksel(9)=b(81,81);...
piksel(10)=b(41,121);piksel(11)=b(41,161);piksel(12)=b(41,201);
%baris 3
piksel(13)=b(81,1);piksel(14)=b(81,41);piksel(15)=b(81,81);
piksel(16)=b(81,121);piksel(17)=b(81,161);piksel(18)=b(81,201);
%baris 4
piksel(19)=b(121,1);piksel(20)=b(121,41);piksel(21)=b(121,81);
piksel(22)=b(121,121);piksel(23)=b(121,161);piksel(24)=b(121,201);
%baris 5
piksel(25)=b(161,1);piksel(26)=b(161,41);piksel(27)=b(161,81);
piksel(28)=b(161,121);piksel(29)=b(161,161);piksel(30)=b(161,201);
%baris 6
piksel(31)=b(201,1);piksel(32)=b(201,41);piksel(33)=b(201,81);
piksel(34)=b(201,121);piksel(35)=b(201,161);piksel(36)=b(201,201);
%baris 7
piksel(37)=b(241,1);piksel(38)=b(241,41);piksel(39)=b(241,81);
piksel(40)=b(241,121);piksel(41)=b(241,161);piksel(42)=b(241,201);
%baris 8
piksel(43)=b(281,1);piksel(44)=b(281,41);piksel(45)=b(281,81);
piksel(46)=b(281,121);piksel(47)=b(281,161);piksel(48)=b(281,201);

piksel=piksel(1:48)';

Nah, selanjutnya, bagaimana untuk melatih JST kita? Tentunya kita butuh banyak input untuk melatih JST kita. Jadi, kita lakukan beberapa variasi bentuk angka. Misal agak bulat, agak lonjong, dsb.


Lakukan langkah-langkah yang sama, dan simpan hasilnya (matriks 48x1 tersebut). 
Tentunya kita harus mempunyadi data tidak hanya angka 2 saja, bukan? Karena project kita adalah membedakan dan mengenali karakter. Sekarang asumsi saya akan membedakan antara angka 1, 2 dan 3. Bagaimana caranya? Nah, hal langkah yang harus kita lakukan adalah sama, yaitu mengumpulkan data dan menyimpannya, kemudian latih angka-angka tersebut sesuai target. Misal, kumpulan angka 1 maka targetnya adalah satu, angka 2 targetnya adalah 2, dst.

Sekarang asumsi saya telah melakukan variasi angka 1, 2 dan 3 masing-masing sebanyak 5 variasi (total 15 data). Maka saya mendapatkan data berikut:
Maka hubungan input dan target dapat diilustrasikan sebagai berikut:


Nah, berikut listing program sederhana dari topik yang telah kita bahas dari awal (asumsi saya simpan listing ini dengan nama pengenalan.m).

% Buat objek dr video
clear all;close all;clc;
vid = videoinput('winvideo');
% ambil 1 frame dari video
I = getsnapshot(vid);
% rotasikan image
y=imrotate(I,-90);
% ubah menjadi hitam dan putih
bw=im2bw(y,0.45);
% lakukan block processing pertama
fun = @(x) std2(x)*ones(size(x));
a = blockproc(bw,[10 10],fun);
% lakukan block processing pertama
a2 = blockproc(a,[40 40],fun);
% selanjutnya kita ubah lagi
% menjadi hitam dan putih

b=im2bw(a2,0.05);

% ubah dulu citra menjadi agar
% bertipe data double

b=im2double(b);

%cari data2 piksel secara manual saja
%baris 1

piksel(1)=b(1,1);piksel(2)=b(1,41);piksel(3)=b(1,81);
piksel(4)=b(1,121);piksel(5)=b(1,161);piksel(6)=b(1,201);
%baris 2
piksel(7)=b(41,1);piksel(8)=b(81,41);piksel(9)=b(81,81);...
piksel(10)=b(41,121);piksel(11)=b(41,161);piksel(12)=b(41,201);
%baris 3
piksel(13)=b(81,1);piksel(14)=b(81,41);piksel(15)=b(81,81);
piksel(16)=b(81,121);piksel(17)=b(81,161);piksel(18)=b(81,201);
%baris 4
piksel(19)=b(121,1);piksel(20)=b(121,41);piksel(21)=b(121,81);
piksel(22)=b(121,121);piksel(23)=b(121,161);piksel(24)=b(121,201);
%baris 5
piksel(25)=b(161,1);piksel(26)=b(161,41);piksel(27)=b(161,81);
piksel(28)=b(161,121);piksel(29)=b(161,161);piksel(30)=b(161,201);
%baris 6
piksel(31)=b(201,1);piksel(32)=b(201,41);piksel(33)=b(201,81);
piksel(34)=b(201,121);piksel(35)=b(201,161);piksel(36)=b(201,201);
%baris 7
piksel(37)=b(241,1);piksel(38)=b(241,41);piksel(39)=b(241,81);
piksel(40)=b(241,121);piksel(41)=b(241,161);piksel(42)=b(241,201);
%baris 8
piksel(43)=b(281,1);piksel(44)=b(281,41);piksel(45)=b(281,81);
piksel(46)=b(281,121);piksel(47)=b(281,161);piksel(48)=b(281,201);

piksel=piksel(1:48)';
input=piksel;


Okay.. sampai disini kita telah mengumpukan semua data. Sekarang, asumsikan saya menyimpannya dengan nama data_gabung.mat. Seperti yang telah kita bahas, bahwa data_gabung.mat berisi 15 data (masing-masing karakter 5 variasi).

Selanjutnya kita latih JST kita. Sebagai catatan, saya menggunakan MATLAB 7.8. Bagi teman-teman yang mempunyai versi lebih baru, akan ada sedikit perubahan sintaks untuk membangun JST.
Bagi yang ingin me-review pembahasan JST bisa ikuti topik ini.

%input
P = data_gabung;   
%target
T = [1 1 1 1 1 2 2 2 2 2 3 3 3 3 3];
%bangun jaringan
net = newff(P,T,[10 5 1],{'logsig' 'logsig' 'purelin'});
%latih jaringan
net.trainParam.epochs=5;
net = train(net,P,T);
%simulasikan jaringan
Y=sim(net,P);


Setelah mendapatkan JST yang menurut kita bagus, selanjutnya simpanlah arsitektur JST ini. Inilah yang akan kita gunakan seterusnya tanpa harus melatih lagi JST tersebut.

Sekarang asumsi bahwa arsitektur JST telah saya simpan dengan nama data_lengkap.mat pada Drive E (E:\data_lengkap.mat). Selanjutnya kita lanjutkan listing pengenalan.m sebagai berikut:

load('E:\data_lengkap.mat');
JST1=sim(net,input);
% untuk menghindari angka koma, ambil ke angka terdekat
JST2=round(JST1);
pengenalan_akhir =JST2;


Pada topik selanjutnya, saya akan membahas pembuatan GUI (user interface) untuk pengenalan karakter ini agar lebih menarik, tinggal 'klik' maka karakter akan dikenali. Berikut review-nya:


Semoga topik ini dapat membantu teman-teman. Makasih ^_^

2 komentar:

Anonim mengatakan...

Sangat bermanfaat

Unknown mengatakan...

bagus