OCR (Optical Character Recognition) dengan teknik Back-Propagation 2


OCR (Optical Character Recognition) adalah konversi sebuah gambar yang mengandung karakter teks yang diketik atau tulisan tangan menjadi karakter teks itu sendiri. Contoh yang dibahas kali ini adalah mengenai pengenalan karakter pada gambar baru berdasarkan data gambar yang sudah ada.
OCR (Optical Character Recognition) adalah salah satu tipe dari pengenalan gambar (Image Recognition). Teknik pengenalan gambar dapat digunakan dalam beberapa bidang, seperti sistem login menggunakan pemindai retina atau sidik jari dan pada kamera cctv untuk mencari seseorang yang termasuk dalam daftar pencarian orang. Pada kali ini akan dibahas teknik pengenalan karakter teks berdasarkan gambar yang sudah diketahui. Nantinya akan digunakan Algoritma Back-Propagation untuk menghitung nilai bobot gambar-gambar yang sudah ada, dan nilai bobot tersebut akan digunakan untuk memprediksikan karakter teks dari gambar-gambar yang baru.



Diasumsikan ada 8 data gambar yang sudah diketahui, yaitu 4 data angka 0 dan 4 data angka 1
Diasumsikan 8 data tersebut adalah sebagai berikut:
ssocr1



Selanjutnya ada 3 data gambar baru yang belum diketahui hasilnya
Maka tentukan nilai karakter teks dari masing-masing gambar tersebut
Diasumsikan data awalnya adalah sebagai berikut:
ssocr2


Langkah-langkah penggunaan algoritma ini adalah

1. Tentukan normalisasi data pada semua gambar
Dalam kasus ini, data akan dinormalisasi dengan cara nilai 0 untuk warna putih dan nilai 1 untuk warna selain putih

Dim input(bmp.Height * bmp.Width + pixelOutput - 1) As Byte
Dim idxInput As Integer = 0
For i = 0 To bmp.Height - 1
	For j = 0 To bmp.Width - 1
		pixels(i)(j) = CInt((CInt(bmp.GetPixel(i, j).R) + CInt(bmp.GetPixel(i, j).G) + CInt(bmp.GetPixel(i, j).B)) / 3)
		input(idxInput) = IIf(255 - pixels(i)(j), 1, 0)
		idxInput += 1
	Next j
Next i

Dim gmb As New Gambar(bmp.Height, bmp.Width, pixels, output)
Dim bitMap As Bitmap = BuatBitmap(gmb, 5)
pic.Image = bitMap.Clone
bitMap.Dispose()

* Gunakan fungsi ini untuk membuat bitmap dari inputan gambar
Penjelasan mengenai langkah-langkah perhitungan dapat dilihat pada keterangan skrip dibawah ini

Public Function BuatBitmap(ByVal gmb As Gambar, ByVal zoom As Integer) As Bitmap
	Dim bmp As New Bitmap(gmb.lebar * zoom, gmb.panjang * zoom)
	Dim gr As Graphics = Graphics.FromImage(bmp)

	For i = 0 To gmb.panjang - 1
		For j = 0 To gmb.lebar - 1
			Dim warnaPixel As Integer = gmb.pixels(i)(j)
			Dim warna As Color = Color.FromArgb(warnaPixel, warnaPixel, warnaPixel)

			Dim sb As New SolidBrush(warna)
			gr.FillRectangle(sb, i * zoom, j * zoom, zoom, zoom)
		Next j
	Next i
	Return bmp
End Function

2. Tentukan skema awal untuk algoritma ini.
Algoritma ini dapat digunakan untuk melakukan perhitungan yang memiliki banyak input dan menghasilkan banyak output
Diasumsikan dalam kasus ini, skema yang digunakan adalah 196 – 250 – 2, dimana:

  • 196 adalah jumlah saraf input, sesuai dengan jumlah pixel dalam setiap gambar, yaitu 14 x 14 pixel
  • 250 adalah jumlah saraf tersembunyi yang digunakan. Jumlah saraf tersembunyi harus lebih dari jumlah saraf input
  • 2 adalah jumlah saraf output, karena akan digunakan 2 angka biner untuk merepresentasikan angka 0 dan 1
