Deep Learning : Klasifikasi Gambar dengan Algoritma Convolutional Neural Network (CNN) di R

Akademi -ai
7 min readJun 11, 2021

--

Case : Klasifikasi Gambar Mobil dan Motor

Hallo Guyss :)

Pada tulisan kali ini saya Mr.D selakucontent writer akademi-ai akan membahas tentang gimana sih cara nerapin algoritma Convolutional Neural Network (CNN) di R menggunakan pacakge keras dan teman temannya.. tulisan ini ngga banyak membahas apa itu CNN secara dalem, cuman ngebahas cara nerapinnya pake software R aja.. mungkin temen-temen bisa belajar tentang CNN lebih dalem lagi di artikel lain aja yaakkk hehe… atau mungkin nanti saya akan bikin sendiri tunggu aja hahaha… udah dulu ya basa basinya kita langsung to the point aja :)

Jadi Convolutional Neural Network adalah salah satu jenis neural network yang biasa digunakan pada data image/gambar. CNN bisa digunakan untuk mendeteksi dan mengenali object pada sebuah image. yuk kita coba aja di R..

Tutorial ini kita akan melakukan klasifikasi buat bedain dua kelas yaitu mobil dan motor.. data yang kita gunakan yaitu 200 gambar masing-masing 100 untuk gambar mobil dan 100 untuk gambar motor.. Semua script dan gambar yang saya pake temen-temen bisa download DISINI

Pertama.. install package yang di butuhkan !!! kemudian jalankan pake fungsi library() buat aktifin package tadi..

install.packages("keras")
install.packages("tensorflow")
source("https://bioconductor.org/biocLite.R")
biocLite("EBImage")library(keras)
library(tensorflow)
library(EBImage)

Kemudian setting path penyimpanan data gambar tadi.. saya disini nyimpan di E dengan nama folder test yang berisi 200 gambar mobil dan motor.. kemudian folder hasiltest buat nyimpen hasil proses-proses kita nanti..

#set path
setwd("E://test/")
save_in<-("E://hasiltest/")

Melakukan setting width dan height dari semua gambar.. disini kita pake width 100 dan height 100

#Load images names
gambar<-list.files()
#set width
w<-100
#set height
h<-100

Lalu membuat sebuah looping untuk melakukan preprocessing terhadap semua gambar

#Main loop resize images
for (i in 1:length(gambar))
# Try-catch is necessary since some images
{result<-tryCatch({
#image name
imgname<-gambar[i]
#Read image
img<-readImage(imgname)
#resize image to 100x100
img_resized<-resize(img,w=w,h=h)
path<-paste(save_in,imgname,sep=" ")
#save image
writeImage(img_resized, path, quality=70)
#print status
print(paste("done",i,sep=" "))
},
error=function(e){print(e)}
)}

Intinya looping diatas berfungsi untuk melakukan preprocessing gambar.. preprocessing tersebut dimulai dengan melakukan penangkapan gambar, memberi nama, membaca, resize, dan menyimpan gambar..

Lalu jalankan perintah di bawah ini untuk membaca gambar, melihat output gambar yang sudah terbaca, melihat struktur dan melihat dimensi gambar yang ditentukan..

setwd("E://hasiltest")
gambar2<-list.files()
gambar2
gambar2<-lapply(gambar2,readImage)
str(gambar2)
display(gambar2[[4]])
dim(gambar2[[4]])

Kemudian melakukan pemisahan data menjadi data train dan data test dari 200 data. Kali ini kita akan membagi data train menjadi menjadi 160 data gambar dan sisanya data test sebanyak 40 gambar. script di bawahnya berfungsi untuk melihat data train pada urutan nomor 5 dalam bentuk csv pada folder hasiltest.

#crate train and test data
train<-gambar2[c(1:80,101:180)]
test<-gambar2[c(81:100,181:200)]train[[5]]
display(train[[5]])
write.csv(train[[5]],"E://hasiltest/datatrain.csv")par(mfrow=c(2,4))
for (i in 1:160) plot(train[[i]])

Setelah itu melakukan resize kembali semua data train dan data test dalam bentuk 32x32 pixel.

