71
PENGENAL PELAT KENDARAAN BERMOTOR MENGGUNAKAN STROKE WIDTH TRANSFORM DAN JARINGAN SARAF TIRUAN Kiki Rizki Arpiandi PROGRAM STUDI MATEMATIKA FAKULTAS SAINS DAN TEKNOLOGI UNIVERSITAS ISLAM NEGRI SYARIF HIDAYATULLAH JAKARTA 2017 M / 1438 H

PENGENAL PELAT KENDARAAN BERMOTOR …

  • Upload
    others

  • View
    13

  • Download
    0

Embed Size (px)

Citation preview

Page 1: PENGENAL PELAT KENDARAAN BERMOTOR …

PENGENAL PELAT KENDARAAN BERMOTOR

MENGGUNAKAN STROKE WIDTH TRANSFORM DAN

JARINGAN SARAF TIRUAN

Kiki Rizki Arpiandi

PROGRAM STUDI MATEMATIKA

FAKULTAS SAINS DAN TEKNOLOGI

UNIVERSITAS ISLAM NEGRI

SYARIF HIDAYATULLAH

JAKARTA

2017 M / 1438 H

Page 2: PENGENAL PELAT KENDARAAN BERMOTOR …

PENGENAL PELAT KENDARAAN BERMOTOR

MENGGUNAKAN STROKE WIDTH TRANSFORM DAN

JARINGAN SARAF TIRUAN

Skripsi

Sebagai Salah Satu Syarat Memperoleh Gelar Sarjana Fakultas Sains

dan Teknologi

Universitas Islam Negeri (UIN) Syarif Hidayatullah Jakarta

Oleh:

Kiki Rizki Arpiandi

1110094000005

PROGRAM STUDI MATEMATIKA

FAKULTAS SAINS DAN TEKNOLOGI

UNIVERSITAS ISLAM NEGRI

SYARIF HIDAYATULLAH

JAKARTA

2017 M / 1438 H

ii

Page 3: PENGENAL PELAT KENDARAAN BERMOTOR …

LEMBAR PENGESAHAN

Skripsi berjudul "PENGENAL PELAT KENDARAAN BERMOTOR MENGGU-

NAKAN STROKE WIDTH TRANSFORM DAN JARINGAN SARAF TIRUAN"

yang ditulis oleh Kiki Rizki Arpiandi, NIM 1110094000005 telah diuji dan dinya-

takan lulus dalam sidang munaqosyah Fakultas Sains dan TeknologiUniversitas Islam

Negri Syarif Hidayatullahpada hari kamis, 20 April 2017. Skripsi ini telah diterima

dan memenuhi salah satu persyaratan dalam memperoleh gelar sarjana Strata Satu

(S1) Program Studi Matematika.

Menyetujui,Pembimbing I Pembimbing II

Dr. Nina Fitriyati, M.Kom Mahmudi, M.SiNIP. 19760414 200604 2 001

Penguji I Penguji II

Yane Irene, M.Si Muhaza Liebenlito, M.SiNIP. 19741231 200501 2 018

Mengetahui,Dekan Fakultas Sains dan Teknologi Ketua Prodi Matematika

Dr. Agus Salim, M.Si Dr. Nina Fitriyati, M.KomNIP. 19720816 1999031 003 19760414 200604 2 001

iii

Page 4: PENGENAL PELAT KENDARAAN BERMOTOR …

PERNYATAAN

DENGAN INI SAYA MENYATAKAN BAHWA SKRIPSI INI BENAR- BENAR

HASIL KARYA SENDIRI YANG BELUM PERNAH DIAJUKAN SEBAGAI SK-

RIPSI ATAU KARYA ILMIAH PADA PERGURUAN TINGGI ATAU LEMBAGA

MANAPUN.

Jakarta, Maret 2017

Kiki Rizki Arpiandi1110094000005

iv

Page 5: PENGENAL PELAT KENDARAAN BERMOTOR …

HALAMAN PERSEMBAHAN

Untuk Ibu, Bapak,

dan Adik-adikku tercinta.

v

Page 6: PENGENAL PELAT KENDARAAN BERMOTOR …

MOTTO

vi

Page 7: PENGENAL PELAT KENDARAAN BERMOTOR …

Abstrak

Pengenal nomor plat kendaraan otomatis adalah permasalahan yang menan-tang dimana akhir-akhir ini menerima banyak perhatian dalam bidang visi komputer.Sistem pengenal nomor pelat terpadu terdiri dari beberapa tahap termasuk, prepro-cessing, pendeteksian teks, segmentasi karakter dan pengenal karakter. Metode tra-disional dalam bidang ini bergantung pada komputasi multiskala untuk pendeteksianteks dan metode hasil rekayasa untuk pengenal karakter. Skripsi ini menjelaskanpendekatan alternatif dengan mamnfaatkan fakta bahwa ciri khas yang memebedak-an antara teks dan elemen lain pada citra adalah lebar goresan yang hampir konst-an, stroke width transform adalah salah satu algoritma yang memanfaatkan fakta ini,menjadikanya cepat dan mampu menghilangkan ketergantungan terhadap komputasimultiskala. Skripsi ini juga membahas perbandingan dua pendekatan alternatif untukpengelan karakter antara model multilayer perceptron dan model convolutional ne-ural network dan meningkatkan performa dari model tersebut dengan menggunakanL1 regularization dan metode dropout. Hasil dari penelitian ini menunjukan bahwaconvolutional neural network memiliki performa yang lebih baik daripada multilayerperceptron untuk pengenal karakter

Kata kunci : pengenal pola, visi komputer, jaringan saraf tiruan, pengenal nomorpelat..

vii

Page 8: PENGENAL PELAT KENDARAAN BERMOTOR …

Abstract

Automatic number plate recognition is a challenging problem that has recentlyreceived much attention in computer vision. Full end-to-end automatic number platerecognition system consist of many stages including, preprocessing, text detection,character segmentation and character recognition. Traditional system in this arearelied on multiscale computation for text detection and hand-engineered method forcharacter recognition. This thesis describe an alternative approach by lavarage the factthat one feature that separates text from other elements of a scene is its nearly constantstroke width, stroke width transform is one algorithm that lavarage this fact whichmakes it fast and robust enough to eliminate the need for multiscale computation, thisthesis also comparison of two alternative approach for character recognition betweenmultilayer perceptron model and convolutional neural network model and improvethe performance of the models using L1 regularization and dropout method. Theresearch show that convolutional neural network outperform multilayer percepron forcharacter recognition.

Keywords : pattern recognition, computer vision, artificial neural network, numberplate recognition.

viii

Page 9: PENGENAL PELAT KENDARAAN BERMOTOR …

KATA PENGANTAR

Assalamu’alaikum Wr. Wb.

Puji syukur penulis panjatkan ke hadirat Allah SWT karena hanya denganrahmat dan hidayah-Nya, tugas Akhir ini dapat terselesaikan. Keberhasilan dalammenyusun laporan Tugas Akhir ini tidak lepas dari bantuan berbagai pihak yang manadengan tulus dan ikhlas memberikan masukan guna sempurnanya Tugas Akhir ini.Oleh karena itu dalam kesempatan ini, dengan kerendahan hati penulis mengucapkanterima kasih kepada:

1. Bapak Dr. Agus Salim, M.Si, selaku Dekan Fakultas Sains dan Teknologi,Universitas Islam Negeri Syarif Hidayatullah Jakarta

2. Ibu Dr. Nina Fitriyati, M.Kom, selaku Ketua Program Studi Matematika sertaPembimbing I, dan Ibu Irma Fauziah, M.Sc, selaku Sekretaris Program StudiMatematika serta Bapak Mahmudi, M.Si, selaku Dosen Pembingbing II yangsenantiasa memberikan waktu, pengarahan dan saran-saran dalam penyelesaianskripsi ini.

3. Seluruh Bapak dan Ibu Dosen Program Studi Matematika Fakultas Sains danTeknologi yang telah memberikan ilmu-ilmunya dan pengalaman yang berman-faat.

4. Orang tua, adik dan kakak yang selalu memberikan dorongan dan semangatbagi penulis.

5. Pihak-pihak yang tidak dapat penulis sebutkan satu persatu, yang telah mem-berikan dorongan dan bantuan sehingga skripsi ini selesai disusun.

Penulis menyadari bahwa penyusunan Tugas Akhir ini jauh dari sempurna.Kritik dan saran dapat ditujukan langsung ke e-mail saya. Akhir kata penulis mohonmaaf yang sebesar-besarnya apabila ada kekeliruan di dalam penulisan Tugas Akhirini.

Jakarta, 20 April 2017

Penulis

ix

Page 10: PENGENAL PELAT KENDARAAN BERMOTOR …

DAFTAR ISI

LEMBAR PENGESAHAN iv

PERNYATAAN iv

HALAMAN PERSEMBAHAN v

MOTTO vi

Abstrak vii

Abstract viii

KATA PENGANTAR ix

DAFTAR ISI xi

DAFTAR GAMBAR xiv

I LATAR BELAKANG 11.1 Latar Belakang Masalah . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Rumusan Masalah . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3 Batasan Masalah . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.4 Tujuan Penulisan . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.5 Sistematika Penulisan . . . . . . . . . . . . . . . . . . . . . . . . . . 3

II LANDASAN TEORI 42.1 Image Preprocessing . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2 Pendeteteksian Teks . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3 Algoritma Stroke Width Transform . . . . . . . . . . . . . . . . . . . 52.4 Operator Canny Edge Detection . . . . . . . . . . . . . . . . . . . . 72.5 Jaringan Saraf Tiruan . . . . . . . . . . . . . . . . . . . . . . . . . . 82.6 Multi Layer Perceptron . . . . . . . . . . . . . . . . . . . . . . . . . 102.7 Convolutional Neural Network . . . . . . . . . . . . . . . . . . . . . 112.8 Optimisasi Berbasis Gradien . . . . . . . . . . . . . . . . . . . . . . 13

2.8.1 Algoritma Gradient Descent . . . . . . . . . . . . . . . . . . 14

x

Page 11: PENGENAL PELAT KENDARAAN BERMOTOR …

2.8.2 Algoritma Stochastic Gradient Descent . . . . . . . . . . . . 152.9 Dropout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2.9.1 Deskripsi Model . . . . . . . . . . . . . . . . . . . . . . . . 18

III METODE PENELITIAN 193.1 Praproses Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.2 Pendeteksian Teks Pada Citra Digital . . . . . . . . . . . . . . . . . . 193.3 Proses Pengumpulan Data . . . . . . . . . . . . . . . . . . . . . . . . 203.4 Proses Pelatihan Jaringan Saraf Tiruan . . . . . . . . . . . . . . . . . 213.5 Klasifikasi Karakter . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.6 Alur Penelitian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

IV HASIL DAN PEMBAHASAN 234.1 Hasil Pengumpulan Data . . . . . . . . . . . . . . . . . . . . . . . . 234.2 Hasil Pendeteksian Sisi Menggunakan Operator Canny Edge Detector 234.3 Hasil Pendeteksian teks menggunakan Stroke Width Transform . . . . 264.4 Hasil Training Jaringan Saraf Tiruan . . . . . . . . . . . . . . . . . . 27

V KESIMPULAN DAN SARAN 355.1 Kesimpulan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355.2 Saran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

DAFTAR PUSTAKA 36

A Sourcecode Global Contrast Normalization 37

B sourcecode canny edge detector 39

C sourcode untuk membangkitkan data 44

D sourcecode algoritma stroke width transform 47

xi

Page 12: PENGENAL PELAT KENDARAAN BERMOTOR …

DAFTAR GAMBAR