Const jumlahSarafInput As Integer = 196
Const jumlahSarafTersembunyi As Integer = 250
Const jumlahSarafOutput As Integer = 2
Dim jst As New JaringanSaraf(jumlahSarafInput, jumlahSarafTersembunyi, jumlahSarafOutput)

* Diperlukan sebuah class untuk menyimpan semua matriks data untuk digunakan dalam perhitungan algoritma ini. Class ini dinamakan class JaringanSaraf. Deklarasi awal untuk setiap pengisian data adalah sebagai berikut

Public Class JaringanSaraf
    Private Shared rnd As Random

    Private jumlahSarafInput As Integer
    Private jumlahSarafTersembunyi As Integer
    Private jumlahSarafOutput As Integer

    Private inputs As Double()

    'Matriks data untuk perhitungan jaringan saraf input-tersembunyi
    Private ihBobot As Double()()                   'Nilai bobot pada jaringan saraf input-tersembunyi
    Private hBias As Double()                       'Nilai bias pada jaringan saraf tersembunyi
    Private hOutput As Double()                     'Nilai output sementara pada jaringan saraf tersembunyi

    'Matriks data untuk perhitungan jaringan saraf tersembunyi-output
    Private hoBobot As Double()()                   'Nilai bobot pada jaringan tersembunyi-output
    Private oBias As Double()                       'Nilai bias pada jaringan saraf output

    Private outputs As Double()

    'Matriks data untuk menyimpan nilai gradien
    Private hGradient As Double()                   'Nilai gradien pada jaringan saraf tersembunyi
    Private oGradient As Double()                   'Nilai gradien pada jaringan saraf output

    'Matriks data untuk menyimpan nilai bobot untuk digunakan pada perhitungan momentum
    Private ihDeltaBobotSebelumnya As Double()()    'Nilai delta bobot sebelumnya pada jaringan saraf input-tersembunyi
    Private hDeltaBiasSebelumnya As Double()        'Nilai delta bias sebelumnya pada jaringan saraf tersembunyi
    Private hoDeltaBobotSebelumnya As Double()()    'Nilai delta bobot sebelumnya pada jaringan saraf tersembunyi-output
    Private oDeltaBiasSebelumnya As Double()        'Nilai delta bias sebelumnya pada jaringan saraf output

    Public Sub New(jumlahSarafInput As Integer, jumlahSarafTersembunyi As Integer, jumlahSarafOutput As Integer)
        rnd = New Random(0)
        Me.jumlahSarafInput = jumlahSarafInput
        Me.jumlahSarafTersembunyi = jumlahSarafTersembunyi
        Me.jumlahSarafOutput = jumlahSarafOutput

        Me.inputs = New Double(jumlahSarafInput - 1) {}

        Dim ihBobot As Double()() = New Double(jumlahSarafInput - 1)() {}
        For r As Integer = 0 To ihBobot.Length - 1
            ihBobot(r) = New Double(jumlahSarafTersembunyi - 1) {}
        Next
        Me.ihBobot = ihBobot
        Me.hBias = New Double(jumlahSarafTersembunyi - 1) {}
        Me.hOutput = New Double(jumlahSarafTersembunyi - 1) {}

        Dim hoBobot As Double()() = New Double(jumlahSarafTersembunyi - 1)() {}
        For r As Integer = 0 To hoBobot.Length - 1
            hoBobot(r) = New Double(jumlahSarafOutput - 1) {}
        Next
        Me.hoBobot = hoBobot
        Me.oBias = New Double(jumlahSarafOutput - 1) {}

        Me.outputs = New Double(jumlahSarafOutput - 1) {}

        Me.hGradient = New Double(jumlahSarafTersembunyi - 1) {}
        Me.oGradient = New Double(jumlahSarafOutput - 1) {}

        Dim ihDeltaBobotSebelumnya As Double()() = New Double(jumlahSarafInput - 1)() {}
        For r As Integer = 0 To ihDeltaBobotSebelumnya.Length - 1
            ihDeltaBobotSebelumnya(r) = New Double(jumlahSarafTersembunyi - 1) {}
        Next
        Me.ihDeltaBobotSebelumnya = ihDeltaBobotSebelumnya
        Me.hDeltaBiasSebelumnya = New Double(jumlahSarafTersembunyi - 1) {}
        Dim hoDeltaBobotSebelumnya As Double()() = New Double(jumlahSarafTersembunyi - 1)() {}
        For r As Integer = 0 To hoDeltaBobotSebelumnya.Length - 1
            hoDeltaBobotSebelumnya(r) = New Double(jumlahSarafOutput - 1) {}
        Next
        Me.hoDeltaBobotSebelumnya = hoDeltaBobotSebelumnya
        Me.oDeltaBiasSebelumnya = New Double(jumlahSarafOutput - 1) {}
    End Sub
	
	. . .
