Deep Learning in R Using Keras and TensorFlow : Image Racognition

Source: Deep Learning on Medium


Deep Learning adalah salah satu tren dalam machine learning saat ini, seperti Data Gambar (Image Recognition). Pada artikel ini akan dibahas kecocokan model prediksi dari data gambar dengan bantuan package “Keras” dan “Tensorflow”.

Instal dan Aktifkan

  1. Packages Keras
  2. Packages Tensorflow
  3. Packages EBImage
  4. Aplikasi Anaconda Python
install_keras()
install_tensorflow()
library(keras)
library(tensorflow)
library(EBImage)
BiocManager::install(“EBImage”)
search()
ls(3)

Setelah semua terinstal maka untuk memastikan apakah package Keras dan Tensorflow sudah terinstal atau belum.

Menyimpan folder dan memasukkan data gambar sesuai pixel yang diinginkan

Pada script ini akan melakukan set direktori pada data “D://DataGambar/”, dan nanti akan disimpan hasilnya pada “D://DataGambarHasil/”. Kemudian akan diatur gambar pixel sebesar masing-masing lebar dan tinggi pixel sebesar 130.

setwd("D://DataGambar/")
save_in<-("D://DataGambarHasil/")
gambar<-list.files()
w<-130
h<-130
for (i in 1:length(gambar))
{result<-tryCatch({
imgname<-gambar[i]
img<-readImage(imgname)
img_resized<-resize(img,w=w,h=h)
path<-paste(save_in,imgname,sep="")
writeImage(img_resized,path,quality=70)
print(paste("done",i,sep=" "))
},
error=function(e){print(e)}
)}
setwd("D://DataGambarHasil/")
gambar2<-list.files()
gambar2

Dari script perintah diatas keluarlah hasil done 1 hingga 12 artinya semua gambar sudah terbaca.

Pada script dibawah ini yaitu membaca gambar dan membagi data training dan testing, perintah ini sama seperti ada perintah diatas.

gambar2<-lapply(gambar2,readImage)

Melihat hasil salah satu gambar dan memanggil dimensi dari gambar

Pada perintah dibawah ini ingin melihat gambar dan dimensi pada gambar 3.

display(gambar2[[3]])
dim(gambar2[[3]])

Hasil gambar dibawah merupakan display gambar 3 dengan pixel denan tinggi sebesar 130 dan lebar sebesar 130 dan juga channel warna rgb.

Membuat data training dan testing

Perintah ini akan mengambil daftar gambar laptop 1:4 dan gambar tablet 7:10 untuk data training, dan sisanya daftar gambar laptop 5:6 dan gambar tablet 11:12 untuk data testing.

train<-gambar2[c(1:4,7:10)]
test<-gambar2[c(5:6,11:12)]
train[[5]]

Maka akan muncul detail data train gambar 5.

Atau jika ingin melihat secara detail dimensinya bisa juga dilihat melau excel agar dapat dilihat secara nyata seperti gambar data train nomer 5.

display(train[[5]])
write.csv(train[[5]],"D://DataGambar/datatrain.csv")

Maka dengan gambar yang kecil pixelnya dapat dilihat representasinya pada excel dimana terdapat baris kebawah sebesar 130 dan kesamping sebesar 390, dimana pembagian 130 pertama hingga ketiga merupakan channel dari warna rgb.

Menyajikan gambar secara terurut

Perintah ini akan disajikan gambar dengan 2 baris sebanyak 4 gambar masing-masing.

par(mfrow=c(2,4))
for (i in 1:8) plot(train[[i]])

Gambar dibawah sudah ditampilkan gambar secara terurut dengan jumlah gambar 8 dengan pembagian gambar laptop dan tablet.

Melihat dimensi data train dan test dan meyusun ulang data training dan testing

Membuat ukuran ulang dengan me resize 32 𝗑 32 sebagai parameter yang akan dikerjakan CNN untuk pengenalan gambar, kombinasikan semua nya data training dan melihat dimensi data training, dan kombinasikan semua nya data testing dan melihat dimensi data testing.

for(i in 1:8){train[[i]]<-resize(train[[i]],32,32)}
for(i in 1:4){test[[i]]<-resize(test[[i]],32,32)}
train<-combine(train)
x<-tile(train,8)
display(x,title='gambar')
dim(train)
test<-combine(test)
y<-tile(test,4)
dim(test)
train<-aperm(train,c(4,1,2,3))
test<-aperm(test,c(4,1,2,3))
dim(train)
dim(test)

Maka akan muncul urutan dimensi dari masing-masing data train maupun test dengan ukuran 32 32 pixel, 3 channel, dan 8 dan 4 sesuai jumlah gambar data serta merubah susunan data.

Klasifikasi (Categorical) data dan pembentukan label dari data target

Mengklasifikasikannya dimana laptop masuk pada klasifikasi 0 dan tablet masuk pada klasifikasi 1 dengan replikasi data train sebanyak 4 dan replikasi data test sebanyak 2. Membuat label dari data target klasifikasi lebih dari 2 menggunakan kategorik.