#resize
for (i in 1:160) {train[[i]]<-resize(train[[i]],32,32)}
for (i in 1:40) {test[[i]]<-resize(test[[i]],32,32)}
str(train)
str(test)

setalah resize gambar, lalu melakukan combine/mengikat data train dan data test. pake sintaks ini !

#combine
train<-combine(train)
x<-tile(train,10)
display(x,title='gambar')
dim(train)test<-combine(test)
y<-tile(test,10)
display(y,title='gambar2')
dim(test)

nanti hasilnya bakalan jadi kaya gini untuk train dan testnya yang masing-masing berjumlah 160 dan 40 gambar.

Selanjutnya adalah reorder dimension. disini kita akan membalik dimesi dari data train dan test yang sebelumnya untuk data train berdimensi 32x32x3x160 menjadi 160x32x32x3 dan test 32x32x3x40 menjadi 40x32x32x3.

#Reorder dimension
train<-aperm(train,c(4,1,2,3))
test<-aperm(test,c(4,1,2,3))
dim(train)
dim(test)

Langkah berikutnya menentukan response. Pada bagian ini kita memberikan target yaitu 0–80, 1–80 untuk data training dan 0–40,1–40 untuk data testing.

#Response
trainy<-c(rep(0,80),rep(1,80))
testy<-c(rep(0,20),rep(1,20))
trainy
testy

Yang terakhir buat preprocessing data adalah one hot encoding.. disini kita membuat label untuk data training dan testing dengan fungsi to_categorical.

#On hot encoding
trainLabels<-to_categorical(trainy)
testLabels<-to_categorical(testy)
trainLabels
testLabels

Naaah.. setelah semua preprocessing data image kita lalui bersama wkwk.. selanjutnya kita membuat model atau susunan jaringan Convolutioal Neural Network yang akan kita bentuk. Disini saya menggunakan 4 layer convolusi yang diikuti dengan layer maxpooling, layer dropout, layer flatten, layer dan dense.

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_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)

Summary modelnya hasilnya ini… Temen temen coba cari tau yaa maksud model ini apa :))

Nah skarang kita lakukan training yaa pake 30 epoch/iterasi dan batch size 32..

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

Dari hasil iterasi diatas lumayan tuh kita dapet nilai akurasi sempurna yaitu 1 dan nilai loss yang rendah sebesar 0.0091 sampia akhr itersi ke-30. Ini artinya model sudah sangat bagus untuk kita terapkan untuk lasifikasi image motor dan mobil dan ini dia hasil plot proses trainingnya…

Nah setelah itu kita lakukan validasi dari data train menggunakan data test. kita akan mengukur seberapa akurat model yang sudah kita bangun untuk melakukan prediksi terhadap data testnya sendiri.

# Evaluation & Prediction - train data 
model %>% evaluate(train, trainLabels)
pred <- model %>% predict_classes (train)
table(Predicted = pred, Actual = trainy)
prob <- model %>% predict_proba(train)
cbind(prob, Predicted_class = pred, Actual = trainy)
# Evaluation & Prediction - test datamodel %>% evaluate(test, testLabels)
pred <- model %>% predict_classes(test)
table(Predicted = pred, Actual = testy)
prob <- model %>% predict_proba(test)
cbind(prob, Predicted_class = pred, Actual = testy)

Dari hasil evaluasi diatas model sudah mampu memprediksi cukup baik untuk data training.. model hanya melakukan kesalahan prediksi sebanyak 9 gambar dengan nilai loss yang cukup rendah dan dengan akurasi sekitar 94%

Hasil evaluasi dan prediksi untuk data test memberikan hasil yang kurang baik karena sekitar 13 gambar salah di prediksi oleh model..

Catatan Penting :
Untuk meningkatkan hasil keakuratan prediksi, temen-temen bisa mengganti parameter-parameter yang digunakan misalnya jumlah pembagian data train dan data test, mengurangi atau menambah jumlah layer convolusi, mengubah ukuran kernel, mengubah jumlah epoch/iterasi, mengubah input image, memperbanyak jumlah data yang diguanakan, mengubah ukuran kernel, mengubah nilai learing rate dan lain sebagainya... dengan mengubah beberapa parameter ini temen-temen bisa melakukan perbandingan untuk mendapatkan hasil yang lebih bagus...