End Class

* Setelah melakukan inisialisasi diatas, maka akan dilakukan inisialisasi matriks bobot dan bias yang digunakan

  • jumlah nilai bobot pada jaringan saraf input-tersembunyi adalah jumlah saraf input * jumlah saraf tersembunyi (196 * 250 = 49.000 buah)
  • jumlah nilai bias pada jaringan saraf input-tersembunyi adalah jumlah saraf tersembunyi (250 buah)
  • jumlah nilai bobot pada jaringan saraf tersembunyi-output adalah jumlah saraf tersembunyi * jumlah saraf output (250 * 2 = 500 buah)
  • jumlah nilai bias pada jaringan saraf tersembunyi-output adalah jumlah saraf output (2 buah)

Sehingga, jumlah bobot yang diperlukan adalah 49.000 + 250 + 500 + 2 = 49.752 buah data
Kemudian pada masing-masing bobot, beri nilai awal dengan nilai acak yang sangat kecil (antara 0.001 sampai dengan 0.0001)

Dim jumlahBobot As Integer = (jumlahSarafInput * jumlahSarafTersembunyi) + (jumlahSarafTersembunyi * jumlahSarafOutput) + jumlahSarafTersembunyi + jumlahSarafOutput
Dim bobot As Double() = New Double(jumlahBobot - 1) {}
Dim lo As Double = 0.0001
Dim hi As Double = 0.001
For i As Integer = 0 To bobot.Length - 1
	bobot(i) = (hi - lo) * rnd.NextDouble() + lo
Next
Me.setBobot(bobot)

* Gunakan fungsi ini untuk memasukkan matriks bobot awal kedalam 4 matriks data yaitu matriks ihBobot, hBias, hoBobot, oBias
ihBobot adalah matriks bobot pada jaringan saraf input-tersembunyi, dengan jumlah data = jumlah saraf input * jumlah saraf tersembunyi (196 * 250 = 49.000 buah)
hBias adalah matriks nilai bias pada jaringan saraf input-tersembunyi, dengan jumlah data = jumlah saraf tersembunyi (250 buah)
hoBobot adalah matriks bobot pada jaringan saraf tersembunyi-output, dengan jumlah data = jumlah saraf tersembunyi * jumlah saraf output (250 * 2 = 500 buah)
oBias adalah matriks nilai bias pada jaringan saraf tersembunyi-output, dengan jumlah data = jumlah saraf output (2 buah)

Public Sub setBobot(bobot As Double())
	If bobotAwal.Length <> jumlahBobot Then
		Throw New Exception("Pada fungsi SetBobotAwal, panjang matriks bobot: " & bobotAwal.Length & " tidak sama dengan jumlah bobot yang seharusnya, yaitu " & jumlahBobot)
	End If

	Dim k As Integer = 0
	For i As Integer = 0 To jumlahSarafInput - 1
		For j As Integer = 0 To jumlahSarafTersembunyi - 1
			ihBobot(i)(j) = bobotAwal(k)
			k += 1
		Next
	Next
	For i As Integer = 0 To jumlahSarafTersembunyi - 1
		hBias(i) = bobotAwal(k)
		k += 1
	Next
	For i As Integer = 0 To jumlahSarafTersembunyi - 1
		For j As Integer = 0 To jumlahSarafOutput - 1
			hoBobot(i)(j) = bobotAwal(k)
			k += 1
		Next
	Next
	For i As Integer = 0 To jumlahSarafOutput - 1
		oBias(i) = bobotAwal(k)
		k += 1
	Next