Gambar 2.1 (a) Dalam gambar ini stroke adalah bagian gelap pada gam-bar (b) p adalah piksel pada batas stroke (c) Setiap pikselsepanjang arah gradient p diberikan nilai minimum antaranilai swt pada piksel tersebut dengan nilai lebar stroke yangdishitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Gambar 2.2 (a) Proses perhitungan nilai swt (b) Contoh nilai swt dari pik-sel merah merupakan nilai minimum diantara dua panjangsinar, bukan nilai swt yang sebenarnya[1]. . . . . . . . . . . 6

Gambar 2.3 (a) Gambar original (b) Gradien vertikal menggunakan filterPrewith (c) Gradien horizontal menggunakan filter Prewith(d) Peta gradien terquantisasi (e) Peta besarnya gradien (f)Besarnya sudut setelah non-maximal suppression (g) Thre-

sholding pada dua level : warna merah untuk gradien diatasthreshold putih untuk gradient dibawah threshold (f) Hasilakhir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

Gambar 2.4 Single layer perceptron dengan satu output . . . . . . . . . . 9Gambar 2.5 Multi layer perceptron dengan L lapisan tersembunyi . . . . 11Gambar 2.6 Sparse connectivity, dilihat dari bawah. (Atas) Ketika nilai s

dibentuk oleh konvolusi dengan sebuah kernel yang memili-ki lebar 3, hanya tiga output yang dipengaruhi oleh x. (Ba-wah) Ketika s dibentuk oleh perkalian matriks, setiap outputdipengaruhi oleh x3 . . . . . . . . . . . . . . . . . . . . . . 12

Gambar 2.7 Parameter sharing : Panah hitam menunjukan koneksi yangmenggunakan parameter yang sama. (Atas) Panah hitam me-nunjukan penggunaan elemen tengan pada kernel dengan le-bar 3 pada sebuah model convolutional. Satu parameter ter-sebut digunakan pada setiap lokasi input. (Bawah) Sebuahpanah hitam menunjukan penggunaan elemen tengan darimatrik bobot pada model fully connected. Dalam model inisebuah parameter hanya dipakai sekali . . . . . . . . . . . . 13

xii

Page 13: PENGENAL PELAT KENDARAAN BERMOTOR …

Gambar 2.8 Max pooling menunjukan invariance.(Atas) Dilihat dari te-ngah output dari lapisan convolutional. Barisan bawah me-nunjukan output dari fungsi aktivasi. barisan atas menunjuk-an output dari max pooling. (Bawah) Jaringan yang sama,setelah input digeser ke kanan 1 piksel. setiap nilai dibawahtelah berubah, tetapi hanaya setengah nilai dari barisan atastelah berubah, karena unit max pooling hanya sensitip terha-dap nilai maksimaum dari dari tetangga, bukan dari lokasisebenarnya. . . . . . . . . . . . . . . . . . . . . . . . . . . 14

Gambar 2.9 (a) η = 0.9 (b) η = 0.3 (c) η = 0.1 . . . . . . . . . . . . . . 15Gambar 2.10 (a) Jaringan saraf tiruan sebelum dropout (b) Jaringan saraf

tiruan setelah dropout [2] . . . . . . . . . . . . . . . . . . . 17Gambar 2.11 (a) saat proses training(b) saat menghitung test error[2]. . . . 17

Gambar 3.1 Diagram alir metode penelitian . . . . . . . . . . . . . . . . 22

Gambar 4.1 font asli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Gambar 4.2 data yang dibangkitkan . . . . . . . . . . . . . . . . . . . . 24Gambar 4.3 (a) Gambar original sebelum dikalikan dengan filter gauss

(b) Gambar setelah diubah menjadi hitam putih kemudiandiberi filter gauss . . . . . . . . . . . . . . . . . . . . . . . . 25

Gambar 4.4 (a) Vektor Gx dalam gambar (b)Visualisasi Gy dalam gam-bar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

Gambar 4.5 (a) Arah gradien untuk masing-masing piksel, semakin pu-tih gambar maka sudut gradien semakin mendekati 360◦ (b)Besarnya gradien dari gambar, piksel paling putih menunjuk-an perubahan warna yang tinggi dari gambar original dalamsumbu x dan y . . . . . . . . . . . . . . . . . . . . . . . . . 26

Gambar 4.6 Peta sisi output dari algoritma Canny edge detection . . . . . 27Gambar 4.7 Peta stroke yang dihasilkan algoritma stroke width transform,

area putih merupakan kandidat dari teks, area putih ini biasadisebut komponen terhubung (connected component) . . . . . 28

Gambar 4.8 Peta stroke yang dihasilkan algoritma stroke width transform,area putih merupakan kandidat dari teks, area putih ini biasadisebut komponen terhubung (connected component) . . . . . 29

xiii

Page 14: PENGENAL PELAT KENDARAAN BERMOTOR …

Gambar 4.9 merupakan Jaringan saraf tiruan dengan arsitektur: 1 hidden

layer sebanyak 100 unit neuron dengan fungsi aktivasi si-gmoid dan satu output layer dengan 36 unit neuron . . . . . . 30

Gambar 4.10 merupakan Jaringan saraf tiruan dengan arsitektur: 1 hidden

layer sebanyak 150 unit neuron dengan fungsi aktivasi si-gmoid dan satu output layer dengan 36 unit neuron . . . . . . 31

Gambar 4.11 merupakan Jaringan saraf tiruan dengan arsitektur: 1 hidden

layer sebanyak 200 unit neuron dengan fungsi aktivasi si-gmoid dan satu output layer dengan 36 unit neuron . . . . . . 31

Gambar 4.12 merupakan Jaringan saraf tiruan dengan arsitektur: 2 hidden

layer 50 unit pada layer ke dua dan 50 unit pada layer ke 3,dengan fungsi aktivasi sigmoid dan satu output layer dengan36 unit neuron . . . . . . . . . . . . . . . . . . . . . . . . . 32

Gambar 4.13 merupakan Jaringan saraf tiruan dengan arsitektur: 2 hidden

layer sebanyak 75 unit pada layer ke dua dan 75 unit pada la-yer ke 3 fungsi aktivasi sigmoid dan satu output layer dengan36 unit neuron . . . . . . . . . . . . . . . . . . . . . . . . . 32

Gambar 4.14 merupakan Jaringan saraf tiruan dengan arsitektur: 2 hidden

layer sebanyak 100 unit pada layer ke dua dan 100 unit padalayer ke 3 dengan fungsi aktivasi sigmoid dan satu output

layer dengan 36 unit neuron . . . . . . . . . . . . . . . . . . 33Gambar 4.15 merupakan Jaringan saraf tiruan dengan arsitektur: 2 hidden

layer sebanyak 100 unit pada layer ke dua dan 100 unit padalayer ke 3 dengan fungsi aktivasi sigmoid dan satu output

layer dengan 36 unit neuron . . . . . . . . . . . . . . . . . . 33Gambar 4.16 merupakan Jaringan saraf tiruan dengan arsitektur: 2 hidden

layer sebanyak 100 unit pada layer ke dua dan 100 unit padalayer ke 3 dengan fungsi aktivasi sigmoid dan satu output

layer dengan 36 unit neuron . . . . . . . . . . . . . . . . . . 34Gambar 4.17 merupakan Jaringan saraf tiruan dengan arsitektur: 2 hidden

layer sebanyak 100 unit pada layer ke dua dan 100 unit padalayer ke 3 dengan fungsi aktivasi sigmoid dan satu output

layer dengan 36 unit neuron . . . . . . . . . . . . . . . . . . 34

xiv

Page 15: PENGENAL PELAT KENDARAAN BERMOTOR …

BAB I

LATAR BELAKANG

1.1 Latar Belakang Masalah

Bidang teknologi kecerdasan buatan dan machine learning mengalami pening-katan yang signifikan terutama dalam bidang pengenal pola (pattern recognition)menggunakan jaringan saraf tiruan, beberapa riset pernah dilakukan perusahaan ITseperti Google. Pada tahun 2011 Google memulai projek Google Brain, untuk meni-ru cara kerja otak manusia dalam mengenali gambar kucing. Pada Juni 2012 GoogleBrain Project telah berhasil membuat sebuah cluster komputer yang terdiri dari 1600komputer untuk meniru salah satu aspek kognitif manusia yaitu mengenali gambarkucing, dengan menggunakan data training berupa 10 juta gambar digital yang di-ambil dari youtube. Perkembangan kecerdasan buatan dalam bidang pengenal polasangatlah penting dan menjanjikan bahkan beberapa dapat membantu pekerjaan yangpada jaman dahulu dianggap hanya dapat dilakukan manusia.

Terdapat banyak metode dalam aplikasi kecerdasan buatan terutama untukpengenalan pola. Salah satunya adalah dengan menggunakan jaringan syaraf tiru-an (JST) atau dikenal dengan Artificial Neural Network (ANN). Salah satu aplikasiJST dalam bidang transportasi adalah untuk mengidentifikasi plat kendaran bermotor.Penggunaan plat nomor kendaraan bermotor sangat penting, dan bermanfaat untukmengidentifikasi sebuah kendaraan.

Sistem pengenal pelat kendaraan bermotor memerlukan beberapa tahap pro-ses untuk mengenali plat termasuk mendeteksi posisi plat kendaraan pada citra. Sa-lah satu metode yang dapat digunakan untuk mendeteksi posisi plat, adalah algoritmapendeteksi objek dengan pendekatan multiscale sliding windows, metode ini sangatefektif tetapi tidak efisien secera komputasi, karena citra di-scan pada berbagai ska-la. Secara intuisi metode tersebut tidak efisien, karena berlaku untuk sebarang objek.Untuk meningkatkan efisiensi maka perlu digunakan metode yang secara spesifik ber-tujuan untuk mendeteksi teks, salah satunya adalah algoritma stroke width transform,algoritma ini efisien secara komputasi karena tidak mengharuskan untuk men-scan

gambar pada berbagai skala. .

1

Page 16: PENGENAL PELAT KENDARAAN BERMOTOR …

1.2 Rumusan Masalah

Pada bagian ini akan dijelaskan mengenai definisi permasalahan yang penulisdan ingin diselesaikan serta asumsi dan batasan yang digunakan dalam menyelesai-kannya.

1. Bagaimana mendeteksi teks pada gambar menggunakan algoritma stroke width

transform?

2. Bagaimana mendesain arsitektur jaringan saraf tiruan untuk pengenal karakterpada pelat kendaraan bermotor ?

3. Bagaimana dampak drop out regularization, dan L1 regularization terhadapakurasi jaringan saraf tiruan pada pengenal karakter plat kendaraan bermotor?

1.3 Batasan Masalah

Batasan masalah pada penelitian ini adalah:

1. Pendeteksian pengenalan teks hanya dilakukan untuk pelat kendaraan.

2. Model jaringan saraf tiruan terbatas hanya untuk jaringan saraf tiruan konvolusidan multilayer perceptron.

1.4 Tujuan Penulisan

Tujuan dari penulisan skripsi ini antara lain:

1. Untuk mengetahui bagaimana mendeteksi teks pada citra gambar menggunakanalgoritma stroke width transform

2. Untuk mengetahui arsitektur jaringan saraf tiruan yang efisien untuk pengenalplat kendaraan bermotor

3. Untuk mengetahui dampak L1 regularization dan dropout terhadap akurasi ja-ringan saraf tiruan

2

Page 17: PENGENAL PELAT KENDARAAN BERMOTOR …

1.5 Sistematika Penulisan

BAB I : PENDAHULUANPada bab ini dijelaskan latar belakang, rumusan masalah, batasan, tujuan,

manfaat, keaslian penelitian, dan sistematika penulisan.

BAB II : TINJAUAN PUSTAKA DAN LANDASAN TEORIPada bab ini dijelaskan teori-teori dan penelitian terdahulu yang digunakan

sebagai acuan dan dasar dalam penelitian.

BAB III : METODOLOGI PENELITIANPada bab ini dijelaskan metode yang digunakan dalam penelitian meliputi

