SKRIPSI
NANDA PUTRA
081402030
SKRIPSI
Diajukan untuk melengkapi tugas dan memenuhi syarat mencapai gelar Sarjana
Teknologi Informasi
NANDA PUTRA
081402030
ii
PERSETUJUAN
Judul
Kategori
Nama
Nomor Induk Mahasiswa
Program Studi
Departemen
Fakultas
Komisi Pembimbing
Pembimbing 2
Pembimbing 1
Diketahui/Disetujui oleh
Program Studi S1 Teknologi Informasi
Ketua,
iii
PERNYATAAN
SKRIPSI
Saya mengakui bahwa skripsi ini adalah hasil karya sendiri, kecuali beberapa kutipan
dan ringkasan yang masing-masing disebutkan sumbernya.
Nanda Putra
081402030
iv
PENGHARGAAN
Puji dan syukur penulis sampaikan kehadirat Allah SWT yang telah memberikan
rahmat dan hidayah-Nya sehingga penuli dapat menyelesaikan skripsi ini sebagai
syarat untuk memperoleh gelar Sarjana Teknologi Informasi, Program Studi S1
Teknologi Informasi Universitas Sumatera Utara.
Ucapan terima kasih penulis sampaikan kepada Bapak Drs. Suyanto, M.Kom.
selaku pembimbing satu dan Bapak Sajadin Sembiring, S.Si, M.Sc. selaku
pembimbing dua yang telah banyak meluangkan waktu dan pikirannya, memotivasi
dan memberikan kritik dan saran kepada penulis. Ucapan terima kasih juga ditujukan
kepada Bapak M. Fadly Syahputra, B.Sc., M.Sc. dan Bapak Dedy Arisandi, S.T.,
M.Kom. yang telah bersedia menjadi dosen penguji. Ucapan terima kasih juga
ditujukan kepada Ketua dan Sekretaris Program Studi Teknologi Informasi, Prof. Dr.
Opim Salim Sitompul, M.Sc. dan Drs. Sawaluddin, M.IT, Dekan dan Pembantu
Dekan Fakultas Ilmu Komputer dan Teknologi Informasi Universitas Sumatera Utara,
semua dosen serta pegawai di Program Studi S1 Teknologi Informasi.
Skripsi ini terutama penulis persembahkan untuk kedua orang tua dan keluarga
penulis yang telah memberikan dukungan dan motivasi, ayahanda Sudirman dan
ibunda Eni Hidayati yang selalu sabar dalam mendidik penulis. Untuk kakak penulis
Prima Octari dan adik penulis Sudrial Fajri yang selalu memberikan dorongan kepada
penulis. Terima kasih penulis ucapkan kepada teman-teman yang selalu memberikan
dukungan, Kak Rani, Kak Andre, Bang Asril, Hasnul, Dika, Ical, Billy, Fran, Reyhan,
teman-teman lantai 3, serta teman-teman mahasiswa Teknologi Informasi lainnya
yang tidak dapat penulis sebutkan satu persatu. Semoga Allah SWT membalas
kebaikan kalian.
ABSTRAK
Pada penelitian ini, kombinasi metode zoning dan diagonal based feature extraction
digunakan pada jaringan propagasi balik untuk pengenalan angka tulisan tangan.
Kedua metode ini sama-sama membagi data sampel menjadi NxM zona dan
menghitung nilai fitur dari setiap zona tersebut. Pada penelitian ini data sampel dibagi
menjadi 6x9 zona, yaitu 54 zona dengan ukuran masing-masing zona adalah 10x10
piksel. Metode zoning menghitung jumlah piksel aktif (hitam) setiap zona dan
melakukan perbandingan terhadap zona yang memiliki jumlah piksel aktif paling
banyak. Metode diagonal based feature extraction menghitung nilai rata-rata
histogram diagonal setiap zona. Selain itu juga dihitung rata-rata nilai zona setiap
baris dan kolom. Dari ekstraksi fitur tersebut didapatkan 123 nilai fitur, yaitu 54 dari
metode zoning dan 69 dari metode diagonal based feature extraction. Nilai fitur
tersebut dijadikan masukan untuk klasifikasi menggunakan jaringan propagasi balik.
260 data sampel digunakan untuk pelatihan dan 100 data sampel berbeda digunakan
untuk uji tingkat pengenalan. Dari pengujian yang dilakukan didapatkan tingkat
pengenalan menggunakan kombinasi dua metode fitur ekstraksi ini adalah 87%.
Kata kunci : angka tulisan tangan, diagonal based feature extraction, propagasi balik
zoning.
vi
ABSTRACT
In this paper, combination of zoning and diagonal based feature extraction method is
used by backpropagation network for handwritten digit recognition. Both method
divide sample to NxM grid zones and compute feature vector from each zone. In this
paper, sample is divided into 6x9 grid zone, total 54 zones where each zone is 10x10
pixel. Zoning method summing every active (black) pixel from each zone and divide
value from each zone by a zone with most active pixel. Diagonal based feature
extraction method compute average of diagonal histogram from each zone. Also
compute average value from all zone row-wise and column-wise. 123 features vector
formed from these feature extraction, which is 54 features obtained from zoning
method and 69 features obtained from diagonal based feature extraction. These feature
vector used as input data for backpropagation classifier. 260 samples are used for
training and another 100 samples are used for recognition rate testing. After testing
phase done, recognition rate using combination of these feature extraction is 87%.
Keywords : backpropagation, diagonal based feature extraction, handwritten digit,
zoning.
vii
DAFTAR ISI
Halaman
PERSETUJUAN
PERNYATAAN
PENGHARGAAN
ABSTRAK
ABSTRACT
DAFTAR ISI
DAFTAR TABEL
DAFTAR GAMBAR
BAB 1 PENDAHULUAN
1.1 Latar Belakang
1.2 Rumusan Masalah
1.3 Batasan Masalah
1.4 Tujuan Penelitian
1.5 Manfaat Penelitian
1.6 Metodologi Penelitian
1.7 Sistematika Penulisan
ii
iii
iv
v
vi
vii
ix
x
1
1
3
3
4
4
4
5
7
7
8
8
8
9
9
11
12
12
14
15
15
19
19
20
20
20
21
23
25
25
26
27
viii
28
28
30
32
35
35
36
38
41
44
44
45
47
48
49
49
51
51
52
61
61
61
DAFTAR PUSTAKA
LAMPIRAN A : LISTING PROGRAM
LAMPIRAN B : DATA SAMPEL
62
65
93
ix
DAFTAR TABEL
Halaman
Tabel 2.1 Ekstraksi fitur pada representasi citra yang berbeda
11
Tabel 3.1 Nilai keluaran dan target keluaran jaringan
45
Tabel 4.1 Fungsi-fungsi CImg yang digunakan
50
Tabel 4.2 Arsitektur tiga jaringan yang diujikan
52
Tabel 4.3 Hasil pengenalan data uji jaringan I(Zoning)
52
Tabel 4.4 Hasil pengenalan data uji jaringan II(Diagonal Based Feature Extraction) 55
Tabel 4.5 Hasil pengenalan data uji jaringan III (Zoning dan Diagonal Based Feature
Extraction)
57
Tabel 4.6 Kemampuan generalisasi tiga jaringan yang diujikan
60
DAFTAR GAMBAR
Halaman
Gambar 2.1 Piksel P1 dengan 8 tetangga
Gambar 2.2 Pembagian zona pada citra biner
Gambar 2.3 Karakter ukuran 60x90 piksel
Gambar 2.4 Pembagian zona ekstraksi fitur
Gambar 2.5 Diagonal histogram setiap zona
Gambar 2.6 Jaringan propagasi balik dengan satu buah lapisan tersembunyi
Gambar 2.7 Fungsi sigmoid biner dengan rentang
Gambar 3.1 Skema Dasar Pengenalan Angka Tulisan Tangan
Gambar 3.2 Tulisan menggunakan tinta cair (kiri) dan tinta biasa (kanan)
Gambar 3.3 Tahapan Prapengolahan Citra
Gambar 3.4 Flowchart proses grayscaling
Gambar 3.5 Citra hasil grayscaling
Gambar 3.6 Citra hasil noise reduction
Gambar 3.7 Flowchart proses thresholding
Gambar 3.8 Citra hasil thresholding
Gambar 3.9 Flowchart proses filling
Gambar 3.10 Citra hasil filling
Gambar 3.11 Flowchart proses cropping
Gambar 3.12 Citra hasil croping
Gambar 3.13 Citra hasil normalisasi
Gambar 3.14 Citra hasil thinning
Gambar 3.15 Matrik penyimpanan nilai fitur
Gambar 3.16 Pembagian zona menjadi 6 kolom dan 9 baris
Gambar 3.17 Diagram ekstraksi fitur
Gambar 3.18 Flowchart ekstraksi fitur zoning
Gambar 3.19 Histogram diagonal zona
Gambar 3.20 Flowchart ekstraksi diagonal based feature extraction
Gambar 3.21 Matrik penyimpanan nilai fitur
Gambar 3.22 Arsitektur jaringan saraf tiruan
10
12
13
13
14
16
20
24
25
26
27
28
28
29
30
31
32
33
34
35
36
36
37
38
40
41
43
44
46
BAB 1
PENDAHULUAN
Pengolahan citra digital dewasa ini tidak hanya terbatas pada pengeditan citra digital,
namun juga meliputi teknik pengenalan karakter seperti karakter alfanumerik, tulisan
tangan, dan lain-lain (Emanual dan Hartono, 2008). Teknik ini disebut juga Optical
Character Recognition (OCR). OCR untuk pengenalan tulisan tangan telah menjadi
salah satu area penelitian yang paling menarik dan menantang dari bidang pengolahan
citra dan pengenalan pola pada beberapa tahun terakhir (Althaf dan Begum, 2012).
Secara umum, pengenalan tulisan tangan terbagi menjadi dua jenis, yaitu
metode online dan offline. Metode offline melakukan konversi secara otomatis tulisan
pada sebuah citra menjadi karakter yang dapat diolah oleh computer dan aplikasi
pemrosesan teks. Pada metode online, koordinat dua dimensi dari poin-poin penulisan
direpresentasikan sebagai fungsi waktu dan urutan setiap garis yang dituliskan juga
disimpan secara realtime untuk mengenali karakter yang dituliskan (Arica dan
Yarman-Vural, 2001).
Tahapan awal untuk pengenalan tulisan tangan adalah prapengolahan citra dan
ekstraksi fitur. Pemilihan metode ektraksi fitur yang baik merupakan salah satu faktor
penting untuk mencapai tingkat pengenalan yang tinggi (Jain dan Taxt, 1996).
Beberapa metode ekstraksi yang dapat digunakan adalah model deformable, profil
kontur, zoning, momen zernike, dekriptor fourier dan gabor.
Proses ekstraksi fitur dilakukan untuk mendapatkan nilai fitur yang dibutuhkan
untuk tahap pengklasifikasian. Berbagai metode ekstraksi fitur telah banyak
digunakan untuk mendapatkan nilai fitur sebagai masukan untuk pengenalan tulisan
tangan. Sheth et. al (2011) menggunakan kode rantai dan koefisien korelasi dan
mendapatkan tingkat pengenalan 80%. Handayani, 2008, menggunakan model
deformable mendapatkan tingkat kesalahan sebesar 4,05% dan tingkat penolakan
sebesar 9,88%. Lauer et.al, 2007, mengembangkan trainable feature extractor dan
mendapatkan tingkat pengenalan antara 98,45% sampai 99,32%.
Penelitian tentang kombinasi dua atau lebih metode ekstraksi fitur juga telah
dilakukan. Murty dan Hanmandlu (2011) menambahkan lokasi piksel sebagai fitur
tambahan untuk metode zoning. Siddrath et. al (2011) menggabungkan zonal density
dengan background directional distribution untuk mengenali tulisan gumurkhi dengan
tingkat pengenalan 88.9%. Ayyaz et. al (2012) mengkombinasikan berbagai metode
ekstraksi fitur seperti proyeksi, profil, momen invarian, titik ujung dan titik
perpotongan dan fitur korelasi dengan tingkat pengenalan 96%.
Pada penelitian ini metode ekstraksi zoning dan diagonal based feature
extraction akan dikombinasikan untuk mendapatkan nilai fitur yang akan digunakan
untuk pengklasifikasian. Untuk setiap data sampel yang telah melalui proses
prapengolahan citra akan dilakukan ekstraksi fitur. Ekstraksi pertama dilakukan
menggunakan metode zoning dan selanjutnya untuk citra yang sama akan diekstraksi
lagi menggunakan metode diagonal based feature extraction. Hasil ekstraksi dari
kedua metode tersebut akan digabungkan untuk mendapatkan nilai fitur untuk proses
pengklasifikasian.
Dari latar belakang di atas, penggunaan satu metode ekstraksi saja belum mampu
menghasilkan nilai fitur yang mampu mencapai tingkat pengenalan 100%. Oleh
karena itu rumusan masalah pada penelitian ini adalah bagaimana memperbaiki nilai
fitur untuk masukan jaringan propagasi balik pada pengenalan angka tulisan tangan
dengan mengkombinasikan metode zoning dan diagonal based feature extraction.
Ukuran citra untuk diekstrak adalah 60x90 piksel dan dibagi menjadi 6 kolom dan
9 baris zona dengan ukuran setiap zona adalah 10x10 piksel (Pradeep et. al,
2011).
2.
3.
Penulisan angka dilakukan menggunakan alat tulis dengan tinta cair warna hitam.
4.
5.
Tujuan dari penelitian ini adalah menambah tingkat pengenalan angka tulisan tangan
pada jaringan propagasi balik dengan memperbaiki nilai fitur untuk lapis masukan
jaringan menggunakan kombinasi metode zoning dan diagonal based feature
extraction.
2.
3.
Sebagai referensi untuk penelitian lain yang membahas metode ekstraksi zoning
dan diagonal based feature extraction.
c. Perancangan
Pada tahap ini dilakukan perancangan proses pengenalan angka tulisan tangan,
seperti arsitektur jaringan dan flowchart.
d. Implementasi
Pada tahap ini dilakukan implementasi analisis yang telah dilakukan ke dalam
kode program.
e. Pengujian
Pada tahap ini dilakukan pengujian kemampuan kombinasi metode zoning dan
diagonal based feature extraction pada jaringan propagasi balik untuk pengenalan
angka tulisan tangan.
f. Penyusunan Laporan
Pada tahap ini dilakukan penulisan laporan mengenai seluruh penelitian yang
telah dilakukan.
Sistematika penulisan dari skripsi ini terdiri dari lima bagian utama sebagai berikut:
BAB 1 PENDAHULUAN
Bab ini berisi latar belakang, rumusan masalah, batasan masalah, tujuan penelitian,
manfaat penelitian, metodologi penelitian, dan sistematika penulisan.
BAB 2
LANDASAN TEORI
2.1 Citra
Secara harafiah, citra (image) adalah gambar pada bidang dwimatra (dua dimensi).
Ditinjau dari sudut pandang matematis, citra merupakan fungsi menerus (continue)
dari intensitas cahaya pada bidang dwimatra (Munir, 2004). Sumber
cahaya
menerangi objek, objek kembali memantulkan kembali sebagian dari berkas cahaya
tersebut. Pantulan cahaya ini ditangkap oleh alat-alat optik, misalnya mata pada
manusia, kamera, pemindai (scanner) dan sebagainya, sehingga bayangan objek yang
disebut citra tersebut terekam.
Citra digital adalah representasi visual dari suatu objek setelah mengalami
berbagai transformasi data dari beragai bentuk rangkaian numerik. Citra digital dapat
diklasifikasikan menjadi beberapa jenis:
1. Citra Biner
Citra biner (binary image) adalah citra yang hanya mempunyai dua nilai derajat
keabuan: hitam dan putih. Piksel-piksel objek bernilai 1 dan piksel-piksel latar
belakang bernilai 0. Pada waktu menampilkan citra, 0 adalah warna putih dan 1
adalah warna hitam.
Untuk mengubah citra grayscale menjadi citra biner, ,proses yang dilakukan
adalah mengubah kuantisasi citra dengan cara pengambangan secara global
(global image thresholding). Setiap piksel di dalam citra dipetakan ke dalam dua
nilai, 1 atau 0. Dengan fungsi pengambangan:
(
dengan I(x,y) adalah level keabuan pada suatu koordinat yang diperoleh dengan
mengatur warna R (merah), G (hijau), B (biru) yang ditunjukkan oleh nilai
parameter , dan . Secara umum nilai , dan adalah 0.33. Nilai yang lain
juga dapat diberikan untuk ketiga parameter tersbut asalkan total keseluruhannya
adalah 1 (Putra, 2009).
3. Citra Warna
Citra warna adalah citra digital yang memiliki informasi warna pada setiap
pikselnya. Sistem pewarnaan citra warna ada beberapa macam seperti RGB,
CMYK, HSV, dll.
Pengolahan citra adalah pemrosesan atau usaha untuk melakukan transformasi suatu
citra/gambar menjadi citra lain dengan menggunakan teknik tertentu.
Proses pemotongan adalah memotong citra sesuai batasan objek, yaitu batas atas,
batas bawah, batas kanan dan batas kiri. Proses ini menghilangkat area latar belakang
yang berada di luar batasan objek citra.
Proses pengurangan derau adalah mengurangi derau yang dapat mengganggu dan
mengurangi kualitas hasil proses prapengolahan citra. Pada penelitian ini teknik
pengurangan derau yang digunakan adalah median filter. Median filter adalah filter
tipe low-pass. Teknik ini memroses area dari citra dengan ukuran (3x3, 5x5, 7x7, dll),
memeriksa nilai piksel pada area tersebut dan menggantinya dengan nilai mediannya
(Phillips, 2000). Algoritma pengurangan derau menggunakan median filter adalah
sebagai berikut :
1.
2.
3.
4.
5.
6.
Cari median dari elemen array tersebut. (Total dari elemen array adalah 9 jadi
median adalah elemen ke 5).
7.
8.
2.2.3 Normalisasi
Normalisasi adalah proses mengubah ukuran citra, baik menambah atau mengurangi,
menjadi ukuran yang ditentukan tanpa menghilangkan informasi penting dari citra
tersebut (Sharma et. al, 2012). Dengan adanya proses normalisasi maka ukuran semua
citra yang akan diproses menjadi seragam.
2.2.4 Thinning
Thinning adalah proses pengurangan data yang mengikis (erode) sebuah objek hingga
menjadi ukuran 1 piksel dan menghasilkan kerangka (skeleton) dari objek tersebut.
Objek seperti huruf atau silhouettes dapat lebih mudah dikenali dengan melihat
kepada kerangkanya saja (Phillips, 2000). Pada penelitian ini digunakan algoritma
thinning Zhang-Suen.
10
Algoritma ini adalah algoritma untuk citra biner, dimana piksel background
citra bernilai 0, dan piksel foreground (region) bernilai 1. Algoritma ini cocok
digunakan untuk bentuk yang diperpanjang (elongated) dan dalam aplikasi OCR
(Optical Character Recognition). Algoritma ini terdiri dari beberapa penelusuran,
dimana setiap penelusurannya terdiri dari 2 langkah dasar yang diaplikasikan terhadap
titik yang pikselnya bernilai 1, dan memiliki paling sedikit 1 piksel dari 8-tetangganya
yang bernilai 0.
Langkah pertama dari sebuah penelusuran adalah menandai semua titik objek
untuk dihapus, jika titik objek tersebut memenuhi syarat-syarat berikut:
a. 2 N (P1) 6
b. S(P1) = 1
c. P2 * P4 * P6 = 0
d. P4 * P6 * P8 = 0
Keterangan :
1.
Jumlah dari tetangga titik objek P1, yang pikselnya bernilai 1, yaitu:
N(P1) = P2 + P3 + P4 + + P9
2.
S(P1) adalah jumlah perpindahan nilai nilai dari 0 (nol) ke 1 (satu) mulai dari P2,
P3, , P8, P9.
3.
Dan pada langkah kedua, kondisi (a) dan (b) sama dengan langkah pertama,
sedangkan kondisi (c) dan (d) diubah menjadi:
11
(c) P2 * P4 * P8 = 0
(d) P2 * P6 * P8 = 0
Ekstraksi fitur adalah proses pengukuran terhadap data yang telah dinormalisasi untuk
membentuk sebuah nilai fitur. Nilai fitur digunakan oleh pengklasifikasi untuk
mengenali
unit
masukan
dengan
unit
target
keluaran
dan
memudahkan
pengklasifikasian karena nilai ini mudah untuk dibedakan (Pradeep et. al, 2011).
Secara luas, fitur adalah semua hasil pengukuran yang bisa diperoleh. Fitur
juga bisa menggambarkan karakteristik objek yang dipantau (Putra, 2009). Contoh
dari fitur level rendah adalah intensitas sinyal. Fitur bisa berupa simbol, numerik atau
keduanya. Contoh dari fitur simbol adalah warna. Contoh dari fitur numerik adalah
berat. Fitur bisa diperoleh dengan mengaplikasikan algoritma pencari fitur pada data
masukan. Fitur dapat dinyatakan dengan variabel kontinu, diskret atau diskret-biner.
Fitur biner dapat digunakan untuk menyatakan ada tidaknya suatu fitur tertentu.
Fitur yang baik memiliki syarat berikut, yaitu mudah dalam komputasi,
memiliki tingkat keberhasilan yang tinggi dan besarnya data dapat diperkecil tanpa
menghilangkan informasi penting (Putra, 2009).
Ekstraksi fitur dapat dilakukan pada berbagai representasi citra seperti pada
tabel 2.1.
Tabel 2.1 Ekstraksi fitur pada representasi citra yang berbeda (Jain dan Taxt,
1996)
Grayscale subimage
Binary
Vector (Skeleton)
Solid character
Outer countour
Template matching
Template matching
Template matching
Deformable templates
Deformable templates
Unitary transforms
Unitary transforms
Graph decription
12
Projection histograms
Countour Profile
Discrete features
Zoning
Zoning
Zoning
Zoning
Geometric moments
Geometric moments
Spline curve
Zernike moments
Zernike moments
Fourier decriptors
Fourier decriptors
2.3.1 Zoning
Zoning adalah salah satu ekstraksi fitur yang paling popular dan sederhana untuk
diimplementasikan (Sharma et. al, 2012). Sistem optical character recognition (OCR)
komersil yang dikembangkan oleh CALERA menggunakan metode zoning pada citra
biner (Bosker, 1992). Setiap citra dibagi menjadi NxM zona dan dari setiap zona
tersebut dihitung nilai fitur sehingga didapatkan fitur dengan panjang NxM. Salah satu
cara menghitung nilai fitur setiap zona adalah dengan menghitung jumlah piksel hitam
setiap zona dan membaginya dengan jumlah piksel hitam terbanyak pada yang
terdapat pada salah satu zona. Contoh pembagian zona pada citra biner dapat dilihat
pada gambar 2.2.
Gambar 2.2 Pembagian zona pada citra biner (Jain dan Taxt, 1996)
Setiap karakter image dengan ukuran 90x60 piksel (Gambar 2.3) dibagi menjadi
54 zona, setiap zona berukuran 10x10 piksel (Gambar 2.4).
2.
13
a.
b.
Hitung rata-rata dari 19 subfitur tersebut dan nilai tersebut digunakan untuk
mewakili setiap zona.
3.
Dari nilai setiap zona, hitung rata-rata masing-masing baris dan masing-masing
kolom. Sehingga didapatkan 9 nilai baris dan 6 nilai kolom.
4.
Gambar 2.3 Karakter ukuran 60x90 piksel (Pradeep et. al, 2011)
Gambar 2.4 Pembagian zona ekstraksi fitur (Pradeep et. al, 2011)
14
Gambar 2.5 Diagonal histogram setiap zona (Pradeep et. al, 2011)
Jaringan saraf tiruan disusun dengan asumsi yang sama seperti jaringan saraf
biologi (Puspitaningrum, 2006):
1.
2.
3.
4.
Setiap neuron menerapkan sebuah fungsi aktivasi terhadap input jaringan (jumlah
sinyal input berbobot). Tujuannya adalah untuk menentukan sinyal output.
15
Jaringan saraf tiruan terdiri dari banyak neuron yang menyusun jaringan tersebut.
Neuron-neuron tersebut dikelompokkan ke dalam beberapa lapisan (layer) dan
lapisan-lapisan tersebut memiliki hubungan satu sama lain.
Lapisan input
Pada lapisan ini neuron-neuron akan menerima input yang selanjutnya diproses
untuk dikirimkan ke lapisan selanjutnya.
2.
Lapisan tersembunyi
Lapisan ini berada di antara lapisan input dan lapisan output. Pada lapisan ini
bobot yang diterima dari lapisan input diproses untuk selanjutnya diproses untuk
dikirimkan ke lapisan selanjutnya. Output dari lapisan ini tidak secara langsung
dapat diamati.
3.
Lapisan output
Lapisan ini merupakan lapisan akhir dimana nilai output dihasilkan. Pada lapisan
ini ditetapkan nilai output aktual untuk dibandingkan dengan nilai output target
untuk mengetahui apakah jaringan sudah sesuai dengan hasil yang diinginkan.
16
Istilah propagasi balik diambil dari cara kerja jaringan ini, yaitu bahwa
gradient error unit-unit tersembunyi diturunkan dari penyiaran kembali error-error
yang diasosiasikan dengan unit-unit output. Hal ini karena nilai target untuk unit-unti
tersembunyi tidak diberikan (Puspitaningrum, 2006). Propagasi balik adalah metode
pembelajaran terawasi (supervised learning). Metode ini membutuhkan nilai yang
sudah ditentukan sebelumnya untuk mendapatkan output yang diinginkan pada proses
pembelajaran. Contoh jaringan propagasi balik dengan satu buah lapisan tersembunyi
dapat dilihat pada gambar 2.6.
Gambar 2.6 Jaringan propagasi balik dengan satu buah lapisan tersembunyi
(Puspitaningrum, 2006)
Algoritma pelatihan
Terdiri dari 3 tahap: tahap umpan maju pola pelatihan input, tahap pemropagasian
error, dan tahap pengaturan bobot.
2.
Algoritma aplikasi
Yang digunakan hanyalah tahap umpan maju saja.
17
Algoritma Pelatihan
1.
Inisialisasi bobot-bobot.
Tentukan angka pembelajaran ().
Tentukan pula nilai toleransi error atau nilai ambang (bila menggunakan nilai
ambang sebagai kondisi berhenti); atau set maksimal epoch (bila menggunakan
banyaknya epoch sebagai kondisi berhenti).
2.
While kondisi berhenti tidak terpenuhi do langkah ke-2 sampai langkah ke-9.
3.
Untuk setiap pasangan pola pelatihan, lakukan langkah ke-3 sampai langkah ke-8.
Setiap unit input xi (dari unit ke-1 sampai unit ke-n pada lapisan input)
mengirimkan sinyal input ke smua unit yang ada di lapisan atasnya (ke lapisan
tersembunyi)
5.
Pada setiap unit di lapisan tersembunyi zj (dari unit ke-1 sampai unit ke-p;
i=i,,n; j=1,...,p) sinyal output lapisan tersembunyinya dihitung dengan
menerapkan fungsi aktivasi terhadap penjumlahan sinyal-sinyal input berbobot xi:
(
Setiap unit di lapisan output yk (dari unit ke-1 sampai unit ke-m; i=1,...,n;
k=1,,m) dihitung sinyal outputnya dengan menerapkan fungsi aktivasi terhadap
penjumlahan sinyal-sinyal input berbobot zj bagi lapisan ini:
(
Setiap unit output yk (dari unit ke-1 sampai unit ke-m; i=1,,p; k=1,.,m)
menerima pol target tk lalu informasi kesalahan lapisan output (k) dihitung. k
dikirim ke lapisan di bawahnya dan digunakan untuk mengitung besar koreksi
bobot dan bias (wjk dan w0k) antara lapisan tersembunyi dengan lapisan output:
(
) (
18
wjk = k zj
w0k = k
8.
Pada setiap unit di lapisan tersembunyi (dari unit ke-1 sampai unit ke-p; i=1,,n;
j=1,,p; k=1,,m) dilakukan perhitungan informasi kesalahan lapisan
tersembunyi (j). j kemudian digunakan untuk menghitung besar koreksi bobot
dan bias (wjk dan w0k) antara lapisan input dan lapisan tersembunyi.
(
)) (
vij = j xi
v0j = j
Tahap Peng-update-an Bobot dan Bias
9.
Pada setiap unit output yk (dari unit ke-1 sampai unit ke-m) dilakukan pengupdate-an bias dan bobot (j=0,,p; k=1,,m) sehingga bias dan bobot baru
menjadi:
wjk (baru) = wjk (lama) + wjk
Dari unit ke-1 sampai unit ke-p di lapisan tersembunyi juga dilakukan pengupdate-an pada bias dan bobotnya (i=0,,n; j=1,,p):
vij (baru) = vij (lama) + vij
Algoritma Aplikasi
0.
Inisialisasi bobot. Bobot ini diambil dari bobot-bobot terakhir yang diperoleh dari
algoritma pelatihan.
1.
2.
Setiap unit input xi (dari unit ke-1 sampai unit ke-n pada lapisan input; i=1,,n)
menerima sinyal input pengujian xi dan menyiarkan sinyal xi ke semua unikt pada
lapisan di atasnya (unit-unit tersembunyi).
3.
Setiap unit di lapisaan tersembunyi zj (dari unit ke-1 sampai unit ke-p; i=1,,n;
j=1,.,p) menghitung sinyal outputnya dengan menerapkan fungsi aktivasi
terhadap penjumlahan sinyal-sinyal input xi. Sinyal output dari lapisan
tersembunyi kemudian dikirim ke semua unit pada lapisan di atasnya:
19
(
4.
Setiap unit output yk (dari unit ke-1 sampai unit ke-m; j=1,,p; k=1,,m)
menghitung sinyal outputnya dengan menerapkan fungsi aktivasi terhadap
penjumlahan sinyal-sinyal input bagi lapisan ini, yaitu sinyal-sinyal input zj dari
lapisan tersembunyi:
(
Pilihan fungsi aktivasi yang dapat digunakan pada metode propagasi balik yaitu fungsi
sigmoid biner, sigmoid bipolar dan tangent hiperbolik. Karakteristiki yang harus
imiliki fungsi aktivasi tersebut adalah kontinu, diferensiabel dan tidak menurun secara
monoton. Fungsi aktivasi diharapkan jenuh (mendekati nilai-nilai maksimum dan
minimum secara asimtot) (Puspitaningrum, 2006).
Fungsi ini merupakan fungsi yang umum digunakan. Rentang-nya adalah (0,1) dan
didefenisikan sebagai :
( )
dengan turunan :
( )
( )(
( ))
20
Cepat atau tidaknya pembelajaran pada pelatihan jaringan propagasi balik salah
satunya dipengaruhi oleh nilai bobot antar neuron dan nilai bias. Semakin baik
inisialisasi bobot dan bias semakin cepat pula pembelajaran jaringan propagasi balik.
Bobot dan bias pada jaringan propagasi balik dapat dinisialisasi dengan berbagai cara
seperti inisialisasi acak, nguyen-widrow dan lain-lain.
Prosedur yang umum dilakukan adalah menginisialisasi bias dan bobot, baik dari unit
input ke unit tersembunyi maupun dari unit tersembunyi ke unit output secara acak
dalam sebuah interval tertentu (- dan ), misalnya antara -0.4 sampai 0.4, -0.5 sampai
0.5, dan -1 sampai 1 (Puspitaningrum, 2006).
Waktu pembelajaran jaringan propagasi balik yang bobot dan biasnya diinisalisasi
dengan inisialisasi Nguyen-Widrow lebih cepat dibandingkan bila diinisialisasi
dengan inisialisasi acak. Pada inisialisasi Nguyen-Widrow, inisialisasi acak tetap
terpakai tetapi digunakan untuk menginisialisasi bias dan bobot dari unit tersembunyi
21
ke unit output saja. Untuk bias dan bobot dari unit-unit input ke unit-unit tersembuyi
digunakan bias dan bobot yang khusus diskala agar jatuh pada range tertentu. Dengan
penskalaan maka diharapkan kemampuan belajar dari unit-unit tersembunyi dapat
meningkat.
Faktor skala Nguyen-Widrow () didefenisikan sebagai :
( )
di mana :
n = banyak unit input
p = banyak unit tersembunyi
= faktor skala
2. Menentukan bias antara unit input ke unit tersembuni (j = 1, , p). voj diset
dengan bilangan acak yang terletak pada skala antara - dan .
22
wjk = k zj
vij = jxi
Jika error tidak terjadi (output actual telah sama dengan output target) maka k
menjadi nol dan hal ini akan menyebabkan koreksi bobot wjk = 0, atau dengan kata
lain pengupdatean bobot berlanjut dalam arah yang sama seperti sebelumnya.
Jika
parameter
momentum
digunakan
maka
persamaan-persamaan
pengupdatean bobot dengan langkah pelatihan t, dan t+1 untuk langkah pelatihan
selajutnya, mengalami modifikasi sebagai berikut :
wjk(t + 1) = k zj + wjk(t)
vij(t + 1) = j xi + vij(t)
dengan adalah parameter momentum dalam range antara 0 sampai 1.
BAB 3
Ekstraksi fitur adalah salah satu tahap penting pada optical character recognition
(OCR). Ekstraksi fitur dilakukan untuk mendapatkan nilai fitur yang mewakili
karakter yang akan dikenali. Satu metode ekstraksi fitur dapat digunakan untuk
mendapatkan nilai fitur, tetapi pada penelitian ini dua metode ekstraksi fitur, yaitu
metode zoning dan diagonal based feature extraction, dikombinasikan untuk
mendapatkan nilai fitur yang diharapkan dapat mewakili karakter dengan lebih baik
dan meningkatkan tingkat pengenalan daripada menggunakan salah satu metode saja.
Pada penelitian ini, kombinasi kedua metode tersebut diujikan pada pengenalan angka
tulisan tangan menggunakan jaringan propagasi balik. Secara umum skema dasar
tahap-tahap pengenalan angka tulisan tangan yang dibangun dapat dilihat pada gambar
3.1.
24
Akuisisi Citra
Ekstraksi fitur
Prapengolahan
Citra
Ekstraksi Fitur
Zoning
Ekstraksi Fitur
DBFE
Nilai Fitur
Klasifikasi JST
Keluaran
Tahap pertama adalah akuisisi data, yaitu membaca citra angka tulisan tangan
yang telah dikumpulkan dan dipindai. Pada setiap citra angka tulisan tangan dilakukan
tahap prapengolahan citra. Pada tahap ini citra angka tulisan tangan akan diolah
menjadi citra yang seragam dan sesuai untuk tahap selanjutnya. Tahap selanjutnya
adalah ekstraksi fitur dari setiap citra. Pada penelitian ini digunakan kombinasi dua
metode ekstraksi fitur, yaitu metode zoning dan diagonal based feature extraction.
Nilai fitur yang didapatkan dari kedua metode tersebut kemudian digabungkan dan
digunakan sebagai masukan jaringan propagasi balik. Tahap selanjutnya adalah tahap
klasifikasi menggunakan jaringan propagasi balik. Tahap ini terdiri dari proses
pelatihan dan proses pengujian. Setelah itu akan didapatkan keluaran dari proses
klasifikasi, baik itu hasil pelatihan atau hasil pengujian.
25
Tahap sebelum ekstraksi fitur terdiri dari akuisisi data dan prapengolahan citra. Pada
tahap ini dilakukan persiapan data sampel agar dapat digunakan untuk ekstraksi fitur.
Ekstraksi fitur tidak dapat dilakukan sebelum tahap ini diselesaikan.
Data sampel yang digunakan adalah angka tulisan tangan yang dibubuhkan pada
kertas putih menggunakan pena tinta cair warna hitam. Data sampel dikumpulkan dari
36 mahasiswa Teknologi Informasi USU. Masing-masing menuliskan angka dari 0
sampai 9. Angka yang dituliskan diasumsikan tegak, yaitu memiliki perbedaan derajat
rotasi penulisan yang hampir sama. Hal ini dilakukan karena pada penelitian ini tidak
dibahas prapengolahan citra untuk objek yang mengalami rotasi atau miring.
Penggunaan pena dengan tinta cair dilakukan supaya angka yang dituliskan memiliki
ketebalan warna yang baik. Perbedaan penulisan menggunakan pena tinta cair dengan
tinta biasa dapat dilihat pada gambar 3.2.
Gambar 3.2 Tulisan menggunakan tinta cair (kiri) dan tinta biasa (kanan)
26
Total seluruh data sampel adalah 360 angka tulisan tangan. Dari total data
tersebut, dibagi penggunaannya untuk data pelatihan dan data pengujian. Banyaknya
data pelatihan adalah 260 angka tulisan tangan (26 pola), dan banyaknya data
pengujian adalah 100 angka tulisan tangan (10 pola) baru yang tidak dilatihkan. Data
sampel yang digunakan pada penelitian ini dapat dilihat pada lampiran B.
Grayscaling
Noise Reduction
Thresholding
Filling
Cropping
Normalization
Thinning
Pengolahan citra dimulai dengan mengubah citra warna (RGB) menjadi citra
grayscale, kemudian dilakukan pengurangan derau pada citra tersebut, selanjutnya
dilakukan proses thresholding untuk mendapatkan citra biner. Tahap selanjutnya
adalah proses filling untuk mengubah piksel putih yang dikelilingi oleh beberapa
piksel hitam menjadi hitam dan kemudian akan dipotong dan dinormalisasi menjadi
ukuran 60x90 piksel. Citra yang sudah dinormalisasi kemudian dithinning untuk
27
mendapatkan kerangka dari objek angka. Citra hasil thinning ini adalah citra yang
dapat digunakan pada tahap ekstraksi fitur. Tahap-tahap prapengolahan citra
dijelaskan pada bab selanjutnya.
Tahap pemrosesan citra dimulai dengan mengubah citra warna (RGB) menjadi citra
keabuan. Nilai R (merah), G (hijau) dan B (biru) dari setiap piksel dijumlahkan dan
dihitung rata-ratanya. Nilai dari proses ini adalah nilai keabuan (grayscale) 8 bit
dengan rentang 0 (hitam) - 254 (putih). Flowchart proses grayscaling dapat dilihat
pada gambar 3.4.
Start
Inisialisasi
img(RGB)
tinggi img(height)
lebar img(width)
x, y
y0
yy+1
y < tinggi
No
End
Yes
x0
No
x < lebar
xx+1
Yes
img(x, y) (R + G + B)/3
28
Contoh citra RGB yang diubah menjadi citra keabuan dapat dilihat pada
gambar 3.5.
Pada citra keabuan yang didapatkan dari proses grayscale kemudian dilakukan proses
pengurangan derau. Proses ini akan menghilangkan derau yang terdapat di sekitar
objek angka tulisan tangan. Teknik penghilangan derau yang digunakan pada
penelitian ini adalah median filter. Tahapan dari proses ini dapat dilihat pada sub bab
2.2.2 mengenai noise reduction. Contoh citra hasil pengurangan derau dapat dilihat
pada gambar 3.6.
Citra keabuan yang telah melalui proses penghilangan derau kemudian akan diubah
menjadi citra biner, yaitu citra yang hanya memiliki dua nilai warna, yaitu 0 (hitam)
dan 254 (putih). Pada tahap ini ditentukan nilai threshold yang akan menjadi batasan.
Nilai threshold dimasukkan oleh pengguna sebelum proses dimulai. Pada penelitian
ini nilai threshold yang digunakan adalah 190. Nilai yang lebih kecil dari threshold
29
diubah menjadi 0 dan nilai yang lebih besar dari threshold diubah menjadi 254.
Flowchart proses thresholding dapat dilihat pada gambar 3.7.
Start
Inisialisasi
img (hasil Noise reduction)
tinggi img(height)
lebar img(width)
threshold, x, y
y0
y < tinggi
No
End
Yes
x0
yy+1
No
x < lebar
Yes
Yes
img(x, y) 255
No
img(x, y) 0
xx+1
Contoh citra keabuan yang diubah menjadi citra biner dapat dilihat pada
gambar 3.8.
30
Pemrosesan citra selanjutnya adalah pengisian piksel putih (filling). Pada citra hasil
threshold ada kemungkinan terdapat piksel putih yang dikelilingi oleh beberapa piksel
hitam. Pada penelitian ini, piksel putih yang dikelilingi oleh 5, 6, 7 atau 8 piksel hitam
diubah menjadi warna hitam. Hal ini dilakukan agar setelah proses thinning tidak
terjadi
lingkaran sehingga tidak terbentuk tulang objek yang seharusnya. Flowchart proses
filling dapat dilihat pada gambar 3.9.
31
Start
img(x-1, y) = 0
img (hasil Thresholding)
tinggi img(height)
lebar img(width)
tetangga
x, y
Yes
tetangga tetangga + 1
Yes
tetangga tetangga + 1
Yes
tetangga tetangga + 1
Yes
tetangga tetangga + 1
Yes
tetangga tetangga + 1
Yes
tetangga tetangga + 1
Yes
tetangga tetangga + 1
Yes
tetangga tetangga + 1
No
img(x-1, y-1) = 0
y1
No
End
No
y < tinggi
img(x, y-1) = 0
Yes
No
x1
Yes
img(x+1, y-1) = 0
x < lebar
No
yy+1
No
Yes
tetangga 0
img(x+1, y) = 0
No
img(x, y) = 255
img(x+1, y+1) = 0
No
No
No
tetangga > 4
img(x, y+1) = 0
Yes
img(x, y) 0
No
No
xx+1
img(x-1, y+1) = 0
32
33
i0
Start
Yes
Inisialisasi
img (hasil Filling)
tinggi img(height)
lebar img(width)
img_temp, tinggi_temp 0,lebar_temp 0
a10, a20, b10, b20
hist_hor[img(height)] 0
hist_ver[img(width)] 0
x, y, i
No
ii+1
y0
i < tinggi
y < tinggi
No
x0
No
No
Yes
a1 i
No
i tinggi - 1
Yes
Yes
yy+1
hist_hor[i] = 0
AND
hist_hor[i+1] > 0
hist_hor[i] = 0
AND
hist_hor[i-1] > 0
ii-1
Yes
a2 i
x < lebar
i >= 0
No
i0
Yes
No
img(x, y) = 0
No
xx+1
Yes
Yes
No
hist_ver[i] = 0
AND
hist_ver[i+1] > 0
Yes
hist_hor[y]
hist_hor[y] + 1
ii+1
b1 i
x0
i < tinggi
No
i lebar - 1
x < lebar
Yes
Yes
y0
No
xx+1
No
y < tinggi
hist_ver[i] = 0
AND
hist_ver[i-1] > 0
ii-1
Yes
b2 i
Yes
i >= 0
img(x, y) = 0
No
No
yy+1
tinggi_temp b2-b1+1
lebar_temp a2-a1+1
Yes
34
hist_ver[x]
hist_ver[x] + 1
34
33
y a1
No
img.resize(b2-b1+1, a2-1+1)
y0
y <= a2
Yes
y <= tinggi_temp
No
x b1
Yes
x0
yy+1
No
x <= b2
Yes
yy+1
img(x, y) = 0
No
No
xx+1
Yes
Yes
img_temp(x, y) = 0
img_temp(x-b1, y-a1) 0
No
Yes
img(x, y) 255
img(x, y) 0
Contoh citra biner yang dipotong dapat dilihat pada gambar 3.12.
End
35
Citra hasil pemotongan (crop) memiliki resolusi yang berbeda-beda sehingga belum
dapat digunakan sebagai masukan standar untuk diekstrak. Citra tersebut harus
dinormalisasi, yaitu mengubah resolusi citra menjadi resolusi yang sesuai untuk
diekstrak yaitu 60x90 piksel. Contoh citra hasil pemotongan yang dinormalisasi dapat
dilihat pada gambar 3.13.
Proses selanjutnya adalah pengurusan objek citra, yaitu objek angka tulisan tangan
yang terdapat pada citra akan dikuruskan (thinning) hingga ketebalannya hanya 1
piksel tetapi tidak merubah informasi dan karakteristik penting dari objek tersebut.
Melalui proses pengurusan ini akan didapatkan kerangka dari objek angka tulisan
tangan. Pengenalan objek seperti huruf atau silhouette akan lebih mudah dengan
memperhatikan kerangkanya (Phillips, 2000). Aloritma thinning ada banyak yang
tersedia, pada penelitian ini akan digunakan algoritma thinning Zhang-Suen.
Algoritma Zhang-Suen menggunakan metode paralel dimana nilai baru bagi tiap-tiap
piksel dihasilkan dari nilai piksel pada iterasi sebelumnya. Tahapan dari proses ini
dapat dilihat pada sub bab 2.2.4 mengenai thinning. Contoh citra hasil thinning dapat
dilihat pada gambar 3.14.
36
Citra hasil thinning ini adalah hasil akhir dari seluruh tahap prapengolahan
citra. Citra ini dapat digunakan pada tahap ekstraksi fitur.
Pada penelitian ini ekstraksi fitur dilakukan menggunakan kombinasi metode zoning
dan diagonal based feature extraction. Kedua metode tersebut akan dilakukan secara
berurutan, pertama zoning dan kedua diagonal based feature extraction (DBFE). Nilai
fitur yang didapatkan dari kedua metode tersebut akan digabungkan, yaitu
menyambung nilai fitur yang didapatkan dari metode zoning dengan diagonal based
feature extraction. Nilai fitur dari kedua metode tersebut disimpan pada satu matrik
yang sama. Nilai fitur yang didapatkan dari metode zoning disimpan dari indeks 0
sampai indeks n dan nilai fitur yang didapatkan dari metode diagonal based feature
extraction disimpan dari index n+1 sampai indeks m. Matrik nilai fitur dapat dilihat
pada gambar 3.15.
..
Zoning
n+1
..
Diagonal based feature extraction
37
Dari setiap zona tersebut akan diproses untuk mendapatkan nilai fitur.
Pembagian zona yang sama juga dilakukan pada penelitian ini terhadap kombinasi
metode ekstraksi yang digunakan.
38
Hitung histogram
diagonal setiap zona
Hitung rata-rata
histogram diagonal
setiap zona
Nilai fitur = nilai zona, rata-rata histogram zona, rata-rata zona per baris, rata-rata zona per kolom
Dari diagram di atas, proses sebelah kiri adalah metode zoning dan proses
sebelah kanan adalah metode diagonal based feature extraction. Kedua metode
ekstraksi tersebut dijelaskan pada bab berikut.
2.
3.
39
Dari ekstraksi zoning didapatkan 54 nilai fitur yang mewakili setiap zona.
Flowchart dari proses ekstraksi zoning dapat dilihat pada gambar 3.18.
40
y0
Start
Inisialisasi
ZONA_L 6, ZONA_T 9
img (hasil Thinning)
tinggi img(height), lebar img(width)
piksel_zona[ZONA_T][ZONA_L] 0.0
piksel_zona_max 0.0
x, y, k, l
yy+1
y < ZONA_T
No
End
No
Yes
x0
y0
No
x < ZONA_L
y y + 10
y < tinggi
Yes
Yes
piksel_zona[y][x]
piksel_zona[y][x] /
piksel_zona_max
x0
No
x x + 10
x < lebar
piksel_zona_max
piksel_zona[y/10][x/10]
Yes
ky
kk+1
k < y + 10
No
Yes
piksel_zona[y/10][x/10]
>
piksel_zona_max
No
Yes
lx
No
l < x + 10
ll+1
Yes
No
img(l, k) = 0
Yes
piksel_zona[y/10][x/10]
piksel_zona[y/10][x/10] + 1
xx+1
41
3.
42
Baris 6 = (Z31+Z32+Z33+Z34+Z35+Z36) / 6
Baris 7 = (Z37+Z38+Z39+Z40+Z41+Z42) / 6
Baris 8 = (Z43+Z44+Z45+Z46+Z47+Z48) / 6
Baris 9 = (Z49+Z50+Z51+Z52+Z53+Z54) / 6
4.
Dari metode diagonal based feature extraction didapatkan 54 nilai fitur ratarata histogram diagonal setiap zona, 9 nilai fitur rata-rata zona setiap baris dan 6 nilai
fitur rata-rata zona setiap kolom kolom. Total nilai fitur yang didapatkan dari metode
ini adalah 69 nilai fitur. Flowchart proses ekstraksi diagonal based feature extraction
dapat dilihat pada gambar 3.20.
43
Start
y0
ZONA_L 6, ZONA_T 9
img (hasil Thinning)
tinggi img(height), lebar img(width)
jml_piksel_zona 0
jml_hor 0.0, jml_ver 0.0
rata_rata_zona[ZONA_T][ZONA_L] 0.0
rata_rata_hor[ZONA_T] 0.0
rata_rata_ver[ZONA_L] 0.0
int x, y, k, l
yy+1
y < ZONA_T
No
Yes
x0
y0
xx+1
x < ZONA_L
y y + 10
y < tinggi
Yes
Yes
No
jml_hor jml_hor +
rata_rata_zona[y][x]
No
x0
rata_rata_hor[y]
jml_hor / ZONA_L
x x + 10
x < lebar
jml_hor 0
Yes
x0
jml_piksel_zona 0
ky
xx+1
kk+1
k < y + 10
No
rata_rata_zona[y/10][x/10]
jml_piksel_zona / 19
x < ZONA_L
No
End
Yes
y0
Yes
lx
y < ZONA_T
No
l < x + 10
ll+1
Yes
No
Yes
No
yy+1
jml_ver jml_ver +
rata_rata_zona[x][y]
img(l, k) = 0
rata_rata_ver[x]
jml_hor / ZONA_T
Yes
jml_ver 0
Jml_piksel_zona
jml_piksel_zona + 1
44
54 nilai fitur yang didapatkan dari metode zoning digabungkan dengan 69 fitur yang
didapatkan dari metode diagonal based feature extraction untuk mendapatkan 123
nilai fitur. 123 nilai fitur tersebut disimpan pada matrik dengan ukuran 1x123 seperti
pada gambar 3.21.
..
53
54
Zoning
..
122
Nilai fitur yang didapatkan dari proses ekstraksi fitur ini digunakan sebagai
masukan terhadap jaringan propagasi balik.
Setelah dilakukan tahap ekstraksi fitur maka dapat dilakukan tahap selanjutnya yaitu
klasifikasi menggunakan jaringan propagasi balik. Pada tahap ini, nilai fitur yang
didapatkan dari tahap ekstraksi fitur digunakan sebagai masukan bagi lapis masukan
jaringan propagasi balik. Tahap klasifikasi terdiri dari dua proses, yaitu proses
pelatihan dan proses pengujian. Pada tahap pelatihan dilakukan pelatihan jaringan
menggunakan nilai fitur yang didapatkan dari data latihan. Jaringan harus dilatih
terlebih dahulu agar dapat kemudian digunakan. Setelah tahap pelatihan, jaringan
propagasi balik dapat digunakan untuk tahap pengujian menggunakan nilai fitur yang
didapatkan dari data uji. Sebelum dapat dilakukan pelatihan dan pengujian, jaringan
harus dirancang terlebih dahulu.
45
Berdasarkan jumlah nilai fitur yang didapatkan dari tahap ekstraksi fitur, yaitu 123,
maka jumlah neuron pada lapis masukan jaringan propagasi balik adalah 123 neuron.
Jumlah neuron pada lapis keluaran adalah 10 karena pada penelitian ini akan
dilakukan klasifikasi 10 karakter angka, yaitu angka 0 sampai 9. Setiap angka
direpresentasikan oleh 10 nilai keluaran dari setiap neuron pada lapisan keluaran.
Nilai keluaran setiap angka dapat dilihat pada tabel 3.1.
Angka
0000000001
0000000010
0000000100
0000001000
0000010000
0000100000
0001000000
0010000000
0100000000
1000000000
memiliki tingkat variasi yang tinggi. Dan juga membantu menguji arsitektur dan
parameter jaringan yang digunakannya untuk kasus pengenalan angka tulisan tangan.
Dari penelitian yang telah dilakukan oleh Khairunnisa, berikut adalah spesifikasi
jaringan yang memberikan tingkat generalisasi paling tinggi :
46
Inisialisasi Nguyen-Widrow
Momentum 0.5
b1
b2
v0,1
w0,1
v0,2
w0,2
w1,0
V0,100
x1
v03
v1,1
v1,2
z1
w1,2
v1,3
w1,10
v2,1
v2,2
z2
v2,3
v2,100
w2,1
w2,2
y2
w2,3
w2,10
v3,1
w3,1
v3,2
x3
w3,2
z3
v3,3
v3,100
w100,2
v69,2
w100,1
v69,3
v69,100
y3
w3,3
w3,10
v69,1
x123
y1
w1,3
v1,100
x2
w0,3
w1,1
w100,3
z96
w100,10
y10
47
output ke-k. vij adalah bobot koneksi antara unit ke-i lapisan input dengan unit ke-j
lapisan tersembunyi, sedangkan wjk adalah bobot koneksi antara unit ke-j lapisan
tersembunyi dengan unit ke-k lapisan output.
Proses pelatihan dilakukan untuk melatih jaringan agar dapat mengenali angka tulisan
tangan, baik yang dilatihkan maupun tidak dilatihkan. Setiap pelatihan dilakukan
menggunakan parameter-parameter yang telah ditentukan. Pelatihan jaringan
propagasi balik terdiri dari tiga tahap, yaitu umpan maju, pemropagasian error, dan
perbaikan nilai bobot. Ketiga tahapan tersebut terus dilakukan sampai error keluaran
jaringan lebih kecil dari toleransi error atau dicapai maksimal epoch. Bobot terakhir
yang didapatkan dari proses pelatihan digunakan pada proses pengujian. Tahapan
proses pelatihan jaringan dapat dilihat pada bab 2.5 mengenai algoritma propagasi
balik.
48
Proses pengujian adalah menguji jaringan yang telah dilatihkan untuk mengenali data
uji yang tidak digunakan pada tahap pelatihan jaringan. Menggunakan bobot yang
didapatkan setelah proses pelatihan, jaringan diharapkan mampu mengenali angka
yang terdapat pada data uji. Tahap pengujian hanya menggunakan tahap umpan maju
yang dipakai untuk mencari nilai keluaran lapisan tersembunyi dan lapisan keluaran.
Tahapan proses pengujian dapat dilihat pada bab 2.5 mengenai algoritma propagasi
balik.
BAB 4
4.1 Implementasi
Analisis dan pemodelan pengenalan angka tulisan tangan yang telah dilakukan pada
bab sebelumnya harus diimplementasikan ke dalam kode program agar dapat
dilakukan pengujian untuk mengetahui kemampuan kombinasi metode zoning dan
diagonal based faeature extraction.
2.
Modul inisialisasi
Merupakan modl untuk melaksanakan inisialisasi bobot awal.
3.
4.
5.
50
pengolahan citra, maka pada penelitian ini digunakan modul tambahan untuk proses
pengolahan citra, yaitu modul CImg. Modul ini dapat diunduh dari situs resminya
http://cimg.sourceforge.net. Fungsi-fungsi dari modul CImg yang digunakan dapat
dilihat pada tabel 4.1.
Deskripsi Fungsi
Fungsi untuk membuat objek dengan nama img dari kelas
CImg dengan tipe template pixel float. Filename (string)
adalah nama file yang akan dijadikan objek.
Contoh : CImg<float> img(Lena.bmp);
CImg<float> img(x,
y, z, channel,
color)
img.save(filename)
img(x, y, 0)
img.width()
51
Deskripsi Fungsi
Fungsi untuk mendapatkan nilai tinggi dari objek CImg
dengan nama img.
img.resize(x, y)
Seluruh kode program yang telah dibuat dapat dilihat pada lampiran A.
4.2 Pengujian
Ketiga jaringan tersebut memiliki lapis tersembunyi dan lapis keluaran yang sama,
yaitu 96 neuron lapis tersembunyi dan 10 neuron lapis keluaran. Lapis masukan
dibangun sesuai dengan metode ekstraksi yang digunakan, yaitu zoning (54 neuron
52
masukan), diagonal based feature extraction (69 neuron masukan) dan kombinasinya
(123 neuron masukan). Arsitektur ketiga jaringan tersebut dapat dilihat pada tabel 4.2.
Metode Ekstraksi
Lapis
Masukan
Lapis
Tersembunyi
Lapis
Keluaran
Zoning
54
96
10
69
96
10
123
96
10
II
III
Setelah ketiga jaringan tersebut dilatih, dilakukan pengujian tingkat pengenalan dari
ketiga jaringan tersebut. Tingkat pengenalan diuji menggunakan diuji menggunakan
data uji, yaitu data baru yang tidak digunakan pada tahap pelatihan. Data yang
digunakan untuk pengujian adalah 100 pola angka (Lampiran B). Hasil pengenalan
data uji dari ketiga jaringan yang diujikan dapat dilihat pada tabel 4.3, tabel 4.4 dan
tabel 4.5 untuk jaringan I, II dan III.
Pola
0
1
2
3
4
5
Target
0
0
0
0
0
0
Matrik Output
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
Output
0
0
0
0
0
0
53
54
Pola
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
Target
5
5
5
5
5
5
5
5
5
5
5
6
6
6
6
6
6
6
6
6
7
7
7
7
7
7
7
7
7
7
8
8
8
8
8
8
8
8
8
8
9
9
9
9
Matrik Output
0000100000
0000100000
0000101000
0000100000
0000100000
0000100000
0000100000
0000000000
0000100000
0000100000
0001000000
0001000000
0000000000
0001000000
0001000000
0001000000
0001000000
0001000000
0001000000
0101000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
1100000000
0000000100
0000000000
0100000000
0100000000
0100000000
0100000000
0100000000
0000000000
0100000000
1100000000
0000000000
0000000000
1000000000
Output
5
5
5
5
5
5
5
5
6
6
6
6
6
6
6
6
7
7
7
7
7
7
7
7
7
7
2
8
8
8
8
8
8
9
55
Pola
94
95
96
97
98
99
Target
9
9
9
9
9
9
Matrik Output
1000000000
1000000000
1000000000
1000000000
1000000000
1000000000
Output
9
9
9
9
9
9
Tabel 4.4 Hasil pengenalan data uji jaringan II (Diagonal Based Feature
Extraction)
Jaringan
II
Pola
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Target
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
2
2
2
2
2
2
2
2
2
2
3
3
Matrik Output
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0001000000
0000000100
0000000100
0000000100
0000000100
0000000100
0010000100
0000000100
0000000100
0000000100
0000001000
0000001000
Output
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
6
2
2
2
2
2
2
2
2
3
3
56
57
Pola
0
1
2
3
4
5
6
7
8
9
10
11
12
Target
0
0
0
0
0
0
0
0
0
0
1
1
1
Matrik Output
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000001
0000000010
0000000010
0000000010
Output
0
0
0
0
0
0
0
0
0
0
1
1
1
58
Tabel 4.5 Hasil pengenalan data uji jaringan III (Zoning dan Diagonal
Based Feature Extraction) (lanjutan)
Jaringan
III
Pola
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Target
1
1
1
1
1
1
1
2
2
2
2
2
2
2
2
2
2
3
3
3
3
3
3
3
3
3
3
4
4
4
4
4
4
4
4
4
4
5
5
5
5
5
5
Matrik Output
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0000000010
0001000000
0000000100
0000000100
0000000100
0000000100
0000000100
0000000100
0000000100
0000000100
0000000100
0000001000
0000001000
0000001000
1000000000
0000001000
0000000000
0000001000
0000001000
0000001000
1000001000
0000010000
0000010000
0000010000
0000010000
0001000000
0000010000
0000010000
0000010000
0000010000
0000010000
0000100000
0000100000
0000101000
0000100000
0000100000
0000100000
Output
1
1
1
1
1
1
1
6
2
2
2
2
2
2
2
2
2
3
3
3
9
3
3
3
3
4
4
4
4
6
4
4
4
4
4
5
5
5
5
5
59
Tabel 4.5 Hasil pengenalan data uji jaringan III (Zoning dan Diagonal
Based Feature Extraction) (lanjutan)
Jaringan
Pola
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
Target
5
5
5
5
5
6
6
6
6
6
6
6
6
6
7
7
7
7
7
7
7
7
7
7
8
8
8
8
8
8
8
8
8
8
9
9
9
9
9
9
9
9
9
9
Matrik Output
0000100000
0000000000
0000100000
0000100000
0001000000
0001000000
0000000001
0001000000
0001000000
0001000000
0001000000
0001000000
0001000001
0001000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0010000000
0100000000
0000000100
1000000000
0100000000
0100000000
0100000000
0100000000
0100000000
0100000000
0100000000
1000000000
1100000000
0000000000
1000000000
1000000000
1000000000
1000000000
1000000000
1000000000
1000000000
Output
5
5
5
6
6
0
6
6
6
6
6
6
7
7
7
7
7
7
7
7
7
7
8
2
9
8
8
8
8
8
8
8
9
9
9
9
9
9
9
9
60
Dari tabel 4.3, tabel 4.4 dan tabel 4.5 diketahui tingkat pengelan dari ketiga
jaringan tersebut seperti pada tabel 4.6.
Metode Ekstraksi
Pengenalan
(/100)
Tingkat
Pengenalan (%)
Zoning
80
80
II
85
85
III
87
87
Dari tabel 4.6 diketahui bahwa tingkat pengenalan jaringan yang menggunakan
kombinasi metode zoning dan diagonal based feature extraction lebih tinggi dari
jaringan yang menggunakan metode zoning dan jaringan yang menggunakan metode
diagonal based feature extraction.
BAB 5
5.1 Kesimpulan
Berdasarkan hasil analisis dan pengujian yang dilakukan pada bab-bab sebelumnya,
dapat disimpulan bahwa penggunaan kombinasi metode zoning dan diagonal based
feature extraction dapat menambah tingkat pengenalan jaringan propagasi balik. Dari
pengujian yang dilakukan dicapai tingkat pengenalan sebesar 87%, yaitu lebih tinggi
dari penggunaan satu metode saja, yaitu yaitu 80% untuk penggunaan metode zoning
dan 85% untuk penggunaan metode diagonal based feature extraction.
5.2 Saran
Pada penelitian ini, jaringan yang digunakan hanya dilatih hingga mencapai batas
error 0.01. Nilai error yang dicapai setelah pelatihan belum tentu merupakan kondisi
global minimum. Oleh karena itu perlu dilakukan penelitian selanjutnya untuk
mencapai kondisi global minimum, agar mendapatkan tingkat pengenalan yang lebih
baik.
62
DAFTAR PUSTAKA
Jain, A. K. dan Taxt, T. 1996. Feature Extraction Methods for Character RecognitionASurvey. Pattern Recognition. 29(4): 641-662.
63
Lauer, F., Suen, C. Y. dan Bloch, G. A Trainable Feature Extractor for Handwritten
Digit Recognition. Patter Recognition. 40(6):1816-1824.
Pradeep, J., Srinivasan, E., dan Himavathi, S. 2011. Diagonal Based Feature
Extraction for Handwritten Alphabets Recognition System Using Neural
Network. International Journal of Computer Science & Information
Technology (IJCSIT). 3(1): 27-38.
Putra, D. 2009. Sistem Biometrika, Konsep Dasar, Teknik Analisis Citra, dan Tahapan
Membangun Aplikasi Sistem Biometrika. Yogyakarta: Andi.
64
65
1.
Main.cpp
/*
Nama file : Main.cpp
Deskrpisi : Modul menu utama untuk menjalankan semua proses
pengenalan angka tulisan tangan
*/
#include
#include
#include
#include
#define
#define
#define
#define
#define
<iostream.h>
<ctype.h>
<stdlib.h>
<fstream.h>
MENU_PRE "preprocessing.exe"
MENU_INIT "initialization.exe"
MENU_TRAIN "training.exe"
MENU_TEST "testing.exe"
MENU_PRE_DISPLAY "preprocessing_display.exe"
void show_menu()
{
cout << endl;
cout << "Main Menu
-" << endl;
cout << "=====================" << endl;
cout << "1. Preprocessing" << endl;
cout << "2. Training" << endl;
cout << "3. Testing" << endl;
cout << "4. Preprocessing Example" << endl;
cout << "8. Initialization" << endl;
cout << "9. About" << endl;
cout << "0. Exit" << endl << endl;
}
int main()
{
system("TITLE Pengenalan Angka Tulisan Tangan");
int no_menu;
do
{
show_menu();
cout << "Menu? ";
cin >> no_menu;
if(no_menu == 1)
{
cout << endl << "PREPROCESSING" << endl;
cout << "=============" << endl;
system(MENU_PRE);
}
else if(no_menu == 2)
{
cout << endl << "TRAINING" << endl;
cout << "========" << endl;
66
system(MENU_TRAIN);
}
else if(no_menu == 3)
{
cout << endl << "TESTING" << endl;
cout << "========" << endl;
system(MENU_TEST);
}
else if(no_menu == 4)
{
cout << endl << "PREPROCESSING EXAMPLE" << endl;
cout << "=====================" << endl;
system(MENU_PRE_DISPLAY);
}
else if(no_menu == 8)
{
cout << endl << "INITALIZATION" << endl;
cout << "=============" << endl;
system(MENU_INIT);
}
else if(no_menu == 9)
{
cout << endl;
cout << "Nanda Putra - 081402030" << endl;
cout << "S1 Teknologi Informasi USU" << endl;
cout << "Fakultas Ilmu Komputer dan Teknologi
Informasi" << endl;
cout << "Universitas Sumatera Utara" << endl;
cout << endl;
system("pause");
}
else if(no_menu == 0)
{
break;
}
else
no_menu = 99;
}while(no_menu != 0);
cout << "Goodbye :)" << endl;
system("pause");
return 0;
}
2.
Preprocessing.cpp
/*
Nama file : Preprocessing.cpp
Deskrpisi : Modul Preprocessing untuk melakukan proses
prapengolahan citra dan ekstraksi fitur.
Proses prapengolahan citra yang dilakukan adalah
:Grayscale, Noise Reduction, Threshold, Filling, Crop, Resize,
Thinning
Proses ekstraksi fitur yang dilakukan adalah :
Zoning dan Diagonal Based Feature Extraction
*/
67
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <string.h>
#define LEBAR 60
#define TINGGI 90
#define ZONA_L 6
#define ZONA_T 9
#define NIN 123
#include "CImg.h"
using namespace cimg_library;
int main()
{
int n, m, i, j, k, l;
//n dan m untuk pengulangan images |
i, j, k, l untuk pengulangan biasa
char filename[30]; //string untuk menyimpan nama file image
char folder_raw[20];
//string untuk menyimpan lokasi
folder raw image
char folder[20];
//string untuk menyimpan lokasi folder
image
int nImages;
//variabel jumlah image
int no_menu;
//variabel untuk menu pelatihan atau
pengujian
//Variabel untuk fungsi Grayscale
float valR, valG, valB, avg;
//Deklarasi variable untuk
RGB dan avg(nilai grayscale)
//Variabel untuk fungsi Threshold
int threshold; //variabel threshold
cout
cout
cout
cout
<<
<<
<<
<<
if(no_menu == 1)
{
strcpy(folder_raw,"data_latihan_raw");
strcpy(folder,"data_latihan");
}
else if(no_menu == 2)
{
strcpy(folder_raw,"data_uji_raw");
strcpy(folder,"data_uji");
}
else
{
strcpy(folder_raw,"data_latihan_raw");
strcpy(folder,"data_latihan");
}
cout << "Jumlah pola : "; cin >> nImages;
image
cout << "Threshold : "; cin >> threshold;
threshold untuk binary image
//input jumlah
//input nilai
68
69
img(j, i, 2) = avg;
}
}
// Noise Reduction
CImg<float> img_noise(img.width()+2, img.height()+2,
1, 3, 255);
float matrik[9];
float temp;
// Copy img ke img_noise dengan batas
for(i=1; i<img.height()+1; i++)
{
for(j=1; j<img.width()+1; j++)
{
img_noise(j, i, 0) = img(j-1,
img_noise(j, i, 1) = img(j-1,
img_noise(j, i, 2) = img(j-1,
}
}
keliling 1 px
i-1, 0);
i-1, 1);
i-1, 2);
=
=
=
=
=
=
=
=
=
// Sortir matrik
for(int a=0; a<9; a++)
{
for(int b=a; b<9; b++)
{
if(matrik[b] < matrik[a])
{
temp = matrik[a];
matrik[a] = matrik[b];
matrik[b] = temp;
}
}
}
// Set kembali img
img(j-1, i-1, 0) =
img(j-1, i-1, 1) =
img(j-1, i-1, 2) =
}
nilai median
matrik[5];
matrik[5];
matrik[5];
70
}
// Threshold
for(i=0; i<img.height(); i++)
//Pengulangan untuk
tinggi
{
for(j=0; j<img.width(); j++)
//Pengulangan
untuk lebar
{
if(img(j, i, 0)>threshold) //Cek nilai piksel
{
img(j, i, 0) = 255;
//Set nilai 254
(putih/background) ke pixel (j,i), jika nilai warna > threshold
img(j, i, 1) = 255;
img(j, i, 2) = 255;
}
else
{
img(j, i, 0) = 0;
//Set nilai 0 (hitam)
ke pixel (j,i), jika nilai warna < threshold
img(j, i, 1) = 0;
img(j, i, 2) = 0;
}
}
}
// Filling
int tetangga;
for(i=1; i<img.height(); i++)
//Pengulangan untuk
tinggi
{
for(j=1; j<img.width(); j++)
//Pengulangan
untuk lebar
{
tetangga = 0;
if(img(j, i, 0) == 255)
{
if(img(j-1, i, 0) == 0)
tetangga++;
if(img(j-1, i-1, 0) == 0)
tetangga++;
if(img(j, i-1, 0) == 0)
tetangga++;
if(img(j+1, i-1, 0) == 0)
tetangga++;
if(img(j+1, i, 0) == 0)
tetangga++;
if(img(j+1, i+1, 0) == 0)
tetangga++;
if(img(j, i+1, 0) == 0)
tetangga++;
if(img(j-1, i+1, 0) == 0)
tetangga++;
}
if(tetangga >
{
img(j, i,
img(j, i,
img(j, i,
4)
0) = 0;
1) = 0;
2) = 0;
71
}
}
}
// Crop
//Hitung histogram horizontal
for(i=0; i<img.height(); i++)
//Pengulangan untuk
tinggi
{
for(j=0; j<img.width(); j++)
//Pengulangan
untuk lebar
{
if(img(j, i, 0) == 0)
hist_hor[i] += 1;
}
}
//Hitung histogram vertikal
for(i=0; i<img.width(); i++)
//Pengulangan untuk
lebar
{
for(j=0; j<img.height(); j++)
//Pengulangan
untuk tinggi
{
if(img(i, j, 0) == 0)
hist_ver[i] += 1;
}
}
//Cari a1
for(i=0; i<img.height(); i++)
{
if(hist_hor[i] == 0 && hist_hor[i+1] > 0)
{
a1 = i;
break;
}
}
//Cari a2
for(i=img.height()-1; i>=0; i--)
{
if(hist_hor[i] == 0 && hist_hor[i-1] > 0)
{
a2 = i;
break;
}
}
//Cari b1
for(i=0; i<img.width(); i++)
{
if(hist_ver[i] == 0 && hist_ver[i+1] > 0)
{
b1 = i;
break;
}
}
//Cari b2
72
73
74
}
//P(6) -> (7)
if(img(j, i+1, 0, 0) == 255)
{
if(img(j-1, i+1, 0, 0) == 0)
s_p1 += 1;
}
//P(7) -> (8)
if(img(j-1, i+1, 0, 0) == 255)
{
if(img(j-1, i, 0, 0) == 0)
s_p1 += 1;
}
//P(8) -> (9)
if(img(j-1, i, 0, 0) == 255)
{
if(img(j-1, i-1, 0, 0) == 0)
s_p1 += 1;
}
//P(9) -> (2)
if(img(j-1, i-1, 0, 0) == 255)
{
if(img(j, i-1, 0, 0) == 0)
s_p1 += 1;
}
//Jika S(P1)=1 && P2*P4*P6=0 &&
P4*P6*P8=0, maka tandai piksel untuk dihapus
if(s_p1 == 1 && (img(j, i-1, 0,
0) || img(j+1, i, 0, 0) || img(j, i+1, 0, 0) == 255) && (img(j+1,
i, 0, 0) || img(j, i+1, 0, 0) || img(j-1, i, 0, 0) == 255))
{
arr_flag[i][j] = 1;
jml_flag += 1;
}
}
}
n_p1 = s_p1 = 0; //Set N(P1) dan S(P1)
menjadi 0 kembali
}
}
//Hapus piksel yang ditandai dari pengulangan
thinning 1
for(i=0; i<img.height(); i++)
{
for(j=0; j<img.width(); j++)
{
if(arr_flag[i][j] == 1)
{
img(j, i, 0) = 255;
img(j, i, 1) = 255;
img(j, i, 2) = 255;
arr_flag[i][j] = 0; //Set kembali
arr_flag yang ditandai menjadi 0
}
}
}
75
76
77
78
79
pola += 1;
}
}
if(no_menu == 1)
{
//Tuliskan array input_jst ke dalam file input_jst.dat
ofstream out("data_latihan.dat", ios::binary);
out.write((char *)&nImages,sizeof(nImages));
out.write((char *)&threshold,sizeof(threshold));
out.write((char *)&input_jst,sizeof(input_jst));
out.close();
}
else if(no_menu == 2)
{
//Tuliskan array input_jst ke dalam file data_uji.dat
ofstream out("data_uji.dat", ios::binary);
out.write((char *)&nImages,sizeof(nImages));
out.write((char *)&threshold,sizeof(threshold));
out.write((char *)&input_jst,sizeof(input_jst));
out.close();
}
system("pause");
return 0;
}
3.
Initialization.cpp
/*
Nama file : Initialization.cpp
Deskrpisi : Program untuk melakukan inisialisasi bobot (NguyenWidrow)
*/
#include
#include
#include
#include
#include
#define
#define
#define
#define
<iostream.h>
<math.h>
<stdlib.h>
<fstream.h>
<time.h>
NIN 123
// jumlah neuron input
NH 96
// jumlah neuron hidden
NOUT 10
// jumlah neuron output
PATTERN 260
// jumlah pola
int main()
{
// Deklarasi array bobot input, hidden, output dan bias
double weightIH[NIN][NH];
double weightHO[NH][NOUT];
double biasH[NH];
double biasY[NOUT];
double deltaweightIH[NIN][NH];
double deltaweightHO[NH][NOUT];
// Input data
80
// Inisialisasi
// Jumlahkan
// Inisialisasi
rndnum = (unsigned)rand();
biasY[o] = ((rndnum%(int)(max-min)) + min) / pembagi;
}
//Tuliskan array bobot dan bias ke dalam file weight.dat
ofstream out("weight.dat", ios::binary);
out.write((char *)&weightIH,sizeof(weightIH));
out.write((char *)&biasH,sizeof(biasH));
out.write((char *)&weightHO,sizeof(weightHO));
81
out.write((char
out.write((char
out.write((char
out.write((char
out.close();
*)&biasY,sizeof(biasY));
*)&deltaweightIH,sizeof(deltaweightIH));
*)&deltaweightHO,sizeof(deltaweightHO));
*)&total_epoch,sizeof(total_epoch));
system("pause");
return 0;
}
4.
Training.cpp
/*
Nama file : Training.cpp
Deskrpisi : Program untuk melakukan pelatihan Backpropagation
untuk mengenali Angka Tulisan Tangan 0-9
Arsitektur : 123-96-10.
Inisialisasi bobot : Nguyen-Widrow
Fungsi Aktivasi : Sigmoid Biner
Error : Mean Square Error (MSE)
Ekstraksi Fitur : Zoning + Diagonal Based Feature
Extraction
*/
#include
#include
#include
#include
#include
#define
#define
#define
#define
<iostream.h>
<math.h>
<stdlib.h>
<fstream.h>
<time.h>
NIN 123
// jumlah neuron input
NH 96
// jumlah neuron hidden
NOUT 10
// jumlah neuron output
PATTERN 260
// jumlah pola
class backpropagation
{
// Deklarasi array neuron input, hidden, output dan target
double X[PATTERN][NIN];
double H[NH];
double Y[PATTERN][NOUT];
double targetY[NOUT][NOUT];
// Deklarasi array bobot input, hidden, output dan bias
double weightIH[NIN][NH];
double weightHO[NH][NOUT];
double biasH[NH];
double biasY[NOUT];
// Deklarasi array untuk perubahan bobot dan bias
double deltaY[NOUT];
double deltaH[NH];
double deltaweightIH[NIN][NH];
double deltaweightHO[NH][NOUT];
// Deklarasi jumlah nepoch, learning, momentum dan tanda
ditemukan solusi
82
int nepoch;
int epoch;
int total_epoch;
double error;
double learning_rate;
double momentum;
int nImages;
bool isFindSolution;
double mse;
public:
backpropagation();
backpropagation(double, int, double, double, int);
void init(double _X[PATTERN][NIN], double
_targetY[NOUT][NOUT], double _weightIH[NIN][NH], double
_weightHO[NH][NOUT], double _biasH[NH], double _biasY[NOUT],
double _deltaweightIH[NIN][NH], double _deltaweightHO[NH][NOUT],
int _total_epoch);
bool training();
void calNet(int, int);
void deltaChange(int, int);
void weightAndbiasChange(int);
void calMSE();
void printResult();
double sigmoid(double);
void saveWeight();
};
backpropagation::backpropagation()
{
learning_rate = 0.5;
nepoch = 10000;
error = 0.01;
momentum = 0.5;
nImages = 1;
}
backpropagation::backpropagation(double _learning_rate, int
_nepoch, double _error, double _momentum, int _nImages)
{
learning_rate= _learning_rate;
nepoch = _nepoch;
error = _error;
momentum = _momentum;
nImages = _nImages;
}
void backpropagation::init(double _X[PATTERN][NIN], double
_targetY[NOUT][NOUT], double _weightIH[NIN][NH], double
_weightHO[NH][NOUT], double _biasH[NH], double _biasY[NOUT],
double _deltaweightIH[NIN][NH], double _deltaweightHO[NH][NOUT],
int _total_epoch)
{
// Input data
int a, b, i, h, o, rndnum;
double beta, min, max, eucval, pembagi=10000.0;
total_epoch = _total_epoch;
// Inisialisasi X
83
84
do{
epoch++;
for(p=0; p<nImages*10; p++)
{
numberTarget = p / nImages;
calNet(p, numberTarget);
deltaChange(p, numberTarget);
weightAndbiasChange(p);
}
calMSE();
}while(!isFindSolution&&epoch<nepoch);
total_epoch += epoch;
return isFindSolution;
}
void backpropagation::calNet(int p, int numberTarget)
{
int i, h, o;
// Operasi pada hidden layer
for(h=0; h<NH; h++)
{
H[h] = 0.0;
for(i=0; i<NIN; i++)
{
H[h] += X[p][i] * weightIH[i][h];
}
H[h] += biasH[h];
// Fungsi Aktivasi
H[h] = sigmoid(H[h]);
}
// Operasi pada output layer
for(o=0; o<NOUT; o++)
{
Y[p][o] = 0.0;
for(h=0; h<NH; h++)
{
Y[p][o] += H[h] * weightHO[h][o];
}
Y[p][o] += biasY[o];
// Fungsi Aktivasi
Y[p][o] = sigmoid(Y[p][o]);
}
}
void backpropagation::deltaChange(int p, int numberTarget)
{
int h, o;
double sigmadeltaY;
// Hitung nilai deltaY
for(o=0; o<NOUT; o++)
85
{
deltaY[o] = (targetY[numberTarget][o]-Y[p][o]) * Y[p][o]
* (1.0-Y[p][o]);
}
// Hitung nilai deltaH
for(h=0; h<NH; h++)
{
sigmadeltaY = 0.0;
for(o=0; o<NOUT; o++)
{
sigmadeltaY += deltaY[o] * weightHO[h][o];
}
deltaH[h] = sigmadeltaY * H[h] * (1-H[h]);
}
}
void backpropagation::weightAndbiasChange(int p)
{
int i, h, o;
// Hitung perubahan bobot weightHO
for(h=0; h<NH; h++)
{
for(o=0; o<NOUT; o++)
{
deltaweightHO[h][o] = (learning_rate * deltaY[o] *
H[h]) + (momentum * deltaweightHO[h][o]);
weightHO[h][o] += deltaweightHO[h][o];
}
}
// Hitung perubahan bobot biasY
for(o=0; o<NOUT; o++)
{
biasY[o] += learning_rate * deltaY[o];
}
// Hitung perubahan bobot weightIH
for(i=0; i<NIN; i++)
{
for(h=0; h<NH; h++)
{
deltaweightIH[i][h] = (learning_rate * deltaH[h] *
X[p][i]) + (momentum * deltaweightIH[i][h]);
weightIH[i][h] += deltaweightIH[i][h];
}
}
// Hitung perubahan bobot biasH
for(h=0; h<NH; h++)
{
biasH[h] += learning_rate * deltaH[h];
}
}
void backpropagation::printResult()
{
int i, h, o, p, memorisasi;
if(isFindSolution)
86
{
cout << "Found Solution!" << endl;
}
else
{
cout << "Fail to find a solution" << endl;
}
memorisasi = 0;
for(p=0; p<nImages*10; p++)
{
// Ubah semua nilai Y menjadi 0 dan 1
for(o=0; o<NOUT; o++)
{
if(Y[p][o] >= 0.5)
{
Y[p][o] = 1;
}
else if (Y[p][o] < 0.5)
{
Y[p][o] = 0;
}
}
// Cek apakah Y = targetY
if(Y[p][0]==targetY[p/nImages][0] &&
Y[p][1]==targetY[p/nImages][1] &&
Y[p][2]==targetY[p/nImages][2] &&
Y[p][3]==targetY[p/nImages][3] &&
Y[p][4]==targetY[p/nImages][4] &&
Y[p][5]==targetY[p/nImages][5] &&
Y[p][6]==targetY[p/nImages][6] &&
Y[p][7]==targetY[p/nImages][7] &&
Y[p][8]==targetY[p/nImages][8] &&
Y[p][9]==targetY[p/nImages][9])
{
memorisasi ++;
}
}
cout << "Learning rate :
cout << "Momentum
:
cout << "MSE
:
cout << "Epoch
:
cout << "Total Epoch
:
cout << "Memorisasi
:
<< p-memorisasi << ") : " <<
endl;
}
void backpropagation::calMSE()
{
int a, b;
mse = 0.0;
for(a=0; a<nImages*10; a++)
{
for(b=0; b<NOUT; b++)
{
mse += pow(Y[a][b]-targetY[a/nImages][b], 2);
87
}
}
mse = ((mse/2))/(nImages*10);
cout << "mse " << mse << endl;
if(mse>error)
isFindSolution = false;
else
isFindSolution = true;
}
double backpropagation::sigmoid(double x)
{
return 1.0/(1.0+exp(-x));
}
void backpropagation::saveWeight()
{
//Tuliskan array bobot dan bias ke dalam file weight.dat
ofstream out("weight.dat", ios::binary);
out.write((char *)&weightIH,sizeof(weightIH));
out.write((char *)&biasH,sizeof(biasH));
out.write((char *)&weightHO,sizeof(weightHO));
out.write((char *)&biasY,sizeof(biasY));
out.write((char *)&deltaweightIH,sizeof(deltaweightIH));
out.write((char *)&deltaweightHO,sizeof(deltaweightHO));
out.write((char *)&total_epoch,sizeof(total_epoch));
out.close();
}
int main ()
{
// Variabel untuk menghitung lama waktu training
clock_t startT, endT;
double timeT;
int total_epoch;
// Deklarasi array bobot input, hidden, output dan bias yang
akan di set ke class
double weightIH[NIN][NH];
double weightHO[NH][NOUT];
double biasH[NH];
double biasY[NOUT];
double deltaweightIH[NIN][NH];
double deltaweightHO[NH][NOUT];
// Baca file weight.dat
ifstream in_weight("weight.dat", ios::binary);
in_weight.read((char*)&weightIH,sizeof(weightIH));
// Baca
weightIH
in_weight.read((char*)&biasH,sizeof(biasH));
// Baca biasH
in_weight.read((char*)&weightHO,sizeof(weightHO));
// Baca
weightHO
in_weight.read((char*)&biasY,sizeof(biasY));
// Baca biasY
in_weight.read((char*)&deltaweightIH,sizeof(deltaweightIH));
// Baca deltaweightIH
in_weight.read((char*)&deltaweightHO,sizeof(deltaweightHO));
// Baca deltaweightHO
in_weight.read((char*)&total_epoch,sizeof(total_epoch));
// Baca total_epoch
88
89
in.close();
system("pause");
return 0;
}
5.
Testing.cpp
/*
Nama file : Testing.cpp
Deskrpisi : Program untuk melakukan pengujian jaringan yang
telah dilatih
Arsitektur : 123-96-10.
Fungsi Aktivasi : Sigmoid Biner
*/
#include
#include
#include
#include
#include
#include
#include
<iostream.h>
<ctype.h>
<stdlib.h>
<fstream.h>
<math.h>
<conio.h>
<string.h>
double sigmoid(double x)
{
return 1.0/(1.0+exp(-x));
}
int main()
{
int no_menu, p, i, h, o, a, b, numberTarget, generalisasi=0,
counter_output;
char file_input[20];
// Deklarasi array bobot input, hidden, output dan bias
double weightIH[NIN][NH];
double weightHO[NH][NOUT];
double biasH[NH];
double biasY[NOUT];
// Baca file weight.dat
ifstream in_weight("weight.dat", ios::binary);
in_weight.read((char*)&weightIH,sizeof(weightIH));
// Baca
weightIH
in_weight.read((char*)&biasH,sizeof(biasH));
// Baca biasH
in_weight.read((char*)&weightHO,sizeof(weightHO));
// Baca
weightHO
in_weight.read((char*)&biasY,sizeof(biasY));
// Baca biasY
cout << "Pengujian :" << endl;
cout << "1. Memorisasi" << endl;
cout << "2. Generalisasi" << endl;
cout << "? ";
cin >> no_menu;
90
if(no_menu == 1)
{
strcpy(file_input,"data_latihan.dat");
}
else if(no_menu == 2)
{
strcpy(file_input,"data_uji.dat");
}
// Baca file data input jst
int nImages, threshold; //variabel jumlah image dan batas
threshold
ifstream in_data_jst(file_input, ios::binary);
in_data_jst.read((char*)&nImages,sizeof(nImages));
in_data_jst.read((char*)&threshold,sizeof(threshold));
double input_jst[10*nImages][NIN]; //array untuk menyimpan
final input untuk jst
in_data_jst.read((char*)&input_jst,sizeof(input_jst));
double H[NH];
double Y[10*nImages][NOUT];
// Deklarasi array untuk
menyimpan nilai output
double targetY[NOUT][NOUT] = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
{0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
{0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
{0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
////////////////////////
// Proses Testing
for(p=0; p<nImages*10; p++)
{
numberTarget = p / nImages;
// Operasi pada hidden layer
for(h=0; h<NH; h++)
{
H[h] = 0.0;
for(i=0; i<NIN; i++)
{
H[h] += input_jst[p][i] * weightIH[i][h];
}
H[h] += biasH[h];
// Fungsi Aktivasi
H[h] = sigmoid(H[h]);
}
// Operasi pada output layer
for(o=0; o<NOUT; o++)
{
Y[p][o] = 0.0;
for(h=0; h<NH; h++)
91
{
Y[p][o] += H[h] * weightHO[h][o];
}
Y[p][o] += biasY[o];
// Fungsi Aktivasi
Y[p][o] = sigmoid(Y[p][o]);
}
// Tampilkan output
counter_output = 0;
cout << "Pola " << p << " : ";
for(o=0; o<NOUT; o++)
{
//cout << Y[p][o] << " ";
if(Y[p][o] >= 0.5)
{
Y[p][o] = 1;
cout << "1 ";
counter_output++;
}
else if (Y[p][o] < 0.5)
{
Y[p][o] = 0;
cout << "0 ";
}
}
cout << "
cout << "
92
}
cout << b;
}
else
cout << "-";
cout << endl;
// Pisahkan setiap kelompok angka
if((p+1) % 10 == 0)
cout << endl;
//system("pause");
}
//
///////////////////////
cout <<
cout <<
cout <<
cout <<
nImages*10
endl;
endl;
"Threshold = " << threshold << endl;
"Jumlah pola = " << nImages << endl;
"Generalisasi = " << generalisasi << "/" <<
<< " = " << (generalisasi*100)/(nImages*10) << "%" <<
in_data_jst.close();
in_weight.close();
system("pause");
return 0;
}
93
1.
Data latihan
Pola
Citra
Pola
Citra
Pola
Citra
Pola
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Citra
94
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
95
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
96
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
97
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
98
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
99
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
100
2.
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
Data uji
Pola
Citra
Pola
Citra
Pola
Citra
Pola
10
11
12
13
Citra
101
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
102
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
103
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99