End Sub

3. Tentukan parameter-parameter yang digunakan dalam perhitungan

3a. Tentukan jumlah maksimal perulangan / epoch yang digunakan dalam perhitungan
Diasumsikan dalam kasus ini, jumlah maksimal perulangan adalah 500 kali

Const maksEpoch As Integer = 500

3b. Tentukan rasio pembelajaran untuk digunakan pada perhitungan matriks bobot
Semakin besar nilainya, maka semakin cepat nilai bobot akan berubah-ubah
Diasumsikan dalam kasus ini, rasio pembelajaran adalah 0.05

Const rasioPembelajaran As Double = 0.05

3c. Tentukan momentum, yaitu nilai tambahan yang akan ditambahkan pada setiap kali perulangan untuk mengupdate nilai bobot
Sama seperti variabel rasio pembelajaran, semakin besar nilainya, maka semakin cepat nilai bobot akan berubah-ubah
Diasumsikan dalam kasus ini, momentum adalah 0.01

Const momentum As Double = 0.01

4. Lakukan proses pencarian nilai bobot dan bias terbaik
Metode yang digunakan adalah Gradient Descent
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 4a – 4c)

jst.BackProp(contohData, maksEpoch, rasioPembelajaran, momentum)

Memasuki perhitungan pada fungsi BackProp

* Lakukan perhitungan sebanyak parameter maksEpoch

While epoch < maksEpoch
. . .

4a. Hitung nilai kesalahan menggunakan teknik MSE (Mean Squared Error)
Jika nilai MSE sudah mendekati 0 maka perulangan akan dihentikan
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim mse As Double = MeanSquaredError(contohData)
If mse < 0.001 Then Exit While

* Gunakan fungsi ini untuk menghitung tingkat kesalahan dari masing-masing data input
Hitung tingkat kesalahan nilai jawaban menggunakan teknik Mean Squared Error
dihitung dengan rumus jumlah dari (kuadrat dari (nilai jawaban - nilai hasil pada matriks data)) / jumlah data
Nilai jawaban yang baru bisa jadi mengembalikan nilai MSE yang lebih tinggi, sehingga nilai jawaban ini tidak bisa dipakai

Private Function MeanSquaredError(contohData As Double()(), bobot As Double()) As Double
Me.setBobot(bobot)

Dim contohDataKolomKriteria As Double() = New Double(jumlahSarafInput - 1) {}
Dim contohDataKolomHasil As Double() = New Double(jumlahSarafOutput - 1) {}

Dim hasil As Double = 0.0
For i As Integer = 0 To contohData.Length - 1
	Array.Copy(contohData(i), contohDataKolomKriteria, jumlahSarafInput)
	Array.Copy(contohData(i), jumlahSarafInput, contohDataKolomHasil, 0, jumlahSarafOutput)
	Dim dataKolomHasil As Double() = Me.ComputeOutputs(contohDataKolomKriteria)
	For j As Integer = 0 To dataKolomHasil.Length - 1
		hasil += ((dataKolomHasil(j) - contohDataKolomHasil(j)) * (dataKolomHasil(j) - contohDataKolomHasil(j)))
	Next
Next
Return hasil / contohData.Length
End Function

4b. Pada setiap kali perulangan, lakukan pengacakan urutan data
Sehingga perhitungan data tidak dimulai dari indeks terendah sampai ke indeks tertinggi