langkah kerja, pertanyaan penilitian, alat dan bahan, serta tahapan dan alur penelitian.

BAB IV : HASIL DAN PEMBAHASANPada bab ini dijelaskan hasil penelitian dan pembahasannya.

BAB V : KESIMPULAN DAN SARANPada bab ini ditulis kesimpulan akhir dari penelitian dan saran untuk pengem-

bangan penelitian selanjutnya.

3

Page 18: PENGENAL PELAT KENDARAAN BERMOTOR …

BAB II

LANDASAN TEORI

2.1 Image Preprocessing

Pendeteksian teks dan identifikasi karakter dalam gambar alami (scene image)merupakan permasalahan pengenalan visual yang kompleks. Dalam permasalahanpengenalan karakter optik klasik (optical character recognition), karakter biasanyamonoton dengan latar belakang tetap, pengenalan karakter pada gambar alami (scene

image), jauh lebih kompleks karena kemungkian terdapat variasi background, cahaya,tekstur dan font.

Salah satu sumber variasi yang dapat dihilingkan adalah kontras pada gam-bar. Kontras adalah perbedaan antara piksel gelap dan terang pada gambar. Terda-pat beberapa cara untuk mengukur kontras pada gambar. Dalam konteks deep le-

arning, kontras biasanya merujuk kepada standar deviasi dari gambar atau wilayahpada gambar misal kita memeiliki gambar yang direpresentasikan menggunakan ten-sor X ∈ Rr×c×3, dengan Xi,j,1 adalah intensitas warna merah pada baris i dan kolomj, Xi,j,2 adalah intensitas warna hijau dan Xi,j,3 adalah intensitas warna biru. makakontras pada gambar adalah

���� 1

3rc

r�

i=1

s�

j=1

3�

k=1

(Xi,j,k − Xi,j,k)

Global contrast normalization (GCN) bertujuan untuk mencegah gambar me-miliki kontras yang bervariasi dengan mengurangi rata-rata untuk setiap gambar. Mi-salkan diberikan input gambar x, GCN menghasilkan output X�, sedemikian sehingga[3]

X�i,j,k =

X�i,j,k − X

max��,�λ+ 1

3rc

�ri=1

�sj=1

�3k=1(Xi,j,k − Xi,j,k)2

� (2.1)

4

Page 19: PENGENAL PELAT KENDARAAN BERMOTOR …

2.2 Pendeteteksian Teks

Untuk melakukan pengenalan teks pada gambar alami (scene image) kita ha-rus menemukan posisi dan area dimana teks yang akan dikenali terletak pada gambar,hal ini dapat dilakukan menggunakan algoritma pendeteksi teks. Secara umum algor-tima pendeteksi teks dapat dibagi mengjadi dua tipe, yaitu, metode berbasis sliding

window, dan metode berbasis komponen terhubung.Pada metode berbasis sliding window teks pada gambar dideteksi dengan meng-

geser jendela pada gambar pada berbagai skala gambar. Kemudian untuk masingmasih jendela, penentuan apakah pada jendela tersebut terdapat teks atau tidak di-tentukan menggunakan classifier seperti suport vector machine, random forest atauconvolutional neural network.

Pada metode berbasis komponen terhubung kandidat karakter diekstrak dariinput gambar, dimana setiap kandidiat adalah piksel-piksel yang memiliki sifat-sifatteks. Teknik populer untuk metode komponen terhubung diantaranya adalah stroke

width transform dan maximally external region.

2.3 Algoritma Stroke Width Transform

Stroke Width Transform adalah algoritma pendeteksi teks yang pertama kalidiperkenalkan oleh Boris Epshtein, Eyal Ofek dan Yonatan Wexler. Dalam karya il-miahnya Epshtein dan kawan-kawan memperkenalkan istilah stroke. Stroke (goresan)dari sebuah gambar adalah pita dengan lebar yang hampir konstan. Contoh dari stro-

ke ditampilkan oleh gambar 2.1(a). Jika sebuah piksel terdapat didalam stroke makanilai swt dari pikel tersebut didefinisikan sebagai lebar stroke dimana piksel tersebutberada.

Dalam algoritma stroke width transform, pertama setiap piksel diinisiasi de-ngan nilai ∞ sebagai nilai swt pada piksel tersebut. Kemudian, kita hitung peta sisidari gambar tersebut menggunakan Canny edge detector. Kita anggap sisi gambar se-bagai kemungkinan batas stroke, dan tujuan kita adalah menghitung lebar dari stroketersebut [1].

Jika p adalah piksel pada sisi gambar, arah gradien hampir tegak lurus terha-dap orienstasi batas stroke. Oleh karena itu, langkah selajutnya adalah menghitungarah gradien pada piksel p yang terletak pada sisi gambar yaitu gp, kemudian ikutisinar r = p + n · gp (n > 0) sampai kita menemukan piksel pada sisi yang lain

5

Page 20: PENGENAL PELAT KENDARAAN BERMOTOR …

(a) (b) (c)

Gambar 2.1: (a) Dalam gambar ini stroke adalah bagian gelap pada gambar (b) padalah piksel pada batas stroke (c) Setiap piksel sepanjang arah gradient p diberikannilai minimum antara nilai swt pada piksel tersebut dengan nilai lebar stroke yangdishitung

(a) (b)

Gambar 2.2: (a) Proses perhitungan nilai swt (b) Contoh nilai swt dari piksel me-rah merupakan nilai minimum diantara dua panjang sinar, bukan nilai swt yangsebenarnya[1].

q. Jika arah gradien gq pada q hampir berlawanan dengan gp, maka setiap pikseldi sepanjang sinar dari piksel p ke q diberikan nilai swt yaitu jarak Euclid antara p

dan q. Jika piksel q tidak ditemukan atau gradien gp tidak hampir berlawanan arah(selisih antara p tidak mendekati 180◦) dengan gq maka sinar dibuang [1].

Dalama beberapa situasi kompleks, seperti piksel pada pojok huruf sepertiyang diilustrasikan oleh gambar 2.2 (b), nilai swt yang dihasilkan oleh langkah sebe-lumnya tidak akan menghasilkan nilai swt yang sebenarnya. Oleh karena itu, untukmasing-masing sinar yang tidak dibuang, kita telusuri piksel sepanjang sinar terse-but, hitung median m dari nilai swt dari seluruh piksel di sepanjang sinar tersebut,kemudian ganti seluruh nilai swt yang lebih besar dari m dengan m [1].

Setelah kita memperoleh nilai swt dari seluruh piksel, langkah selanjutnya

6

Page 21: PENGENAL PELAT KENDARAAN BERMOTOR …

adalah mencari kandidat huruf. Dua buah piksel yang bertetanggaan dapat dikelom-pokan jika keduanya memiliki rasio nilai swt tidak melebihi 3. Hal ini menjaminstroke dengan lebar yang bervariasi juga akan di kelompokan menjadi satu.

2.4 Operator Canny Edge Detection

Operator Canny edge detection (Canny, 1986) adalah operator pendeteksi sisi.

1. Preprocessing, Pendeteksi sisi sangat rentan terhadap noise. Untuk menguranginoise kita dapat menggunakan filter seperti gaussian filter dengan melakukanoperasi konvolusi antara matriks gambar P dengan kernel filter Gauss H . Ker-nel filter Gauss adalah matriks dengan ukuran (2k + 1) × (2k + 1) dimanaelemen ke-i, j dari matriks tersebut dapat dihitung sebagai berikut

Hij =1

2πσ2exp

�−(i− (k + 1))2 + (j − (k + 1))2

2σ2

dimana 1 ≤ i, j ≤ (2k + 1)

2. Hitung gradien, gradien dari gambar adalah nilai perubahan terang gelap padagambar. Untuk menghitung gradien dari gambar, kita dapat melakukan operasikonvolusi antara matriks skala abu dari gambar P dengan sepasang filter se-perti filter Prewitt untuk menghasilkan matriks H dan V yaitu matriks dimanaentri ke-i, j dari matriks tersebut berturut-turut adalah gradien terhadap sumbux dan gradien terhadap sumbu y pada piksel ke-i, j dari gambar. Arah gradienpada piksel ke-i, j yaitu θij dan besar gradien pada piksel ke-i, j yaitu aij dapatdihitung menggunakan [4]

θij = arctan(vijhij

),

aij =�

h2ij + v2ij,

3. Non maximum suppression, dalam Non maximum suppression arah gradien un-tuk dibulatkan menjadi salah satu dari empat sudut berikut {0◦, 45◦, 90◦, 135◦}jika salah satu piksel yang tegak lurus degan arah gradien dari piksel tersebutmemiliki nilai gradien yang lebih tinggi.

7

Page 22: PENGENAL PELAT KENDARAAN BERMOTOR …

Gambar 2.3: (a) Gambar original (b) Gradien vertikal menggunakan filter Prewith(c) Gradien horizontal menggunakan filter Prewith (d) Peta gradien terquantisasi (e)Peta besarnya gradien (f) Besarnya sudut setelah non-maximal suppression (g) Thre-sholding pada dua level : warna merah untuk gradien diatas threshold putih untukgradient dibawah threshold (f) Hasil akhir[4]

4. Hysteris Thresholding, tentukan dua thresholds yang disebut threshold atas danthreshold bawah, setiap piksel yang memiliki nilai gradien diatas threshold atasdiberi label sebagai sisi kemudian setiap piksel yang nilai gradiennya diatasthreshold bawah dan terhubung dengan piksel sisi juga diberi label sisi.[5]

2.5 Jaringan Saraf Tiruan

Jaringan saraf tiruan adalah model komputasi yang terinspirasi oleh strukturjaringan saraf pada otak. Dalam model otak yang disederhanakan, jaringan saraf me-miliki banyak perangkat komputasi (neuron) yang terhubung satu sama lain. Jaringansaraf dapat dideskripsikan sebagai graf berarah dimana titik merupakan representasidari neuron dan sisi merupakan penghubung antar neuron [?].

Bentuk sederhana dari jaringan saraf tiruan adalah Single layer perceptron

8

Page 23: PENGENAL PELAT KENDARAAN BERMOTOR …

x1

x2

xn

y

+1

b

w1

w2

w n...Gambar 2.4: Single layer perceptron dengan satu output

dengan satu output dimana model ini hanya dapat digunakan untuk klasifikasi polayang dapat dipisahkan secara linear (linearly sparable). Pada dasarnya, Single layer

perceptron terdiri dari satu neuron dengan bobot dan bias yang dapat dirubah nilainya[?]. Pada gambar 2.4 neuron input x1, . . . , xn berturut-turut dihubungkan dengan

bobot w1, . . . , wn dan bias b. Output y diperoleh dengan persamaan y = f(n�

i=1

wixi+

b) dimana fungsi f disebut fungsi aktivasi.Dalam [6], dibahas tiga tipe fungsi aktifasi: fungsi threshold, fungsi linear

picewise dan fungsi sigmoid. fungsi threshold yang biasa digunakan adalah fungsiHeavside:

h(z) =

�0 if z ≥ 01 if z ≤ 0

(2.2)

Walaupun demikian, baik fungsi threshold maupun fungsi picewise linear me-miliki beberapa kekurangan. Pertama, untuk pelatihan jaringan (network training)kita membutuhkan fungsi aktivasi terdiferensialkan. Kedua, fungsi aktivasi nonlinearlebih dipilih karena kemampuan komputasi yang dimilikinya [7].

Fungsi aktivasi yang paling banyak digunakan adalah fungsi sigmoid. Sebagaicontoh fungsi logistik sigmoid sebagai berikut:

σ(z) =1

1 + e−z. (2.3)

9

Page 24: PENGENAL PELAT KENDARAAN BERMOTOR …

(a) (a)