Nah sekarang kita akan mencoba untuk melakukan prediksi menggunakan data baru mobil dan motor, apakah nanti nanti berhasil di prediksi dengan baik atau nggak.. disini kita akan meakukan pengujian menggunakan 10 gambar mobil dan 10 gambar motor… langsung aja yaa let’s goo.. hehehe

#save model 
save_model_hdf5(model,filepath='E://hasiltest.hdf5')
#test Model
setwd('E:/uji/')
model=load_model_hdf5(filepath='E://hasiltest.hdf5')
images <- list.files()
images
summary(images)
list_of_images = lapply(images, readImage)
head(list_of_images)
display(list_of_images[[3]])
# Get the image as a matrix
test <- list_of_images
for (i in 1:20) {test[[i]] <- resize(test[[i]], 32, 32)}
for (i in 1:20) {test[[i]] <- toRGB(test[[i]])}
fixx <- combine(test)
y <- tile(fixx, 5)
display(y, title = 'Pics')
str(fixx)
Uji <- aperm(fixx, c(4, 1, 2, 3))
str(Uji)
testy <- c(rep(0,10), rep(1,10))# One hot encoding
testLabels <- to_categorical(testy)

Script diatas adalah untuk melakukan preprocessing terhadap 20 data baru agar bisa di olah oleh model yang telah kita buat. Langkah pertama adalah menyimpan model yang telah buat di folder E denga nama file model hasiltest.hdf5.. Setelah itu membuat folder dengan nama uji yang berisi 20 gambar masing-masing 10 gambar mobil dan motor, lalu menjalankan model yang sudah disimpan, membaca gambar, mengubah gambar dalam bentuk matrix, melakukan resize gambar dengan ukuran 32x32 pixel, melakukan combine/mengikat gambar, mengubah dimensi dari gambar, dan yang terakhir memberikan pelabelan.

Untuk melihat hasil prediksi ari 20 gambar yang akan kita uji, gunakan scrip ini !!

pred <- model %>% predict_classes(Uji)
table(Predicted = pred, Actual = testy)
model %>% evaluate(Uji, testLabels)prob <- model %>% predict_proba(Uji)
prob
colnames(prob)<- c('Mobil','Motor')
Hasil<-cbind(prob, Predicted_class = pred, Actual = testy)
Hasil

Berikut ini adalah hasil prediksinya….

Kita liat dari hasil prediksi diatas 9 gambar berhasil di prediksi sebagai mobil sedangan 1 gambar di prediksi sebagai motor dan 8 gambar berhasil di prediksi sebagai motor dan 2 gambar di prediksi sebagai mobil..

Okey teman teman sekian dulu untuk tutorial kali ini yaa.. Untuk tulisan saya yang lain tentang Deep Learning dengan berbagai Case, temen-temen bisa lihat di link link dibawah

  1. Part1 : Object Detection Menggunakan Tensorflow-API
  2. Part 2 : Object Detection Menggunakan Tensorflow (Perbandingan Arsitektur SSD Mobilenet dan Faster R-CNN)
  3. Part3 : Setting dan Instalasi Object Detection Menggunakan Tensorflow
  4. Part 4 : Klasifikasi Gambar Menggunakan Web-Flask
  5. Part 5 : Face Recognition Menggunakan OpenCV
  6. Part 6 : Klasifikasi Gambar Dengan Convolutional Neural Network Menggunakan Keras-Python
  7. Part 7 : Klasifikasi Gambar Menggunakan Arsitektur VGGNet-Keras
  8. Part 8 : Tensorflow Object Detection API Menggunakan Google Colab (Kasus : Deteksi Covid-19 Dari Data Rontgent Dada
  9. Part 9 : Klasifikasi Gambar Menggunakan Convolutional Neural Network dengan Arsitektur LeNet
  10. Part 10 : Convolutional Neural Network Menggunakan Package Keras di R
  11. Part 11 : Vehicle Counter Menggunakan OpenCV Python

--

--

No responses yet