For i As Integer = 0 To urutanData.Length - 1
	Dim r As Integer = rnd.[Next](i, urutanData.Length)
	Dim tmp As Integer = urutanData(r)
	urutanData(r) = urutanData(i)
	urutanData(i) = tmp
Next

4c. Lakukan perhitungan pada masing-masing contoh data, sesuai dengan urutan acak sebelumnya

For i As Integer = 0 To contohData.Length - 1
	Dim idx As Integer = urutanData(i)
	. . .

4c1. Lakukan perulangan pada setiap baris data
Ambil matriks data kolom kriteria dan kolom hasil sesuai urutan baris data yang sudah ditentukan sebelumnya
Kemudian hitung nilai output dari matriks data kolom kriteria

Array.Copy(contohData(idx), contohDataKolomKriteria, jumlahSarafInput)
Array.Copy(contohData(idx), jumlahSarafInput, contohDataKolomHasil, 0, jumlahSarafOutput)
hitungNilaiOutput(contohDataKolomKriteria)

4c2. Lakukan proses update nilai bobot untuk mendapatkan nilai bobot terbaik (poin 4c2a - 4c2f)

4c2a. Hitung nilai gradient pada jaringan saraf output

For j As Integer = 0 To oGradient.Length - 1
	Dim turunanFungsiSoftmax As Double = (1 - outputs(j)) * outputs(j)
	oGradient(j) = turunanFungsiSoftmax * (contohDataKolomHasil(j) - outputs(j))
Next

4c2b. Hitung nilai gradient pada jaringan saraf tersembunyi

For j As Integer = 0 To hGradient.Length - 1
	Dim turunanFungsiHyperTanFunction As Double = (1 - hOutput(j)) * (1 + hOutput(j))

	Dim jumlahGradient As Double = 0.0
	For k As Integer = 0 To jumlahSarafOutput - 1
		Dim x As Double = oGradient(k) * hoBobot(j)(k)
		jumlahGradient += x
	Next
	hGradient(j) = turunanFungsiHyperTanFunction * jumlahGradient
Next

4c2c. Lakukan update bobot pada matriks ihBobot pada jaringan saraf input-tersembunyi
Hitung nilai delta dengan rumus rasioPembelajaran * nilai gradient pada kolom ke k * data kolom kriteria ke j
Tambahkan pada matriks ihBobot
Kemudian tambahkan nilai momentum pada matriks ihBobot

For j As Integer = 0 To ihBobot.Length - 1
	For k As Integer = 0 To ihBobot(0).Length - 1
		Dim delta As Double = rasioPembelajaran * hGradient(k) * inputs(j)
		ihBobot(j)(k) += delta
		ihBobot(j)(k) += momentum * ihDeltaBobotSebelumnya(j)(k)
		ihDeltaBobotSebelumnya(j)(k) = delta
	Next
Next

4c2d. Lakukan update bobot pada matriks hBias pada jaringan saraf tersembunyi
Hitung nilai delta dengan rumus rasioPembelajaran * nilai gradient pada kolom ke j
Tambahkan pada matriks hBias
Kemudian tambahkan nilai momentum pada matriks hBias

For j As Integer = 0 To hBias.Length - 1
	Dim delta As Double = rasioPembelajaran * hGradient(j) * 1.0
	hBias(j) += delta
	hBias(j) += momentum * hDeltaBiasSebelumnya(j)
	hDeltaBiasSebelumnya(j) = delta
Next

4c2e. Lakukan update bobot pada matriks hoBobot pada jaringan saraf tersembunyi-output
Hitung nilai delta dengan rumus rasioPembelajaran * nilai gradient pada kolom ke k * data kolom hasil ke j
Tambahkan pada matriks hoBobot
Kemudian tambahkan nilai momentum pada matriks hoBobot

For j As Integer = 0 To hoBobot.Length - 1
	For k As Integer = 0 To hoBobot(0).Length - 1
		Dim delta As Double = rasioPembelajaran * oGradient(k) * hOutput(j)
		hoBobot(j)(k) += delta
		hoBobot(j)(k) += momentum * hoDeltaBobotSebelumnya(j)(k)
		' save
		hoDeltaBobotSebelumnya(j)(k) = delta
	Next