Grafik dari fungsi sigmoid berbentuk huruf ’s’ dan monoton naik. Selain fung-si sigmoid kita juga dapat menggunakan fungsi tan hiperbolik tanh(z) yang dapat di-pandang sebagai transformasi linear dari fungsi logistik sigmoid pada interval [-1,1].Perhatikan bahwa baik fungsi logistik sigmoid maupun fungsi tanh(z) terbatas diatasdan terbatas di bawah [7].

2.6 Multi Layer Perceptron

Deep feedforward networks, atau sering dikenal feedforwaed neural networks,atau multi layer perceptrons, adalah pengembangan dari perceptron. Tujuan dari fe-

edforward network adalah untuk mengaproksimasi suatu fungsi f∗. Sebagai contoh,sebuah classifier y = f ∗(x) memetakan input x ke kategori y. feedforward neural

network mendefinisikan pemetaan y = f(x; θ) kemudian nilai θ dihitung menggu-nakan algoritma pembelajaraan untuk menghasilkan aproksimasi fungsi terbaik [3].

Model ini disebut feedforward karena informasi (vektor x) mengalir melaluifungsi-fungsi yang mendefinisikan fungsi f, dan output y. Tidak ada koneksi umpanbalik yaitu output dari neuron terhubung dengan dirinya sendiri [3].

Feedforward neural networks disebut networks, karena model ini direpresen-tasikan sebagai komposisi dari fungsi-fungsi. Model ini dikaitkan dengan graf asiklisberarah yang mendeskripsikan bagaimana fungsi-fungsi tersebut dikomposisikan. Se-bagai contoh, misalkan kita punya tiga fungsi f (1), f (2) dan f (3) dikomposisikan seca-ra berantai untuk membentuk f(x) = f (3)(f (2)(f (1)(x))). Dalam hal ini f (1) disebutlapisan (layer) pertama dari jaringan, f (2) disebut lapisan kedua, dan seterusnya. Ba-nyaknya rantai komposisi memberikan kedalaman (depth) dari model. Dari sinilahistilah deep learning muncul [3], lapisan pertama pada jaringan biasa disebut lapisan

10

Page 25: PENGENAL PELAT KENDARAAN BERMOTOR …

x1

x2

xD

+1

y(1)1

y(1)2

y(1)

n1

+1

y(l)1

y(l)2

y(l)

nl

+1

y(l+1)1

y(l+1)2

y(l+1)

n(l+1)

b (1)

2

b (L)1

b (L+1)

1w 12 w 12

...

...

. . .

. . .

. . .

...

...

Gambar 2.5: Multi layer perceptron dengan L lapisan tersembunyi

input, dan lapisan terakhir biasa disebut lapisan output, sementara lapisan diantaralapisan input dan lapisan output biasa disebut lapisan tersembunyi (hidden layer).

Multi layer perceptron seperti diilustrasikan dalam gambar 2.5, memiliki Llapisan tersembunyi, dengan lapisan input berdimensi-D. Misalkan banyaknya neu-ron pada layer ke k adalah nk dan y

(k)j adalah neuron ke j pada layer ke k, maka kita

dapat menghitung y(k+1)j dengan

z(k+1)i =

nk�

j=1

w(k+1)ij yk + b

(k+1)i

y(k+1)i = f(z

(k+1)i ),

dalam bentuk vektor persamaan dapat ditulis sebagai:

z(k+1) = W (k+1)y(k) + b(k+1)

y(k+1) = f(z(k+1))

2.7 Convolutional Neural Network

Convolutional Neural Network adalah jenis jaringan saraf yang didesain un-tuk memproses input dengan topologi berbentuk grid. Nama "convolutional neural

11

Page 26: PENGENAL PELAT KENDARAAN BERMOTOR …

x1 x2 x3 x4 x5

s1 s2 s3 s4 s5

x1 x2 x3 x4 x5

s1 s2 s3 s4 s5

Gambar 2.6: Sparse connectivity, dilihat dari bawah. (Atas) Ketika nilai s dibentukoleh konvolusi dengan sebuah kernel yang memiliki lebar 3, hanya tiga output yangdipengaruhi oleh x. (Bawah) Ketika s dibentuk oleh perkalian matriks, setiap outputdipengaruhi oleh x3

network" mengindikasikan bahwa jaringan menggunakan operasi matematika yangdisebut operasi konvolusi.

Misal terdapat sebuah gambar berdimensi dua I dan sebuah kernel K makaI �K adalah:

S(i, j) = (I �K)(i, j) =�

m

n

I(m,n)K(i−m, j − n)

Dalam jaringan saraf tradisional setiap unit output pada sebuah layer terhu-bung dengan seluruh unit input. Dalam convolutional neural network unit input tidakterhubung dengan semua unit output begitu pula dengan unit output.

Parameter sharing, merujuk pada penggunaaan parameter yang sama untuklebih fungsi dalam sebuah model. Dalam jaringan saraf tradisional, setiap elemendari matriks bobot digunakan hanya sekali ketika mengitung output dari sebuah layer.

Convolutional neural network biasanya terdiri dari 3 tahap. Pada tahap perta-ma, layer melakukan konvolusi untuk menhasilkan aktivasi linear. Pada tahap kedua,setiap aktifasi linear diterapkan fungsi aktiasi nonlinear. Tahap ini biasa disebut tahapdetector. Pada tahap ketiga, kita gunakan fungsi pooling untuk memodifikasi output

12

Page 27: PENGENAL PELAT KENDARAAN BERMOTOR …

x1 x2 x3 x4 x5

s1 s2 s3 s4 s5

x1 x2 x3 x4 x5

s1 s2 s3 s4 s5

Gambar 2.7: Parameter sharing : Panah hitam menunjukan koneksi yang menggu-nakan parameter yang sama. (Atas) Panah hitam menunjukan penggunaan elementengan pada kernel dengan lebar 3 pada sebuah model convolutional. Satu parametertersebut digunakan pada setiap lokasi input. (Bawah) Sebuah panah hitam menunjuk-an penggunaan elemen tengan dari matrik bobot pada model fully connected. Dalammodel ini sebuah parameter hanya dipakai sekali

dari layer.Sebuah fungsi pooling menggantikan output dari jaringan pada lokasi tertentu

degan statistik dari output disekitarnya. Sebagai contoh, max pooling memberikanoutput berupa nilai maksimum pada area berbentuk persegi dari output

2.8 Optimisasi Berbasis Gradien

Optimisasi merujuk pada tugas untuk meminimumkan atau memaksimumkannilai f(x) dengan mengubah nilai x. Fungsi yang dicari nilai minimum atau nilaimaksimumnya disebut fungsi objektif atau criterion. Sementara fungsi yang dicarinilai minimumnya disebut fungsi biaya, loss function, atau fungsi error. Nilai yangmeminumkan atau memaksimalkan suatu fungsi biasa dinotasikan dengan ∗. Sebagaicontoh, x∗ = f(x).

13

Page 28: PENGENAL PELAT KENDARAAN BERMOTOR …

. . . 0.3 0.1 1 0.2 . . .

. . . 0.3 1 1 1 . . .

. . . 0.1 1 0.2 1 . . .

. . . 1 1 1 0.2 . . .

Gambar 2.8: Max pooling menunjukan invariance.(Atas) Dilihat dari tengah outputdari lapisan convolutional. Barisan bawah menunjukan output dari fungsi aktivasi.barisan atas menunjukan output dari max pooling. (Bawah) Jaringan yang sama, se-telah input digeser ke kanan 1 piksel. setiap nilai dibawah telah berubah, tetapi hanayasetengah nilai dari barisan atas telah berubah, karena unit max pooling hanya sensitipterhadap nilai maksimaum dari dari tetangga, bukan dari lokasi sebenarnya.

2.8.1 Algoritma Gradient Descent

Algoritma Gradient Descent adalah algoritma untuk mengestimasi nilai mini-mum lokal terdekat, dari sebuah fungsi yang terdiferensialkan. Gradient dari fungsiyang terdiferensialkan f : Rd → R pada x, dinotasikan ∇xf(x) adalah vektor dariturunan parsial f , yaitu ∇f(x) = ( ∂f

∂x1. . . ∂f

∂xd). Algoritma gradient descent adalah

algoritma iteratif. Kita mulai dengan menginisiasi nilai x secara random. Kemudi-an pada setiap iterasi, vektor x bergerak dengan arah negatif dari gradien, denganmemperbarui nilai x sebagai berikut:

x ← x− η∇xf(x) (2.4)

Dalam machine learning konstanta η juga sering disebut learning rate, ada-lah konstanta yang menentukan seberapa cepat sebuah solusi (minimum lokal) dite-mukan. Gambar 2.9 merupakan ilustrasi penerapan algoritma gradient descent untukmencari nilai minimum dari fingsi f(x) = (x+ 2)2 − 4.

Dari gambar 2.9 terlihat bahwa algoritma konvergen lebih cepat ketika η = 0.3

14

Page 29: PENGENAL PELAT KENDARAAN BERMOTOR …

(a) (b) (c)

Gambar 2.9: (a) η = 0.9 (b) η = 0.3 (c) η = 0.1

dari pada saat η = 0.1, tetapi algoritma tidak konvergen sama sekali ketika η = 0.9.

2.8.2 Algoritma Stochastic Gradient Descent

Algoritma Stochastic gradient descent adalah pengembangan dari algoritmagradient descent seperti yang dijelaskan pada subbab 2.8.1

Fungsi error yang digunakan dalam sebuah algoritma machine learning bia-sanya dapat diuraikan sebagai penjumlahan dari error untuk setiap example. Sebagaicontoh, MSE dari data training dapat ditulis sebagai

J(θ) =1

m

m�

i=1

L(x(i),y(i),θ)

dimana L adalah error per-satu example L(x(i),y(i),θ) = 12||y(i) − y(i)||2

Untuk meminimumkan J(θ) terhadap parameter θ menggunakan algoritmagradient descent kita harus menghitung

∇θJ(θ) =1

m

m�

i=1

∇θL(x(i),y(i),θ)

Biaya komputasi untuk operasi ini adalah O(n) [3]. Dengan meningkatnya jumlahdata training, waktu yang diperlukan untuk melakukan satu iterasi algoritma gradient

descent menjadi sangat lama.Intuisi dari Stochastic Gradient Descent yaitu gradient adalah ekspektasi [3].

Ekspektasi dapat diaproksimasi menggunakan beberapa sample. Secara spesifik un-tuk setiap iterasi, kita dapat mengambil beberapa sampel secara random uniform daridata training yang biasa disebut minibatch B = {x(1), . . . ,x(m�)}. Ukuran miniba-

tch m� biasanya merupakan bilangan yang kecil, berkisar diantara 1 sampai beberapa

15

Page 30: PENGENAL PELAT KENDARAAN BERMOTOR …

ratus. Estimasi dari gradient dapat ditulis sebagai

g =1

m�

m��

i=1

∇θL(x(i),y(i),θ)

untuk setiap iterasi nilai θ kemudian diperbarui dengan aturan sebagai berikut

θ ← θ − ηg (2.5)

2.9 Dropout

Jaringan saraf tiruan yang memiliki banyak hidden layer non-linear menjadimodel yang mampu memodelkan hubungan kompleks antara input dan output. Wala-upun demikian, dengan terbatasnya data training, beberapa hubungan kompleks anta-ra input dan output akan menghasilkan sampling noise. Hal ini mengakibatkan over-

fitting dan beberapa metode telah dikembangkan untuk mengurangi hal ini. Sepertimenghentikan training setelah performa terhadap validation set menjadi memburuk(early stopping), menggunakan L1 dan L2 regularization dan soft weight sharing [8].

