![](https://crypto4nerd.com/wp-content/uploads/2023/10/162qbtPMF0aqYuFpaQbwAjg-1024x392.png)
IMAGE CLASSIFICATION : ROCK, PAPER, SCISSORS CLASSIFICATION USING CNN (CONVOLUTIONAL NEURAL NETWORK) METHOD ON MACHINE LEARNING
Link on Google Colab : Click Here
Project ini merupakan project submission untuk kelulusan pada kelas dicoding Machine Learning untuk pemula. Pada project ini akan dibuat sebuah model machine learning dengan ketentuan sebagai berikut :
- Menggunakan dataset sebagai berikut : https://github.com/dicodingacademy/assets/releases/download/release/rockpaperscissors.zip
- Dataset dibagi menjadi train set dan validation set
- Ukuran validation set adalah 40% dari total dataset (data training memiliki 1314 sampel, dan data validasi sebanyak 874 sampel).
- Mengimplementasikan augmentasi gambar, menggunakan image data generator, dan menggunakan model sequential.
Mengimport package dan dataset yang digunakan
Pada tahap ini kita akan mengimport library yang akan digunakan. Pada model ini, saya menggunakan tensorflow dengan menggunakan library keras. Untuk cara mengimport library bisa dilihat pada code dibawah ini.
#import library
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
Langkah selanjutnya adalah mengimport dataset yang akan digunakan. Dataset berupa kumpulan gambar rok, paper, scissor. Untuk dataset dapat diperoleh dari link ini. Setelah mengimport dataset, dilakukan ekstraksi pada dataset yang sudah diimport pada google colab. Setelah library dan dataset selesai diimport, langkah selanjutnya adalah membagi dataset menjadi data train dan data validasi.
#Download dataset
!wget --no-check-certificate
https://github.com/dicodingacademy/assets/releases/download/release/rockpaperscissors.zip
-O /tmp/rockpaperscissors.zip
# melakukan ekstraksi pada file zip
import zipfile,os
local_zip = '/tmp/rockpaperscissors.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp')
zip_ref.close()
Mengapa dataset harus dibagi menjadi data train dan data validasi?
Dalam menjalankan model, dibutuhkan pembagian dataset menjadi data train dan data validasi. Data training adalah kumpulan data yang digunakan untuk melatih model. Data validasi adalah kumpulan data yang digunakan untuk mengoptimalkan model pada saat pelatihan model. Model akan ditraining menggunakan data train, lalu diukur kinerja modelnya dengan data validasi. Hal ini bertujuan untuk melihat kemampuan model pada saat training apakah dapat mengenal pola secara umum. Sedangkan hasil test validasi dapat digunakan untuk melihat akurasi model yang dibuat. Apabila model mempunyai akurasi yang buruk, maka diperlukan perubahan atau perbaikan parameter untuk meningkatkan kemampuan model.
Kembali pada topik pekerjaan berikut, setelah dataset diunzip hal yang dilakukan adalah membagi dataset menjadi data train dan data validasi. Sebelumnya, pada project ini digunakan library split-folder untuk membagi folder.
#menginstall split folder
pip install split-folders #install split-folders
#import split folder
import splitfolders
folder = '/tmp/rockpaperscissors'
splitfolders.ratio(folder, output = 'dataset',
seed = 1337, ratio = (.6, .4))
Selanjutnya adalah pembagian data train dan data validasi
#PEMBAGIAN DATA TRAIN SET DAN VALIDATION SET
base = '/tmp/rockpaperscissors/rps-cv-images'
rock_dir = os.path.join(base, 'rock')
paper_dir = os.path.join(base, 'paper')
scissors_dir = os.path.join(base, 'scissors')
#train data
train_rock = os.path.join(train_dir, 'rock')
train_paper = os.path.join(train_dir, 'paper')
train_scissors = os.path.join(train_dir, 'scissors')#val data
val_rock = os.path.join(val_dir, 'rock')
val_paper = os.path.join(val_dir, 'paper')
val_scissors = os.path.join(val_dir, 'scissors')
from sklearn.model_selection import train_test_split
#memisahkan data
train_rock_dir, val_rock_dir = train_test_split(os.listdir(rock_dir), test_size = 0.4, train_size = 0.6)
train_paper_dir, val_paper_dir = train_test_split(os.listdir(paper_dir), test_size = 0.4, train_size = 0.6)
train_scissors_dir, val_scissors_dir = train_test_split(os.listdir(scissors_dir), test_size = 0.4, train_size = 0.6)
Tahap pre-processing data
Pada tahap ini hal yang dilakukan adalah augmentasi gambar dengan menggunakan Image Data Generator.
#augmentasi gambar dengan tensorflow
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
horizontal_flip=True,
shear_range = 0.2,
validation_split = 0.4,
fill_mode = 'nearest')test_datagen = ImageDataGenerator(
rescale=1./255)
Penjelasan parameter diatas adalah sebagai berikut :
- Rescale : konversi nilai pixel menjadi 0–1. Pada parameter ini nilai pixel dari data image yaitu 1–256 (0–255 pada python).
- rotation_range : rotasi gambar yang digunakan.
- horizontal_flip : memutar gambar secara horizontal. Sehingga, gambar pada hasil augmentasi akan berbeda dengan gambar asli karena perlakuan ini. Selanjutnya nilainya diset sebagai True.
- shear_range : untuk mengaplikasikan pergeseran sudut sebesar 0.2.
Setelah melakukan pre-processing, selanjutnya adalah mempersiapkan data train dan data validasi yang akan dipelajari oleh model.
#DATA LATIH DAN VALIDASI
train_generator = train_datagen.flow_from_directory(
base, # direktori data latih
target_size=(150, 150), # mengubah resolusi seluruh gambar menjadi 150x150 piksel
batch_size=30,
class_mode='categorical',
subset ='training')
validation_generator = train_datagen.flow_from_directory(
base, # direktori data validasi
target_size=(150, 150), # mengubah resolusi seluruh gambar menjadi 150x150 piksel
batch_size=30,
class_mode='categorical',
subset ='validation')
Class_mode yang digunakan adalah “categorical” karena model yang akan dibuat merupakan model klasifikasi dengan 3 kelas. Setelah data selesai disiapkan, maka langkah selanjutnya adalah membuat model. Model yang dibuat pada project ini adalah Convolutional Neural Network(CNN).
Convolutional Neural Network(CNN)
Convolution Neural Network (CNN) pada prosesnya mempunyai dua tahap yaitu tahap convolution dan max pooling. Secara garis besar proses konvolusi merupakan proses penerapan filter dan proses max pooling berguna untuk mengurangi ukuran gambar. Model CNN yang digunakan dapat dilihat pada gambar dibawah ini.
#membuat model
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(128, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(512, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(3, activation='softmax')
])
Conv 2D merupakan proses konvolusi dan MaxPooling2D merupakan proses pooling dengan mengambil nilai maksimum untuk mengurangi ukuran gambar. Penggunaan dense layer pada baris terakhir menunjukkan bahwa pada hasil yang diinginkan adalah 3 kelas (rock, paper, scissors). Dan activation yang dipakai adalah softmax. Pembuatan arsitektur sudah selesai, tetapi model tersebut belum dapat dijalankan. Untuk menjalankan model harus memanggil fungsi compile.
COMPILE MODEL
model.compile(loss='categorical_crossentropy',
optimizer = tf.optimizers.Adam(),
metrics = ['accuracy'])
Optimizer yang digunakan adalah Adam, dan loss function yang digunakan adalah categorical crossentropy. Parameter metrics berfungsi untuk menampilkan metriks yang dipilih pada proses pelatihan model.
Setelah fungsi compile dibuat, selanjutnya adalah melatih model dengan menggunakan metode fit.
history = model.fit(
train_generator,
steps_per_epoch=25,
epochs=20,
validation_data = validation_generator,
validation_steps=5,
verbose=2,
callbacks = [callbacks])
Loss menunjukkan nilai loss function yang terdapat pada dataset. Semakin kecil nilai loss per epoch , maka semakin baik nilainya. Accuracy menyatakan nilai akurasi di training set. Semakin besar nilai akurasi, maka semakin baik.
Dapat dilihat bahwa nilai training loss dan vall loss pada setiap epoch semakin kecil. Nilai accuracy dan val_accuracy nya pada setiap epoch semakin besar. Nilai tersebut menunjukkan bahwa model CNN yang telah dibuat mampu untuk mengklasifikasikan rock, paper, scissors dengan baik. Selanjutnya adalah membuat inputan untuk gambar yang akan diklasifikasikan.
Dari gambar diatas, dapat dilihat bahwa percobaan untuk menginput gambar paper telah dapat mendeteksi gambar sebagai paper dengan baik.
Untuk dokumentasi selengkapnya dapat diunduh pada link ini.