Next

4c2f. Lakukan update bobot pada matriks oBias pada jaringan saraf output
Hitung nilai delta dengan rumus rasioPembelajaran * nilai gradient pada kolom ke j
Tambahkan pada matriks oBias
Kemudian tambahkan nilai momentum pada matriks oBias

For j As Integer = 0 To oBias.Length - 1
	Dim delta As Double = rasioPembelajaran * oGradient(j) * 1.0
	oBias(j) += delta
	oBias(j) += momentum * oDeltaBiasSebelumnya(j)
	' save
	oDeltaBiasSebelumnya(j) = delta
Next

5. Lakukan perhitungan dari masing-masing contoh data menggunakan nilai bobot dan nilai bias yang sudah ditemukan
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 5a - 5g)

Dim output() As Double = jst.hitungNilaiOutput(input)

Memasuki perhitungan utama pada fungsi hitungNilaiOutput

5a. Beri nilai matriks input sesuai array input

For i = 0 To input.Length - 1
	Me.inputs(i) = input(i)
Next i

5b. Hitung matriks ihJumlahBobotDanBias dengan cara perkalian matriks antara matriks input dan matriks ihBobot

For j = 0 To jumlahSarafTersembunyi - 1
	For i = 0 To jumlahSarafInput - 1
		ihJumlahBobotDanBias(j) += Me.inputs(i) * ihBobot(i)(j)
	Next i
Next j

5c. Kemudian masukkan nilai bias pada matriks ihJumlahBobotDanBias

For i = 0 To jumlahSarafTersembunyi - 1
	ihJumlahBobotDanBias(i) += hBias(i)
Next i

5d. Hitung nilai output sementara dengan menggunakan fungsi HyperTan untuk masing-masing data pada matriks hJumlahBobotDanBias
Penjelasan tentang fungsi HyperTan akan dijelaskan pada perhitungan dibawah ini

For i As Integer = 0 To jumlahSarafTersembunyi - 1
	Me.hOutput(i) = HyperTan(hJumlahBobotDanBias(i))
Next

* Gunakan fungsi ini untuk menghitung nilai fungsi HyperTan (tanh)

Private Shared Function HyperTan(x As Double) As Double
	If x < -20.0 Then
		Return -1.0
	ElseIf x > 20.0 Then
		Return 1.0
	Else
		Return Math.Tanh(x)
	End If
End Function

5e. Hitung matriks hoJumlahBobotDanBias dengan cara perkalian matriks antara matriks output sementara dan matriks hoBobot

For j = 0 To jumlahSarafOutput - 1
	For i = 0 To jumlahSarafTersembunyi - 1
		hoJumlahBobotDanBias(j) += hOutput(i) * hoBobot(i)(j)
	Next i
Next j

5f. Kemudian masukkan nilai bias pada matriks hoJumlahBobotDanBias

For i = 0 To jumlahSarafOutput - 1
	hoJumlahBobotDanBias(i) += oBias(i)
Next i

5g. Hitung nilai output akhir dengan menggunakan fungsi Softmax untuk masing-masing data pada matriks hoJumlahBobotDanBias
Penjelasan tentang fungsi Softmax akan dijelaskan pada perhitungan dibawah ini (poin 5g1 - 5g3)

Dim hasil() As Double = Softmax(hoJumlahBobotDanBias)
hasil.CopyTo(Me.outputs, 0)
Return hasil

Memasuki perhitungan utama pada fungsi Softmax

5g1. Cari nilai maksimal data

Dim maksData As Double = hoJumlahBobotDanBias(0)
For i = 0 To hoJumlahBobotDanBias.Length - 1
	If hoJumlahBobotDanBias(i) > maksData Then
		maksData = hoJumlahBobotDanBias(i)
	End If
Next i

5g2. Cari nilai skala

Dim skala As Double = 0.0
For i = 0 To hoJumlahBobotDanBias.Length - 1
	skala += Math.Exp(hoJumlahBobotDanBias(i) - maksData)