Dengan terbatasnya komputasi, metode untuk mengurangi overfitting padamodel dengan ukuran tetap adalah dengan menghitung rata-rata prediksi dari semuakemungkinan nilai parameter, metode ini cukup baik untuk model yang kecil atausederhana [9]. Walaupun demikian pada jaringan saraf tiruan berukuran besar, ideuntuk menghitung rata-rata output dari beberapa jaringan saraf tiruan yang di-train

secara terpisah, tidak efisien secara komputasi.Dropout adalah teknik untuk mengatasi permasalahan tersebut. Dropout men-

cegah overfitting dan memberikan cara untuk mengabungkan beberapa arsitektur ja-ringan saraf tiruan secara efisian. Istilah "dropout" merujuk pada mengeluarkan(dropping out) neuron, baik pada hidden layer maupun pada visible layer dalam ja-ringan saraf tiruan. Dalam hal ini mengeluarkan sebuah unit neuron, artinya mengelu-arkan unit neuron tersebut dari jaringan saraf beserta bobot yang menghubungkannyasecara sementara, seperti ditunjukan pada gambar 2.10

Unit neuron yang dikeluarkan dipilih secara random. Untuk kasus sederha-na, setiap unit dipertahankan dengan probabilitas p independen terhadap unit lainnya,dimana p dapat dipilih menggunakan validation set atau dapat dipilih 0.5, yang men-dekati nilai optimal untuk beberbagai jaringan [2]. Untuk unit input, probabilitas

16

Page 31: PENGENAL PELAT KENDARAAN BERMOTOR …

(a)(b)

Gambar 2.10: (a) Jaringan saraf tiruan sebelum dropout (b) Jaringan saraf tiruansetelah dropout [2]

(a) (b)

Gambar 2.11: (a) saat proses training(b) saat menghitung test error[2].

optimal untuk mempertahankan unit biasanya mendekati 1 [2].Dengan metode dropout jika sebuah unit neuron memiliki probabilitas p saat

training, maka bobot dari unit tersebut dikalikan dengan p saat menghitung test er-

ror. Dengan kata lain jika saat proses training neuron bertahan dengan probabilitasp (dikeluarkan dengan probabilitas 1 − p), saat menghitung testerror neuron selaluada (tidak ada neuron yang dikeluarkan) tetapi bobot yang menghubungkan neurontersebut dikalikan dengan p. Seperti diilustrasikan gambar 2.11.

17

Page 32: PENGENAL PELAT KENDARAAN BERMOTOR …

2.9.1 Deskripsi Model

Bagian ini menjelaskan model droput jaringan saraf tiruan. Perhatikan sebuahjaringan saraf tiruan dengn L hidden layer. Misal l ∈ {1, . . . , L} index dari hiddenlayer pada jaringan. misal z(l) adalah vektor input ke layer l, y(l) menotasikan vektoroutput dari layer l (y(0) = x adalah input). W (l) dan b(l) adalah bobot dan bias padalayer l. Operasi feed-forward pada jaringan saraf standar gambar dapat di jelasiaksebagai (untuk l ∈ 0, . . . , L− 1 dan sebaran g hidden unit i)

z(l+1)i = w(l+1)

i yl + b(l+1)i

y(l+1)i = f(z

(l+1)i ),

dimana f adalah sebarang fungsi aktivasi, sebagai contoh, f(x) = 1/(1 +

exp(−x)).Dengan dropout, operasi feed-forward menjadi

r(l)j = Bernoulli(p),

y(l) = r(l) ∗ y(l),

z(l+1)i = w(l+1)

i yl + b(l+1)i ,

y(l+1)i = f(z

(l+1)i ),

18

Page 33: PENGENAL PELAT KENDARAAN BERMOTOR …

BAB III

METODE PENELITIAN

Pada bab ini, Penulis menjelaskan mengenai metode dan algoritma yang digu-nakan dalam membangun program pengenal plat nomor kendaraan bermotor. Dalamkarya ilmiah ini penulis menggunakan bahasa pemrograman python 2.7.9, dan ma-tplotlib 1.4.2 untuk menggambar grafik, serta numpy 1.11.2 untuk melakukan operasiperkalian matrix. Selain itu beberapa bagian dari program ini menggunakn librarytheano 0.8.2 untuk menghitung gradien dari parameter pada convolutional neural ne-

twork.

3.1 Praproses Data

Gambar pelat kendaraan hasil tangkapan kamera biasanya diperoleh denganberbagai kondisi yang berbeda. Kondisi pencahayaan dan objek disekitar pelat ken-daraan mempengaruhi kualitas gambar, misalnya cahaya matahari pada posisi tertentumenghasilkan noise (data pencilan) pada gambar disekitar pelat berupa area berwar-na kuning, atau kontras yang tidak merata, terlalu rendah, atau terlalu tinggi. Dalamskripsi ini penulis menggunakan metode contrast normalization untuk menormalkankontras pada gambar.

Gambar hasil tangkapan kamera dapat disimpan dalam berbagai model war-na. Dalam skripsi ini penulis menggunakan model warna RGB dimana gambar digitaldisajikan dalam tensor berdimensi-3 X. Indeks pertama pada tensor X menunjukanposisi piksel pada sumbu-x, indeks kedua menunjukan posisi piksel pada sumbu-ydan indeks ketiga menunjukan intensitas warna merah, hijau dan biru dalam se-lang [0, 255]. Sebagai contoh, misal kita punya X12,30,1 = 122, X12,30,2 = 100 danX12,30,3 = 10 artinya pada koordinat (12, 30) intensitas warna merah, hijau, biru,berturut-turut adalah 122, 100, 10. Kemudian untuk mengimplementasikan GCN gu-nakan persamaan 2.1, dalam skripsi ini penulis menggunakan nilai λ = 100.

3.2 Pendeteksian Teks Pada Citra Digital

Untuk mendeteksi plat (teks) pada citra digital, penulis menggunakan algorti-ma stroke width transform, input untuk algortima ini adalah peta sisi (edge map) yangdiperoleh menggunakan operator pendeteksi sisi, dimana dalam skripsi ini penulis

19

Page 34: PENGENAL PELAT KENDARAAN BERMOTOR …

menggunakan operator canny edge detector. Karena pendeteksi sisi sangat rentanterhadap noise maka noise pada citra perlu dikurangi. Dalam skripsi noise dikura-ngi dengan melakukan konvolusi antara matriks dari citra dan kernel Gauss denganσ = 0.3. Kernel Gauss diperoleh dengan mensubsitusikan σ ke persamaan 1, kemu-dian dilakukan prosedur selanjutnya seperti yang dijelaskan pada subbab 2.4.

Setelah peta sisi diperoleh langkah selanjutnya adalah menghitung nilai swtuntuk setiap piksel pada citra, seperti yang dijelaskan pada subbab 2.3.

3.3 Proses Pengumpulan Data

Data yang digunakan untuk melatih jaringan saraf tiruan ditulis dalam bentukvektor berdimensi 784 dan vektor berdimensi 35 masing-masing disebut vektor in-put dan vektor target, vektor input berasal dari data gambar digital dan vektor targetmerupakan output yang diharapkan untuk vektor input tersebut. Karena keterbatasansumber untuk memperoleh data training, penulis mengumpulkan data training denganmembangkitkan gambar menggunakan program komputer yang ditulis menggunak-an bahasa pemrograman python. Data yang dibangkitkan adalah gambar skala abudengan urkuran 28 × 28, agar data yang dibangkitkan menyerupai data sebenarnya,data gambar tersebut diperoleh dari font pelat nomor, dengan menambahkan noise danmenvariasikan ketebalan karakter pelat kendaraan dengan menghilangkan sisi gambarmenggunakan canny edge detector secara berulang-ulang, dengan jumlah pengulang-an acak, serta dengan memutar karakter secara acak diantara −5◦ sampai 5◦, prosesini dapat dilihat pada lampiran.

Setiap gambar yang dibangkitkan dapat disajikan dalam bentuk matriks M

berukuran 28 × 28, dimana elemen ke-ij dari matriks merupakan nilai skala abudari piksel pada baris ke-i dan kolom ke-j, setiap elemen matriks M dinormalisa-si dengan membagi setiap elemen dengan nilai maksimum dari derajat keabuan yai-tu 255. Kemudian M disajikan dalam bentuk vektor kolom x sedemikian sehinggamij = x28(i−1)+j dimana xk adalah elemen ke k dari x, dalam karya tulis ini M beru-kuran 28 × 28 maka x ∈ R28(28−1)+28, selanjutnya data yang akan digunakan adalahdata dalam bentuk vektor kolom.

20

Page 35: PENGENAL PELAT KENDARAAN BERMOTOR …

3.4 Proses Pelatihan Jaringan Saraf Tiruan

Jaringan saraf tiruan memiliki kemampuan untuk mengaproksimasi fungsinon-linier baik yang memetakan vektor ke vektor, matriks atau tensor. Walaupun de-mikian arsitektur jaringan saraf tiruan harus dirancang melalui percobaan, arsitekturuntuk data tertentu tidak selalu cocok untuk data lain.

Data yang diperoleh pada subbab 3.3 dibagi menjadi tiga yaitu, 6400 training

data, 1600 validation data, dan 2000 test data. Untuk setiap epoch, akurasi modeldihitung yaitu persentase prediksi yang benar terhadap validation data. Kemudiansetelah proses training model selesai, model diuji terhadap test data

3.5 Klasifikasi Karakter

Data training yang disajikan dalam bentuk vektor kolom merupakan input ja-ringan saraf tiruan, setiap elmemen dari vektor pada data training, merupakan nilainode pada layer pertama, tujuan kita adalah mencari nilai vektor a4, dengan menghi-tungnya secara rekursif seperti yang dibahas pada bab 2, vektor a4 merupakan vektorberdimensi 35, dimana elemen vektor a4 dengan terbesar merupakan kandidat terbaikyang akan menjadi kelas dari vektor input, misalkan vektor untuk input x, setelah di-lakuakan feedforward menggunakan jaringan saraf tiruan, diperoleh a4, dimana nilaitertinggi dari elemen-elemen a4 adalah elemen ke-2 maka kelas yang paling mungkinuntuk x adalah huruf b, dalam hal ini penulis mendefiniskan urutan kedua dari a4.Pendefinisian ini dapat berbeda, untuk penulis yang berbeda (subjektif).

3.6 Alur Penelitian

Pada subbab ini peneliti akan menjelaskan mengenai alur penelitian yang telahdilakukan dalam karya ilmiah ini, alur penelitian disajikan dalam bentuk diagram alirpada gambar 3.1.

21

Page 36: PENGENAL PELAT KENDARAAN BERMOTOR …

Gambar 3.1: Diagram alir metode penelitian

22

Page 37: PENGENAL PELAT KENDARAAN BERMOTOR …

BAB IV

HASIL DAN PEMBAHASAN

4.1 Hasil Pengumpulan Data

Data yang digunakan sebagai data training merupakan data yang dibangkitkanmenggunakan bahasa pemrograman python. Gambar 4.2 merupakan beberapa contohdari data yang bangkitkan dari font asli pada gambar 4.1

4.2 Hasil Pendeteksian Sisi Menggunakan Operator Canny Edge Detector

Input untuk Canny Edge Detector merupakan matriks skala abu dari gambar,misal P adalah matriks dari gambar maka P ij adalah warna skala abu dari gambarpada posisi ke-ij, titik tengah koordinat pada gambar berada pada kiri atas (bukankiri bawah seperti pada koordinat kartesius). Karena gambar yang digunakan dalampenlitian ini pada umumnya berukuran lebih besar 500×500 tidak mungkin untuk me-nampilkan keseleruhan matriks dari gambar skala pada skripsi ini. Dalam skripsi inipenulis menampilkan matriks dalam bentuk gambar. Berikut ini akan dibahas menge-nai hasil yang diperoleh dari langkah-langkah yang telah dilakukan untuk mendeteksisisi menggunakan Canny edge detector.