trainy<-c(rep(0,4),rep(1,4))
testy<-c(rep(0,2),rep(1,2))
trainy
testy
trainLabels<-to_categorical(trainy)
testLabels<-to_categorical(testy)
trainLabels
testLabels

Dari skrip diatas dihasilkan data train (trainy) klasifikasi laptop ada 4 dan tablet ada 4, dan data test) (testylasifikasi laptop ada 2 dan tablet ada 2. Hasil kategorik muncul seperti pada angka dataframe .

Membuat model

Dalam membuat model ini menggunakan beberapa layer dengan skrip dibawah ini:

model<-keras_model_sequential()
model%>%
layer_conv_2d(filters=32,
kernel_size=c(3,3),
activation = 'relu',
input_shape=c(32,32,3))%>%
layer_conv_2d(filters=32,
kernel_size = c(3,3),
activation ='relu') %>%
layer_max_pooling_2d(pool_size = c(2,2))%>%
layer_dropout(rate=0.01)%>%
layer_conv_2d(filters=64,
kernel_size=c(3,3),
activation = 'relu')%>%
layer_max_pooling_2d(pool_size = c(2,2))%>%
layer_dropout(rate=0.01)%>%
layer_flatten()%>%
layer_dense(units=256,activation ='relu')%>%
layer_dropout(rate=0.01)%>%
layer_dense(units=2,activation = 'softmax')%>%
compile (loss='categorical_crossentropy',
optimizer = optimizer_sgd(lr = 0.01,
decay=1e-06,
momentum = 0.9,
nesterov = T),
metrics = c('accuracy'))
summary(model)

Pada hasil ini hasil model yang sudah dibangun untuk deep learning dengan CNN masing-masing gambar masuk pada setiap layer, pada output shape “None” menyesuaikan jumlah data pada gambar yang dimasukkan dengan 32 kernel filter. Total parameter yang dihitung sebesar 619234, dengan nilai tersebut dapat dipilih apakah dia laptop atau tablet.

Perhitungan model

Membuat proses perhitungan dari model yang sudah dibuat, dengan visualisasi berupa plot.

proses<-model%>%
fit(train,
trainLabels,
epoch=50,
batch_size = 32,
validation_split = 0.2)
plot(proses)

Sudah berproses dari perhitungan validasi loss dan akurasinya, dengan data training dengan validasi loss semakin kecil maka nilai akurasinya semakin tinggi.

Mengevaluasi tingkat keakuratan data training

Mengevaluasi data training dengan label, menggunakan skrip ini:

model%>%evaluate(train,trainLabels)
pred<-model%>%predict_classes(train)
pred
table(predicted=pred, Actual=trainy)

Prediksi kelas pada data train ternyata didapatkan nilai akurasi sebesar 87,5%, dilihat dari nilai prediksi model terdapat prediksi yang tidak tepat karena seharusnya klasifikasi 0 (laptop) ada 4 dan klasifikasi 1(tablet) ada 4.

Hasil dari tabel cross validasi prediksi dengan aktualnya data label train y, hasil tabel prediksi klasifikasi laptop benar ada 4 sesuai data aktualnya, namun prediksi klasifikasi tablet tidak benar sesuai data aktualnya yang seharusnya 4, karena ada 1 data yang seharusnya prediksi masuk tepat pada klasifikasi tablet namun yang terjadi masuk pada klasifikasi laptop.

Melihat nilai probabilitas

Probabilitas dengan menggunakan data train.

prob<-model%>%predict_proba(train)
cbind(prob,predicted_class=pred,Actual=trainy)

Dari sini muncul nilai probabilitas prediksi kelas data dengan aktual maka bisa membedakan apakah dia laptop atau tablet.

Mengevaluasi tingkat keakuratan data testing

Mengevaluasi data testing dengan label, menggunakan skrip ini:

model%>%evaluate(test,testLabels)
pred<-model%>%predict_classes(test)
pred
table(predicted=pred, Actual=testy)

Dari nilai evaluasi data test didapatkan nilai loss yang cukup besar dengan nilai 3,825 dan nilai akurasi hanya sebesar 50% saja. Dilihat dari nilai prediksi model terdapat prediksi yang tidak tepat karena seharusnya klasifikasi 0 (laptop) ada 2 dan klasifikasi 1 (tablet) ada 2 secara urut.

Hasil dari tabel cross validasi prediksi dengan aktualnya data label test, hasil tabel prediksi klasifikasi laptop benar ada 1 sesuai data aktualnya dan prediksi klasifikasi tablet benar ada 1 sesuai data aktualnya, namun prediksi klasifikasi tablet dan laptop tidak benar sesuai data aktualnya yang seharusnya masing-masing 2, karena ada 1 data yang seharusnya prediksi masuk tepat pada klasifikasi tablet namun yang terjadi 1 masuk pada klasifikasi laptop dan ada 1 data yang seharusnya prediksi masuk tepat pada klasifikasi laptop namun yang terjadi 1 masuk pada klasifikasi tablet.

Hingga sampai sini belum tepat memprediksikan apakah dia masuk laptop atau tablet, hal ini prediksi yang belum tepat dapat asumsikan karena data yang ada tidak mencukupi dalam perhitungan prediksi maupun akurasi train maupun test.