Next i

5g3. Hitung hasil akhir
Sehingga semua jumlah bobot pada parameter matriks hoJumlahBobotDanBias akan bernilai 1

Dim hasil(hoJumlahBobotDanBias.Length - 1) As Double
For i = 0 To hoJumlahBobotDanBias.Length - 1
	hasil(i) = Math.Exp(hoJumlahBobotDanBias(i) - maksData) / skala
Next i

6. Jika hasil output lebih dari 0.5, maka konversi nilai output menjadi 1
Jika hasil output lebih dari 0.5, maka konversi nilai output menjadi 0

For j As Integer = 0 To output.Length - 1
	If output(j) >= 0.5 Then output(j) = 1 Else output(j) = 0
Next

7. Catat tingkat kecocokan perhitungan data dengan hasil awal pada data
Langkah ini tidak wajib, hanya untuk mengetahui seberapa besar tingkat kecocokan perhitungan untuk masing-masing data baru yang akan dihitung selanjutnya

Dim bSt As Boolean = True
For j As Integer = 0 To output.Length - 1
	If output(j) <> outputData(j) Then
		bSt = False
		Exit For
	End If
Next

If bSt Then jumlahBenar += 1 Else jumlahSalah += 1

8. Lakukan perhitungan yang sama (poin 5 dan 6) untuk masing-masing data baru

For i As Integer = 0 To dataBaru.Length - 1
	Dim input(dataBaru(i).Length - 2 - 1) As Double
	For j As Integer = 0 To dataBaru(i).Length - 2 - 1
		input(j) = dataBaru(i)(j)
	Next

	Dim output() As Double = jst.hitungNilaiOutput(input)

	For j As Integer = 0 To output.Length - 1
		If output(j) >= 0.5 Then output(j) = 1 Else output(j) = 0
	Next

	If i = 0 Then
		If output(0) > output(1) Then
			rtbBaru1.Text = 0
			lblKesimpulanDatabaru1.Text = "Prediksi Benar"
		ElseIf output(1) > output(0) Then
			rtbBaru1.Text = 1
			lblKesimpulanDatabaru1.Text = "Prediksi Salah"
		End If

	ElseIf i = 1 Then
		If output(0) > output(1) Then
			rtbBaru2.Text = 0
			lblKesimpulanDatabaru2.Text = "Prediksi Salah"
		ElseIf output(1) > output(0) Then
			rtbBaru2.Text = 1
			lblKesimpulanDatabaru2.Text = "Prediksi Benar"
		End If

	Else
		If output(0) > output(1) Then
			rtbBaru3.Text = 0
		ElseIf output(1) > output(0) Then
			rtbBaru3.Text = 1
		Else
			rtbBaru3.Text = "?"
		End If

	End If
Next


Hasil akhir adalah: (klik untuk perbesar gambar)

ssocr


Contoh source code lengkap dalam bahasa VB (Visual Basic) dapat didownload disini:



Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.


Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

2 pemikiran di “OCR (Optical Character Recognition) dengan teknik Back-Propagation

  • Lala Shauqy

    Mohon maaf kak mau tanya, semoga segera dibalas.
    apakah semua source code diketik di visual studio dari mulai atas sampe bawah?
    apakah tidak ada design terlebih dahulu?
    apakah kakak tidak punya youtube untuk lebih mudah dilihat kak?

    • pip Penulis

      Contoh modul sudah saya bagikan pada bagian bawah halaman ini. Jika terdapat kesulitan dalam mengambil skrip, mohon menunggu atau me-refresh ulang halaman ini sampai fitur captcha diatas tombol download dapat muncul dan digunakan.

      Skrip ini bertipe windows application yang saya rancang dengan menggunakan visual studio 2012, sehingga untuk dapat menjalankan skrip ini diperlukan versi dengan tahun yang sama atau lebih tinggi. Jika kondisi tersebut sudah terpenuhi maka seharusnya skrip akan dapat berjalan dengan baik.