Untuk mengurangi noise pada gambar kita lakukan operasi konvolusi antaragambar dengan kernel gauss, kernel gauss yang digunakan dalam skripsi ini adalahkernel berukuran 5 × 5 dengan σ = 0.3 artinya kita melakukan operasi konvolusiantara P dengan kernel gauss I , dimana elemen dari kernel gauss yang digunakanadalah (lihat )

Hij =1

2 · π0.32 exp�−(i− (2 + 1))2 + (j − (2 + 1))2

2 · 0.32�

Ukuran dari filter gauss mempengaruh hasil algoritma Canny. Semakin kecilfilter maka semakin kecil efek bur yang dihasilkan, dan mengijinkan untuk mende-teksi garis kecil yang tajam. Semakin besar filter maka semakin besar pula efek bluryang dihasilkan. Blur yang besar berguna untuk medeteksi sisi yang besar dan halus.

Setelah diperoleh gambar yang telah dikonvolusi dengan menggunakan filtergauss matriks gambar P dikonvolusi dengan menggunakan filter sobel, filter sobeladalah sepasang filter yang digunakan untuk mengetahui gradien dari gambar P un-

23

Page 38: PENGENAL PELAT KENDARAAN BERMOTOR …

Gambar 4.1: font asli

Gambar 4.2: data yang dibangkitkan

24

Page 39: PENGENAL PELAT KENDARAAN BERMOTOR …

(a) (b)

Gambar 4.3: (a) Gambar original sebelum dikalikan dengan filter gauss (b) Gambarsetelah diubah menjadi hitam putih kemudian diberi filter gauss

(a) (b)

Gambar 4.4: (a) Vektor Gx dalam gambar (b)Visualisasi Gy dalam gambar

tuk masing-masing entri dari P ij . Untuk kepentingan visualisasi, karena peta sudutyang dihasilkan oleh operator sobel berada diantara 0◦ ≤ 360◦ sementara skala abuberkisar antara 0 ≤ 255 maka setiap entri dari matriks hasil konvolusi dikalikan 255

kemudian dibagi dengan 360. Gambar 4.5 menunjukan visualisasi hasil konvolusiantara matriks yang telah dikonvolusi menggunakan kernel gauss dengan sepasang

operator sobel. Gx =

−1 0 +1

−2 0 +2

−1 0 +1

∗ P and Gy =

+1 +2 +1

0 0 0

−1 −2 −1

∗ P

Setelah matriks Gx dan matriks Gy diperoleh kemudian kita membuat ma-triks baru yang berisi arah gradien untuk masing masing piksel P ij yaitu θ dimanaθij = arctan(

Gxij

Gyij). Dan kita juga hitung besarnya gradien untuk masing-masing

piksel aij =�Gx

2ij +Gx

2ij . Gambar ?? merpresentasikan arah gradien dan besar-

nya gradien.

25

Page 40: PENGENAL PELAT KENDARAAN BERMOTOR …

(a) (b)

Gambar 4.5: (a) Arah gradien untuk masing-masing piksel, semakin putih gambarmaka sudut gradien semakin mendekati 360◦ (b) Besarnya gradien dari gambar, pikselpaling putih menunjukan perubahan warna yang tinggi dari gambar original dalamsumbu x dan y

Setelah kita memperoleh matriks arah gradien maka selajutnya adalah mela-kukan double thresholding dan non maximum suppression untuk menghilangkan sisiyang salah (false positive) sehingga diperoleh peta sisi Canny, yang diperlihatkan olehgambar 4.6

4.3 Hasil Pendeteksian teks menggunakan Stroke Width Transform

Untuk melakukan pendeteksian sisi terlebih dahulu kita harus mendeteksi sisidari gambar menggunakan algoritma Canny edge detecation.Berikut ini merupakanpeta sis hasil dari pendeteksian sisi menggunakan canny edge detection seperti padagambar 4.6.

Setelah peta sisi diperoleh menggunakan operator Canny edge detection makadilakukan algoritma stroke width transform untuk mendeteksi letak teks pada gambar,output dari algoritma stroke width transform adalah peta stroke yaitu garis-garis yangtegak lurus degan gradien pada peta sisi Canny yang nantinya akan masuk kategoriteks jika panjang dari garis tersebut konsisten.

Setelah peta stroke diperoleh, langkah selanjutnya adalah memilih kandidatberdasarkan lebar garis berikut ini merupakan komponen terhubung yang terdeteksisebagai teks.perhatikan bahwa hasil ekstraksi yang bukanlah komponen terhubung melainkan po-sisi dari komponen terhubung yang masuk ke dalam kategori teks, sementara hurufyang diklasifikasi menggunakan jaringan saraf tiruan adalah huruf pada gambar ori-

26

Page 41: PENGENAL PELAT KENDARAAN BERMOTOR …

Gambar 4.6: Peta sisi output dari algoritma Canny edge detection

ginal.

4.4 Hasil Training Jaringan Saraf Tiruan

Untuk menggunakan jaringan saraf tiruan sebagai pengenal karakter maka kitaharus mentrain model jaringan saraf tiraun terlebih dahulu, dalam skripsi ini dibuat 9model jaringan saraf tiruan, dengan berbagai arsitektur berikut ini adalah hasil dari 9model tersebut.

Pada gambar 4.9 akurasi yang diperoleh pada akhir epoch adalah 97.52 per-sen, pada gambar 4.10 jumlah unit neuron pada hidden layer ditingkatkan menjadi150 kita peroleh akurasi meningkat menjadi 97.69. Kemudian dengan 200 hidden

unit akurasi meningkat menjadi 97.6 persen. Dari hasil yang ditunjukan gambar 4.12,4.13, 4.14, total unit pada hidden layer memiliki jumlah yang sama dengan total unithidden layer pada gambar 4.9,4.10 dan 4.11 tetapi dengan dua buah hidden layer.Gambar ??(a) adalah Jaringan saraf tiruan konvolusi dengan ditambah satu fully con-

nected layer berjumlah 10 unit, berdasarkan hasil yang diperoleh tidak ada pening-katan yang signifikan jika dibandingkan dengan multi layer perceptron yaitu 97.62.Peningkatan terlihat saat kita tingkatkan jumlah fully connected layer menjadi 100,

27

Page 42: PENGENAL PELAT KENDARAAN BERMOTOR …

Gambar 4.7: Peta stroke yang dihasilkan algoritma stroke width transform, area pu-tih merupakan kandidat dari teks, area putih ini biasa disebut komponen terhubung(connected component)

28

Page 43: PENGENAL PELAT KENDARAAN BERMOTOR …

Gambar 4.8: Peta stroke yang dihasilkan algoritma stroke width transform, area pu-tih merupakan kandidat dari teks, area putih ini biasa disebut komponen terhubung(connected component)

29

Page 44: PENGENAL PELAT KENDARAAN BERMOTOR …

Gambar 4.9: merupakan Jaringan saraf tiruan dengan arsitektur: 1 hidden layer se-banyak 100 unit neuron dengan fungsi aktivasi sigmoid dan satu output layer dengan36 unit neuron

kita peroleh akurasi sebesar 97.8. Tetapi ketika jumlah layer perceptron kita tingkatk-an menjadi 1000 terjadi perbedaan yang signifikan (akurasi 99.54) dengan saat multi

layer perceptron berjumlah 100. Dari berbagai arsiteketur kita piliih model denganconvolutional neural network dengan jumlah percepron pada fully connected layer

sebanyak 1000 sebagai model terbaik.Setelah jaringan saraf tiruan dilatih maka kita dapat menggunakan model-

model tersebut, hasil yang diperoleh oleh masing-masing model tersebut untuk ka-rakter pada gambar 4.3 adalah "R9146RB". Jadi kesembilan model tersebut memilikiakurasi yang cukup baik.

30

Page 45: PENGENAL PELAT KENDARAAN BERMOTOR …

Gambar 4.10: merupakan Jaringan saraf tiruan dengan arsitektur: 1 hidden layer se-banyak 150 unit neuron dengan fungsi aktivasi sigmoid dan satu output layer dengan36 unit neuron

Gambar 4.11: merupakan Jaringan saraf tiruan dengan arsitektur: 1 hidden layer se-banyak 200 unit neuron dengan fungsi aktivasi sigmoid dan satu output layer dengan36 unit neuron

31

Page 46: PENGENAL PELAT KENDARAAN BERMOTOR …

Gambar 4.12: merupakan Jaringan saraf tiruan dengan arsitektur: 2 hidden layer 50unit pada layer ke dua dan 50 unit pada layer ke 3, dengan fungsi aktivasi sigmoiddan satu output layer dengan 36 unit neuron

Gambar 4.13: merupakan Jaringan saraf tiruan dengan arsitektur: 2 hidden layersebanyak 75 unit pada layer ke dua dan 75 unit pada layer ke 3 fungsi aktivasi sigmoiddan satu output layer dengan 36 unit neuron

32

Page 47: PENGENAL PELAT KENDARAAN BERMOTOR …

Gambar 4.14: merupakan Jaringan saraf tiruan dengan arsitektur: 2 hidden layersebanyak 100 unit pada layer ke dua dan 100 unit pada layer ke 3 dengan fungsiaktivasi sigmoid dan satu output layer dengan 36 unit neuron

Gambar 4.15: merupakan Jaringan saraf tiruan dengan arsitektur: 2 hidden layersebanyak 100 unit pada layer ke dua dan 100 unit pada layer ke 3 dengan fungsiaktivasi sigmoid dan satu output layer dengan 36 unit neuron

33

Page 48: PENGENAL PELAT KENDARAAN BERMOTOR …

Gambar 4.16: merupakan Jaringan saraf tiruan dengan arsitektur: 2 hidden layersebanyak 100 unit pada layer ke dua dan 100 unit pada layer ke 3 dengan fungsiaktivasi sigmoid dan satu output layer dengan 36 unit neuron

Gambar 4.17: merupakan Jaringan saraf tiruan dengan arsitektur: 2 hidden layersebanyak 100 unit pada layer ke dua dan 100 unit pada layer ke 3 dengan fungsiaktivasi sigmoid dan satu output layer dengan 36 unit neuron

34

Page 49: PENGENAL PELAT KENDARAAN BERMOTOR …

BAB V

KESIMPULAN DAN SARAN

5.1 Kesimpulan

Berdasarkan penelitian yang dilakukan penulis dapat disimpulakan bahwa:

1. Akurasi jaringan saraf tiruan dengan arsitektur: 2 hidden layer sebanyak 100unit pada layer ke dua dan 100 unit pada layer ke 3 dengan fungsi aktivasisigmoid dan satu output layer dengan 36 unit neuron telah data plat nomoradalah 97.52 persen

2. Akurasi jaringan saraf tiruan dengan arsitektur: 2 hidden layer sebanyak 150unit pada layer ke dua dan 150 unit pada layer ke 3 dengan fungsi aktivasisigmoid dan satu output layer dengan 36 unit neuron telah data plat nomoradalah 97.69 persen

3. Akurasi jaringan saraf tiruan dengan arsitektur: 2 hidden layer sebanyak 200unit pada layer ke dua dan 200 unit pada layer ke 3 dengan fungsi aktivasisigmoid dan satu output layer dengan 36 unit neuron telah data plat nomoradalah 97.60 persen

5.2 Saran

Dalam penelitian ini masih terdapat banyak keurangan diantaranya penulismasih menggunakan data yang dibangkitkan menggunakan program komputer untukmelatih model jaringan saraf tiruan. Dalam penelitian selanjutnya disarankan untukmenggunakan data asli untuk melatih model jaringan saraf tiruan.

35

Page 50: PENGENAL PELAT KENDARAAN BERMOTOR …

DAFTAR PUSTAKA

[1] B. Epshtein, E. Ofek, and Y. Wexler, “Detecting text in natural scenes with strokewidth transform,” in Computer Vision and Pattern Recognition (CVPR), 2010

