Silahkan pelajari terlebih dahulu terkait dengan teori machine learning
dan juga berbagai macam teknik machine learning
Dataset yang dipakai haruslah dataset berikut : rockpaperscissors, dataset dapat diunduh pada kaggle
https://www.kaggle.com/datasets/drgfreeman/rockpaperscissors
Petunjuk Pengerjaan
- Dataset harus dibagi menjadi train set dan validation set.
- Ukuran validation set harus 40% dari total dataset (data training memiliki 1314 sampel, dan data validasi sebanyak 874 sampel).
- Harus mengimplementasikan augmentasi gambar.
- Menggunakan image data generator.
- Model harus menggunakan model sequential.
- Pelatihan model tidak melebihi waktu 30 menit.
- Program dikerjakan pada Google Colaboratory.
- Akurasi dari model minimal 85%.
Google Colab
Dengan bantuan Google Colab, kita dapat menggunakan bahasa pemrograman python dan library seperti tensorflow, keras, dan lain-lain. Pilih New Notebook
https://colab.research.google.com/
Rename nama file dengan RockPaperScissors (boleh yang lain) kemudian pilih Files, dan pilih Upload to session storage. Upload dataset yang sudah di download dari Kaggle : archive.zip (305 MB)
Mengakses Dataset
Mengekstrak file zip
import os #Mengimpor modul os mengakses folder data
import zipfile #Mengimpor modul zipfile untuk membaca file zip
local_zip = '/content/archive.zip' #Mendefinisikan file zip yang akan diekstrak
zip_ref = zipfile.ZipFile(local_zip, 'r') #Mengekstrak file zip
zip_ref.extractall('/content/') #Menempatkan file hasil ekstrak zip
zip_ref.close() #Menghentikan fungsi zip.ref
Menyiapkan folder untuk data gambar Gunting, Batu, Kertas
import os #Mengimpor modul os mengakses folder data
fold_gunting = os.path.join('/content/scissors') #Mendefinisikan Folder Training untuk gambar Gunting
fold_batu= os.path.join('/content/rock') #Mendefinisikan Folder Training untuk gambar Batu
fold_kertas = os.path.join('/content/paper') #Mendefinisikan Folder Training untuk gambar Kertas
print('Jumlah total gambar gunting:', len(os.listdir(fold_gunting))) #Menampilkan jumlah gambar di dalam folder Gunting
print('Jumlah total gambar batu:', len(os.listdir(fold_batu))) #Menampilkan jumlah gambar di dalam folder Batu
print('Jumlah total gambar kertas:', len(os.listdir(fold_kertas))) #Menampilkan jumlah gambar di dalam folder Kertas
print("Menampilkan nama file gambar:")
file_gunting = os.listdir(fold_gunting) #Mendaftar file di dalam folder gunting
print("Gunting:",file_gunting[:5]) #Menampilkan nama 5 file pertama di dalam folder gunting
file_batu = os.listdir(fold_batu) #Mendaftar file di dalam folder batu
print("Batu:",file_batu[:5]) #Menampilkan nama 5 file pertama di dalam folder batu
file_kertas = os.listdir(fold_kertas) #Mendaftar file di dalam folder kertas
print("Kertas:",file_kertas[:5]) #Menampilkan nama 5 file pertama di dalam folder kertas
Menampilkan gambar Gunting, Batu, Kertas dalam satu tampilan
%matplotlib inline
import matplotlib.pyplot as plt #Mengimpor modul matplotlib
import matplotlib.image as mpimg
nrows = 3 #Jumlah baris tampilan gambar
ncols = 4 #Jumlah baris tampilan gambar
pic_index = 0 #Index awal untuk iterasi gambar
fig = plt.gcf()
fig.set_size_inches(ncols * 4, nrows * 3) #Mengatur gambar output matplotlib, dan ukurannya agar menjadi 4*6 gambar
pic_index += 4 #Index tambah bertambah 4 setiap baris
gbr_tampil_gunting = [os.path.join(fold_gunting, fname) #Menampilkan gambar gunting
for fname in file_gunting[pic_index-4:pic_index]]
gbr_tampil_batu = [os.path.join(fold_batu, fname) #Menampilkan gambar batu
for fname in file_batu[pic_index-4:pic_index]]
gbr_tampil_kertas = [os.path.join(fold_kertas, fname) #Menampilkan gambar kertas
for fname in file_kertas[pic_index-4:pic_index]]
for i, img_path in enumerate(gbr_tampil_gunting+gbr_tampil_batu+gbr_tampil_kertas):
sp = plt.subplot(nrows, ncols, i + 1) #Mengatur subplot; indeks subplot dimulai dari 1
sp.axis('Off') #Tidak menampilkan Gridlines
img = mpimg.imread(img_path)
plt.imshow(img)
plt.show()
Menggunakan Image Generator
import tensorflow as tf #Mengimpor modul tensorflow
import keras_preprocessing #Mengimpor modul keras
from keras_preprocessing import image #Mengimpor keras_preprocessing untuk gambar
from keras_preprocessing.image import ImageDataGenerator #Mengimpor Image Generator
Melakukan Augmentasi & Pemisahan Data menjadi Training dan Validation
Data dikelompokkan menjadi Data Training dan Data Validasi, masing masing folder tersebut masih juga terbagi ke dalam folder Gunting, Batu, dan Kertas untuk melakukan pelabelan menggunakan Image Generator, skema nya adalah sebagai berikut:
BASIS_DIR = "/content/rps-cv-images/" #Menyiapkan folder utama
training_datagen = ImageDataGenerator( #Image generator
rescale = 1./255, #Menormalisasi data
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>AUGMENTASI<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
rotation_range=40, #Menerapkan skenario rotasi gambar hingga 40 derajat
width_shift_range=0.2, #Menerapkan skenario pelebaran gambar hingga hingga sebanyak 0.2 dari ukuran asli
height_shift_range=0.2, #Menerapkan skenario peninggian gambar hingga hingg sebanyak 0.2 dari ukuran asli
shear_range=0.2, #Menerapkan skenario pemangkasan gambar gambar hingga sebanyak 0.2 dari ukuran asli
zoom_range=0.2, #Menerapkan skenario zoom gambar hingga sebesar 0.2
horizontal_flip=True, #Menerapkan skenario putar balik gambar secara horizontal
fill_mode='nearest', #Mengisi piksel yang kosong dengan nilai piksel terdekat
#>>>>>>>>>>>MEMECAH DATA MENJADI DATA TRAINING DAN DATA VALIDASI<<<<<<<<<<<<<<<<
validation_split=0.2 #80% Data Training, 20% Data Validasi
)
Pelabelan data menggunakan Image Data Generator berdasarkan Folder
train_generator = training_datagen.flow_from_directory( #Generator data training
BASIS_DIR, #Folder target untuk digenerasi
target_size=(150,150), #Mengubah resolusi seluruh gambar menjadi 150x150 piksel
class_mode='categorical', #Kelas data kategori untuk klasifikasi multivariabel
shuffle=True,
subset='training' #Untuk data training
)
validation_generator = training_datagen.flow_from_directory( #Generator data validasi
BASIS_DIR, #Folder target untuk digenerasi
target_size=(150,150), #Mengubah resolusi seluruh gambar menjadi 150x150 piksel
class_mode='categorical', #Kelas data kategori untuk klasifikasi multivariabel
shuffle=True,
subset='validation' #Untuk data validasi
)
Membangun Model Jaringan Saraf Tiruan
Model yang digunakan adalah model Sequential
model = tf.keras.models.Sequential([ #Membentuk model sequential
#Bentuk input adalah gambar dengan ukuran 150x150 dengan 3 byte warna
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3)), #Layer Konvolusi pertama
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'), #Layer Konvolusi kedua
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'), #Layer Konvolusi ketiga
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(), #Layer input untuk Deep Learning Neural Network
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(128, activation='relu'), #Hiden layer pertama dengan 512 neuron
tf.keras.layers.Dense(512, activation='relu'), #Hiden layer kedua dengan 512 neuron
tf.keras.layers.Dense(3, activation='softmax') #Layer output
])
model.summary() #Menampilkan summary model
Melatih Model Jaringan Saraf Tiruan
history=model.fit(
train_generator, #Data training hasil generasi
steps_per_epoch=4, #Jumlah batch yang akan dieksekusi pada setiap epoch
epochs=25, #Jumlah perulangan komputasi(epoch)
validation_data=validation_generator, #Menampilkan akurasi pengujian data validasi
validation_steps=4, #Jumlah batch yang akan dieksekusi pada setiap epoch
verbose=2
)
Ploting Akurasi Training dan Validasi
Melihat pergerakan besaran nilai akurasi Training dan Validasi
import matplotlib.pyplot as plt #Mengimpor modul matplotlib
acc = history.history['accuracy'] #Nilai akurasi training
val_acc = history.history['val_accuracy'] #Nilai akurasi validasi
loss = history.history['loss'] #Nilai loss training
val_loss = history.history['val_loss'] #Nilai loss validasi
epochs = range(len(acc)) #Jumlah epoch
plt.plot(epochs, acc, 'r', label='Akurasi Training ') #Plot nilai akurasi training
plt.plot(epochs, val_acc, 'b', label='Akurasi Validasi') #Plot nilai akurasi validasi
plt.title('Akurasi Training dan Validasi') #Menamai gambar
plt.legend(loc=0) #Menampilkan legenda
plt.figure()
plt.show()
Uji Coba Model Klasifikasi Gambar Tangan Gunting, Batu, Kertas
Melakukan simulasi klasifikasi, mengunggah gambar dan model menentukan apakah gambar tersebut merupakan gambar tangan yang membentuk Gunting, Batu, atau Kertas
import numpy as np #Mengimpor modul numpy
from google.colab import files #Mengimpor modul import file
from keras.preprocessing import image #Mengimpor modul keras_preprocessing untuk gambar
uploaded = files.upload() #Mengunggah gambar yang akan dikenali model
for fn in uploaded.keys():
path = fn
img = image.load_img(path, target_size=(150, 150)) #Mengubah ukuran gambar menjadi 150x150 piksel
imgplot = plt.imshow(img) #Menampilkan gambar yang diunggah
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
images = np.vstack([x])
classes = model.predict(images, batch_size=10)
print(fn)
if classes[0][0]==1:
print('Tangan Ini Menunjukkan bentuk KERTAS') #Jika gambar tangan membentuk Kertas, tampilkan tulisan "Kertas"
elif classes[0][1]==1:
print('Tangan Ini Menunjukkan bentuk BATU') #Jika gambar tangan membentuk Batu, tampilkan tulisan "Batu"
elif classes[0][2]==1:
print('Tangan Ini Menunjukkan bentuk GUNTING') #Jika gambar tangan membentuk Gunting, tampilkan tulisan "Gunting"
else:
print('Tidak Diketahui') #Jika gambar yang diunggah selain gambar tangan yang diinginkan, tampilkan "Tidak Diketahui"
Pada tahap ini kita telah berhasil memasukkan objek baru bergambar gunting, dan machine learning berhasil mengidentifikasi bahwa gambar tersebut memang gunting dengan tingkat akurasi 100%.
Pelajari lebih lanjut tentang Praktek Machine Learning dengan Teachable Machine :