IEEE Conference on. IEEE, 2010, pp. 2963–2970.

[2] N. Srivastava, G. E. Hinton, A. Krizhevsky, I. Sutskever, and R. Salakhutdinov,“Dropout: a simple way to prevent neural networks from overfitting.” Journal of

Machine Learning Research, vol. 15, no. 1, pp. 1929–1958, 2014.

[3] I. Goodfellow, Y. Bengio, and A. Courville, Deep Learning. MIT Press, 2016,http://www.deeplearningbook.org.

[4] S. J. Prince, Computer vision: models, learning, and inference. CambridgeUniversity Press, 2012.

[5] M. S. Nixon and A. S. Aguado, Feature extraction & image processing for com-

puter vision. Academic Press, 2012.

[6] S. Haykin, Neural networks and learning machines. Pearson Upper SaddleRiver, NJ, USA:, 2009, vol. 3.

[7] R. O. Duda, P. E. Hart, and D. G. Stork, “Pattern classification,” International

Journal of Computational Intelligence and Applications, vol. 1, pp. 335–339,2001.

[8] S. J. Nowlan and G. E. Hinton, “Simplifying neural networks by soft weight-sharing,” Neural computation, vol. 4, no. 4, pp. 473–493, 1992.

[9] H. Y. Xiong, Y. Barash, and B. J. Frey, “Bayesian prediction of tissue-regulatedsplicing using rna sequence and cellular context,” Bioinformatics, vol. 27, no. 18,pp. 2554–2562, 2011.

36

Page 51: PENGENAL PELAT KENDARAAN BERMOTOR …

LAMPIRAN A

Sourcecode Global Contrast Normalization

import Image

import numpy as np

import math

def global_contrast_normalization(filename, s, lmda, epsilon):

X = np.array(Image.open(filename))

X_prime=X

r,c,u=X.shape

su=0

X_average=X.mean()

for i in range(r):

for j in range(c):

for k in range(u):

su=su+((X[i][j][k])-X_average)**2

contrast=np.sqrt(lmda+(float(su)/(r*c*u)))

X_prime=(X_prime-X)/max(epsilon,contrast)

print X_prime.std()

X_prime = np.array(X_prime, np.uint8)

Image.fromarray(X_prime).save("result.jpg")

print "halo"

Image.fromarray(X-X_prime).save("kk.jpg")

global_contrast_normalization("low.jpg",1,10,0.0001)

X=np.array(Image.open("low.jpg"))

M=np.array(Image.open("low.jpg"))

print X.std()

X=(X-X.mean())/X.std()

X=X-X.min()

37

Page 52: PENGENAL PELAT KENDARAAN BERMOTOR …

X=X/X.max()

X=X*255

X=np.array(X,np.uint8)

print X.std()

print type(X[0][1][0])

Image.fromarray((X-M)).save("selisih.jpg")

Image.fromarray(X).save("gambar.jpg")

38

Page 53: PENGENAL PELAT KENDARAAN BERMOTOR …

LAMPIRAN B

sourcecode canny edge detector

import scipy.ndimage as ndi

import scipy

import numpy

from PIL import Image

import math

from math import pi

sigma=0.3

def conv2d(image, kernel):

m, n = image.shape

p, q = kernel.shape

result = numpy.zeros((m - p + 1, n - q + 1))

temp = 0

for i in range(m - p + 1):

for j in range(n - q + 1):

for k in range(p):

for l in range(q):

temp = temp + (image[i + k][j + l] * kernel[k][l])

result[i][j] = temp

temp=0

return result

f=’trukpasir.jpg’

img=Image.open(f).convert(’L’)

imgdata=numpy.array(img,dtype=float)

G=ndi.filters.gaussian_filter(imgdata,sigma)

sobelout=Image.new(’L’,img.size)

gradx=numpy.array(sobelout,dtype=float)

grady=numpy.array(sobelout,dtype=float)

sobel_x=[

[-1,0,1],

39

Page 54: PENGENAL PELAT KENDARAAN BERMOTOR …

[-2,0,2],

[-1,0,1]

]

sobel_y=[

[0,0,0],

[1,2,1],

[-1,-2,-1],

]

width=img.size[1]

height=img.size[0]

sobel_x=numpy.array(sobel_x,dtype=float)

sobel_y=numpy.array(sobel_y,dtype=float)

conv_x=conv2d(G,sobel_x)

conv_y=conv2d(G,sobel_y)

for i in range(1,width-1):

for j in range(1,height-1):

gradx[i][j]=conv_x[i-1][j-1]

grady[i][j]=conv_y[i-1][j-1]

Image.fromarray(numpy.array(gradx,numpy.uint8)).save("gradx.png")

sobeloutmag = scipy.hypot(gradx, grady)

sobeloutdir = scipy.arctan2(grady, gradx)

sobeloutdir=numpy.rad2deg(sobeloutdir)

scipy.misc.imsave(’cannynewmag.png’, sobeloutmag)

scipy.misc.imsave(’cannynewdir.png’, sobeloutdir)

for x in range(width):

for y in range(height):

if (sobeloutdir[x][y]<22.5 and sobeloutdir[x][y]>=0) or \

(sobeloutdir[x][y]>=157.5 and sobeloutdir[x][y]<202.5) or \

(sobeloutdir[x][y]>=337.5 and sobeloutdir[x][y]<=360):

sobeloutdir[x][y]=0

elif (sobeloutdir[x][y]>=22.5 and sobeloutdir[x][y]<67.5) or \

40

Page 55: PENGENAL PELAT KENDARAAN BERMOTOR …

(sobeloutdir[x][y]>=202.5 and sobeloutdir[x][y]<247.5):

sobeloutdir[x][y]=45

elif (sobeloutdir[x][y]>=67.5 and sobeloutdir[x][y]<112.5)or \

(sobeloutdir[x][y]>=247.5 and sobeloutdir[x][y]<292.5):

sobeloutdir[x][y]=90

else:

sobeloutdir[x][y]=135

scipy.misc.imsave(’cannynewdirquantize.jpg’, sobeloutdir)

mag_sup = sobeloutmag.copy()

for x in range(1, width-1):

for y in range(1, height-1):

if sobeloutdir[x][y]==0:

if (sobeloutmag[x][y]<=sobeloutmag[x][y+1]) or \

(sobeloutmag[x][y]<=sobeloutmag[x][y-1]):

mag_sup[x][y]=0

elif sobeloutdir[x][y]==45:

if (sobeloutmag[x][y]<=sobeloutmag[x-1][y+1]) or \

(sobeloutmag[x][y]<=sobeloutmag[x+1][y-1]):

mag_sup[x][y]=0

elif sobeloutdir[x][y]==90:

if (sobeloutmag[x][y]<=sobeloutmag[x+1][y]) or \

(sobeloutmag[x][y]<=sobeloutmag[x-1][y]):

mag_sup[x][y]=0

else:

if (sobeloutmag[x][y]<=sobeloutmag[x+1][y+1]) or \

(sobeloutmag[x][y]<=sobeloutmag[x-1][y-1]):

mag_sup[x][y]=0

scipy.misc.imsave(’cannynewmagsup.jpg’, mag_sup)

41

Page 56: PENGENAL PELAT KENDARAAN BERMOTOR …

m = numpy.max(mag_sup)

th = 0.2*m

tl = 0.1*m

gnh = numpy.zeros((width, height))

gnl = numpy.zeros((width, height))

for x in range(width):

for y in range(height):

if mag_sup[x][y]>=th:

gnh[x][y]=mag_sup[x][y]

if mag_sup[x][y]>=tl:

gnl[x][y]=mag_sup[x][y]

gnl = gnl-gnh

scipy.misc.imsave(’cannynewgnlafterminus.jpg’, gnl)

scipy.misc.imsave(’cannynewgnh.jpg’, gnh)

def traverse(i, j):

x = [-1, 0, 1, -1, 1, -1, 0, 1]

y = [-1, -1, -1, 0, 0, 1, 1, 1]

for k in range(8):

if gnh[i+x[k]][j+y[k]]==0 and gnl[i+x[k]][j+y[k]]!=0:

gnh[i+x[k]][j+y[k]]=1

traverse(i+x[k], j+y[k])

for i in range(1, width-1):

for j in range(1, height-1):

if gnh[i][j]:

gnh[i][j]=1

traverse(i, j)

for i in range(gnh.shape[0]):

42

Page 57: PENGENAL PELAT KENDARAAN BERMOTOR …

for j in range(gnh.shape[1]):

if gnh[i][j]!=0:

gnh[i][j]=1

scipy.misc.imsave(’cannynewout.png’, gnh)

43

Page 58: PENGENAL PELAT KENDARAAN BERMOTOR …

LAMPIRAN C

sourcode untuk membangkitkan data

import scipy.ndimage as ndi

import numpy as np

from PIL import Image

import random

import cannyedge

import os

from scipy.ndimage import rotate

import sys

def gaussian_blur(img):

sigma=random.uniform(0,1)

imgdata = np.array(img, dtype=float)

G = ndi.filters.gaussian_filter(imgdata, sigma=sigma) # gaussian

return G

def rotate_img(img):

degree=random.uniform(-5,5)

return rotate(img, degree, reshape=False)

def reduce_size(img):

sigma=random.uniform(0,1)

im = np.array(img)

iteration=random.randint(1,50)

for i in range(iteration):

edge = cannyedge.auto_canny(im, sigma)

for i in range(edge.shape[0]):

for j in range(edge.shape[1]):

if (random.randint(0, 1)):

edge[i][j] = 0

if(random.randint(0,1)):

im=im - edge

else:

im=im+edge

44

Page 59: PENGENAL PELAT KENDARAAN BERMOTOR …

return im

def alter_image(image_path):

img = Image.open(image_path).convert(’L’) # grayscale

blurr=rotate_img(img)

reduced=reduce_size(img)

rotated=rotate_img(reduced)

blurred=gaussian_blur(rotated)

return blurred

def threshold_image(img):

threshold=random.randint(1,255)

for i in range(img.shape[0]):

for j in range(img.shape[1]):

if img[i][j]>threshold:

img[i][j]=255

if img[i][j]<threshold:

img[i][j]=0

return img

letters=[’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’,

’a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’i’,’j’,’k’,

’l’,’m’,’n’,’o’,’p’,’q’,’r’,’s’,’t’,’u’,’v’,

’w’,’x’,’y’,’z’]

size=28,28

for letter in letters:

k=0

directory="generated/"+letter

if not os.path.exists(directory):

os.makedirs(directory)

for i in range(10000):

final=alter_image("original/"+letter+".png")

final2=alter_image("original/"+letter+".png")

im=Image\

.fromarray(threshold_image((final+final2)/2.0))\

.convert(’RGB’)

im=im.resize(size,Image.ANTIALIAS)

45

Page 60: PENGENAL PELAT KENDARAAN BERMOTOR …

im.save("generated/" + letter + "/" + str(k) + ".jpg")

print letter+" "+str(k)

k=k+1

46

Page 61: PENGENAL PELAT KENDARAAN BERMOTOR …

LAMPIRAN D

sourcecode algoritma stroke width transform

import scipy.ndimage as ndi

import numpy as np

from PIL import Image

import random

import cannyedge

import os

from scipy.ndimage import rotate

import sys

def gaussian_blur(img):

sigma=random.uniform(0,1)

imgdata = np.array(img, dtype=float)

G = ndi.filters.gaussian_filter(imgdata, sigma=sigma) # gaussian low

return G

def rotate_img(img):

degree=random.uniform(-5,5)

return rotate(img, degree, reshape=False)

def reduce_size(img):

sigma=random.uniform(0,1)

im = np.array(img)

iteration=random.randint(1,50)

for i in range(iteration):

edge = cannyedge.auto_canny(im, sigma)

for i in range(edge.shape[0]):

for j in range(edge.shape[1]):

if (random.randint(0, 1)):

edge[i][j] = 0

if(random.randint(0,1)):

im=im - edge

else:

im=im+edge

47

Page 62: PENGENAL PELAT KENDARAAN BERMOTOR …

return im

def alter_image(image_path):

img = Image.open(image_path).convert(’L’) # grayscale

blurr=rotate_img(img)

reduced=reduce_size(img)

rotated=rotate_img(reduced)

blurred=gaussian_blur(rotated)

return blurred

def threshold_image(img):

threshold=random.randint(1,255)

for i in range(img.shape[0]):

for j in range(img.shape[1]):

if img[i][j]>threshold:

img[i][j]=255

if img[i][j]<threshold:

img[i][j]=0

return img

letters=[’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’0’,

’a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’i’,’j’,’k’,

’l’,’m’,’n’,’o’,’p’,’q’,’r’,’s’,’t’,’u’,’v’,

’w’,’x’,’y’,’z’]

size=28,28

for letter in letters:

k=0

directory="generated/"+letter

if not os.path.exists(directory):

os.makedirs(directory)

for i in range(10000):

final=alter_image("original/"+letter+".png")

final2=alter_image("original/"+letter+".png")

im=Image\

.fromarray(threshold_image((final+final2)/2.0))\

.convert(’RGB’)

im=im.resize(size,Image.ANTIALIAS)

48

Page 63: PENGENAL PELAT KENDARAAN BERMOTOR …

im.save("generated/" + letter + "/" + str(k) + ".jpg")

print letter+" "+str(k)

k=k+1

49

Page 64: PENGENAL PELAT KENDARAAN BERMOTOR …

LAMPIRAN E

sourcecode multilayered perceptron dan convolutional neuralnetwork

import cPickle

import gzip

import numpy as np

import theano

import theano.tensor as T

from theano.tensor.nnet import conv

from theano.tensor.nnet import softmax

from theano.tensor import shared_randomstreams

from theano.tensor.signal import pool

def linear(z): return z

def ReLU(z): return T.maximum(0.0, z)

from theano.tensor.nnet import sigmoid

from theano.tensor import tanh

try:

theano.config.device = ’gpu’

except:

pass

theano.config.floatX = ’float32’

def load_data(filename="pelatnomor.pkl.gz"):

f = gzip.open(filename, ’rb’)

training_data, validation_data, test_data = cPickle.load(f)

50

Page 65: PENGENAL PELAT KENDARAAN BERMOTOR …

f.close()

def shared(data):

shared_x = theano.shared(

np.asarray(data[0], dtype=theano.config.floatX), borrow=True)

shared_y = theano.shared(

np.asarray(data[1], dtype=theano.config.floatX), borrow=True)

return shared_x, T.cast(shared_y, "int32")

return [shared(training_data), shared(validation_data), shared(test_data)]

class Network(object):

def __init__(self, layers, mini_batch_size):

self.layers = layers

self.mini_batch_size = mini_batch_size

self.params = [param for layer in self.layers for param in layer.params]

self.x = T.matrix("x")

self.y = T.ivector("y")

init_layer = self.layers[0]

init_layer.set_inpt(self.x, self.x, self.mini_batch_size)

for j in xrange(1, len(self.layers)):

prev_layer, layer = self.layers[j - 1], self.layers[j]

layer.set_inpt(

prev_layer.output, prev_layer.output_dropout, self.mini_batch_size)

self.output = self.layers[-1].output

self.output_dropout = self.layers[-1].output_dropout

def train(self, training_data, epochs, mini_batch_size, eta,

validation_data, test_data, lmbda=0.0):

training_x, training_y = training_data

validation_x, validation_y = validation_data

test_x, test_y = test_data

num_training_batches = size(training_data) / mini_batch_size

51

Page 66: PENGENAL PELAT KENDARAAN BERMOTOR …

num_validation_batches = size(validation_data) / mini_batch_size

num_test_batches = size(test_data) / mini_batch_size

l2_norm_squared = sum([(layer.w ** 2).sum() for layer in self.layers])

cost = self.layers[-1].cost(self) + \

0.5 * lmbda * l2_norm_squared / num_training_batches

grads = T.grad(cost, self.params)

updates = [(param, param - eta * grad)

for param, grad in zip(self.params, grads)]

i = T.lscalar() # mini-batch index

train_mb = theano.function(

[i], cost, updates=updates,

givens={

self.x:

training_x[i * self.mini_batch_size: (i + 1) * self.mini_batch_size],

self.y:

training_y[i * self.mini_batch_size: (i + 1) * self.mini_batch_size]

})

validate_mb_accuracy = theano.function(

[i], self.layers[-1].accuracy(self.y),

givens={

self.x:

validation_x[i * self.mini_batch_size: (i + 1) * self.mini_batch_size],

self.y:

validation_y[i * self.mini_batch_size: (i + 1) * self.mini_batch_size]

})

test_mb_accuracy = theano.function(

[i], self.layers[-1].accuracy(self.y),

givens={

self.x:

test_x[i * self.mini_batch_size: (i + 1) * self.mini_batch_size],

self.y:

test_y[i * self.mini_batch_size: (i + 1) * self.mini_batch_size]

})

52

Page 67: PENGENAL PELAT KENDARAAN BERMOTOR …

self.test_mb_predictions = theano.function(

[i], self.layers[-1].y_out,

givens={

self.x:

test_x[i * self.mini_batch_size: (i + 1) * self.mini_batch_size]

})

best_validation_accuracy = 0.0

for epoch in xrange(epochs):

for minibatch_index in xrange(num_training_batches):

iteration = num_training_batches * epoch + minibatch_index

if iteration % 1000 == 0:

print("mini-batch ke - "+str(iteration))

cost_ij = train_mb(minibatch_index)

if (iteration + 1) % num_training_batches == 0:

validation_accuracy = np.mean(

[validate_mb_accuracy(j) for j in xrange(num_validation_batches)])

print("Epoch {0}: akruasi terhadap data validasi {1:.2%}".format(

epoch, validation_accuracy))

with open("percobaan5.txt", "a") as myfile:

myfile.write(str(validation_accuracy * 100.0) + ", ")

if validation_accuracy >= best_validation_accuracy:

print("akurasi validasi terbaru.")

best_validation_accuracy = validation_accuracy

best_iteration = iteration

if test_data:

test_accuracy = np.mean(

[test_mb_accuracy(j) for j in xrange(num_test_batches)])

print(’The corresponding test accuracy is {0:.2%}’.format(

test_accuracy))

print("Finished training network.")

print("Best validation accuracy of {0:.2%} obtained at iteration {1}".format(

best_validation_accuracy, best_iteration))

print("akurasi saat ini {0:.2%}".format(test_accuracy))

53

Page 68: PENGENAL PELAT KENDARAAN BERMOTOR …

class ConvPoolLayer(object):

def __init__(self, filter_shape, image_shape, poolsize=(2, 2),

activation_fn=sigmoid):

self.filter_shape = filter_shape

self.image_shape = image_shape

self.poolsize = poolsize

self.activation_fn = activation_fn

# initialize weights and biases

n_out = (filter_shape[0] * np.prod(filter_shape[2:]) / np.prod(poolsize))

self.w = theano.shared(

np.asarray(

np.random.normal(loc=0, scale=np.sqrt(1.0 / n_out), size=filter_shape),

dtype=theano.config.floatX),

borrow=True)

self.b = theano.shared(

np.asarray(

np.random.normal(loc=0, scale=1.0, size=(filter_shape[0],)),

dtype=theano.config.floatX),

borrow=True)

self.params = [self.w, self.b]

def set_inpt(self, inpt, inpt_dropout, mini_batch_size):

self.inpt = inpt.reshape(self.image_shape)

conv_out = conv.conv2d(

input=self.inpt, filters=self.w, filter_shape=self.filter_shape,

image_shape=self.image_shape)

pooled_out = pool.max_pool_2d(

input=conv_out, ds=self.poolsize, ignore_border=True)

self.output = self.activation_fn(

pooled_out + self.b.dimshuffle(’x’, 0, ’x’, ’x’))

self.output_dropout = self.output

54

Page 69: PENGENAL PELAT KENDARAAN BERMOTOR …

class PerceptronLayer(object):

def __init__(self, n_in, n_out, activation_fn=sigmoid, p_dropout=0.0):

self.n_in = n_in

self.n_out = n_out

self.activation_fn = activation_fn

self.p_dropout = p_dropout

# Initialize weights and biases

self.w = theano.shared(

np.asarray(

np.random.normal(

loc=0.0, scale=np.sqrt(1.0 / n_out), size=(n_in, n_out)),

dtype=theano.config.floatX),

name=’w’, borrow=True)

self.b = theano.shared(

np.asarray(np.random.normal(loc=0.0, scale=1.0, size=(n_out,)),

dtype=theano.config.floatX),

name=’b’, borrow=True)

self.params = [self.w, self.b]

def set_inpt(self, inpt, inpt_dropout, mini_batch_size):

self.inpt = inpt.reshape((mini_batch_size, self.n_in))

self.output = self.activation_fn(

(1 - self.p_dropout) * T.dot(self.inpt, self.w) + self.b)

self.y_out = T.argmax(self.output, axis=1)

self.inpt_dropout = dropout_layer(

inpt_dropout.reshape((mini_batch_size, self.n_in)), self.p_dropout)

self.output_dropout = self.activation_fn(

T.dot(self.inpt_dropout, self.w) + self.b)

def cost(self, net):

return T.mean((0.5) * (net.y - self.output) ** 2)

def accuracy(self, y):

return T.mean(T.eq(y, self.y_out))

55

Page 70: PENGENAL PELAT KENDARAAN BERMOTOR …

class SoftmaxLayer(object):

def __init__(self, n_in, n_out, p_dropout=0.0):

self.n_in = n_in

self.n_out = n_out

self.p_dropout = p_dropout

# Initialize weights and biases

self.w = theano.shared(

np.zeros((n_in, n_out), dtype=theano.config.floatX),

name=’w’, borrow=True)

self.b = theano.shared(

np.zeros((n_out,), dtype=theano.config.floatX),

name=’b’, borrow=True)

self.params = [self.w, self.b]

def set_inpt(self, inpt, inpt_dropout, mini_batch_size):

self.inpt = inpt.reshape((mini_batch_size, self.n_in))

self.output = softmax((1 - self.p_dropout) * T.dot(self.inpt, self.w)

self.y_out = T.argmax(self.output, axis=1)

self.inpt_dropout = dropout_layer(

inpt_dropout.reshape((mini_batch_size, self.n_in)), self.p_dropout)

self.output_dropout = softmax(T.dot(self.inpt_dropout, self.w) + self.b)

def cost(self, net):

return -T.mean(T.log(self.output_dropout)[T.arange(net.y.shape[0]),

def accuracy(self, y):

return T.mean(T.eq(y, self.y_out))

def size(data):

return data[0].get_value(borrow=True).shape[0]

56

Page 71: PENGENAL PELAT KENDARAAN BERMOTOR …

def dropout_layer(layer, p_dropout):

srng = shared_randomstreams.RandomStreams(

np.random.RandomState(0).randint(999999))

mask = srng.binomial(n=1, p=1 - p_dropout, size=layer.shape)

return layer * T.cast(mask, theano.config.floatX)

training_data, validation_data, test_data = load_data()

mini_batch_size = 36

net = Network([

PerceptronLayer(n_in=784, n_out=50, activation_fn=tanh),

PerceptronLayer(n_in=50, n_out=50, activation_fn=tanh),

PerceptronLayer(n_in=50, n_out=50, activation_fn=tanh),

SoftmaxLayer(n_in=50, n_out=36)], mini_batch_size)

net.train(training_data, 40, 36, 0.3, validation_data, test_data)

57