Klasifikasi gambar menggunakan Machine Learning
Halo kembali lagi dengan saya Haris di Blog Learning Side..
Kali ini saya akan membahas cara mengklasifikasi gambar atau figure untuk dapat dideteksi/dibaca oleh mesin. Pendeknya, kita akan membuat sebuah sistem machine learning yang dapat mengklasifikasi dari gambar yang akan kita tunjukkan pada sistem tersebut, nntinya sistem tersebut dapat belajar terhadap gambar yang telah kita sediakan pada sistem.
Machine learning yang akan kita sama sama pelajari yaitu adalah Neural Netwok. Ya benar.. jaringan syaraf.
Neural network yang akan kita gunakan bertujuan untuk mengklasifikasikan gambar secara identifikasi setiap gambar yang akan kita berikan sebelumnya lalu mesin tersebut dapat kemudian mengenali gambar demi gambar dengan pintar. Untuk membuat sistem tersebut pintar kita akan menggunakan machine learning neural network.
Situs yang akan gunakan hanya Google Colab sebagai software untuk running program tersebut.
Langkah 1
Langkah pertama yang akan kita buat yaitu mengimport library-library yang akan kita masukkan. Dimana library adalah kumpulan code yang terkumpul dalam sebuah namespace/ module/ package yang dapat di import/ reuse ke program lain (Musobar, 2019).
Berikut untuk kodingan import library pada sebuah projek machine learning kita.
import pandas as pd
import numpy as np
from sklearn import linear_model
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
Langkah 2
Setelah mengimport library yang akan digunakan selanjutnya adalah mengimport dataset
yang akan
kita klasifikasi
berikut untuk kodingannya
from google.colab import files
uploaded = files.upload()
Pada kodingan diatas merupakan kodingan untuk import file dari eksplore dari folder PC kita
Dataset yang saya gunakan merupakan beberapa data gambar dari sejumlah pemandangan yang seg_test dalam format zip
Dataset dapat didownload pada link berikut
https://drive.google.com/drive/folders/179n7x_aJAQrJjj3NzzJZ9onUoiRO4o10?usp=sharing
Langkah 3
Selanjutnya masih ke bagian mengimport os dimana kita akan mengidentifikasi dataset
format zip menggunakan zip_ref
import os
import zipfile
local_zip = '/content/seg_test.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/content/')
zip_ref.close()
Langkah 4
Setelah mengakses dataset yang akan digunakan, selanjutnya akan mengidentifikasi
setiap isi dari dataset terserbut. Dikarenakan dataset tersebut berupa figure atau gambar
oleh karena itu akan dijabarkan setiap isi dari file dataset seperti berikut
import os
fold_bangunan = os.path.join('/content/seg_test/buildings')
fold_hutan = os.path.join('/content/seg_test/forest')
fold_es = os.path.join('/content/seg_test/glacier')
fold_laut = os.path.join('/content/seg_test/sea')
print('Jumlah total gambar bangunan:', len(os.listdir(fold_bangunan)))
print('Jumlah total gambar hutan:', len(os.listdir(fold_hutan)))
print('Jumlah total gambar es:', len(os.listdir(fold_es)))
print('Jumlah total gambar laut:', len(os.listdir(fold_laut)))
print("Menampilkan nama file gambar:")
file_bangunan = os.listdir(fold_bangunan)
print("bangunan:",file_bangunan[:5])
file_hutan = os.listdir(fold_hutan)
print("hutan:",file_hutan[:5])
file_es = os.listdir(fold_es)
print("es:",file_es[:5])
file_laut = os.listdir(fold_laut)
print("laut:",file_laut[:5])
Langkah 5
Langkah selanjutnya adalah dengan cara meng-plot data gambar menjadi sebuah
data layaknya tabel, ada kolom dan baris. Dimana dapat dilihat pada coding
dibawah makan kolom tabel ada 4 dan baris tabel juga ada 4. Pada penjelasan
coding akan diwakili dengan tanda pagar sebagai penjelasan singkat dari setiap
codingannya.
%matplotlib inline
#Mengimpor modul matplotlib
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
#Jumlah baris dan kolom tampilan gambar
nrows = 4
ncols = 4
#Index awal untuk iterasi gambar
pic_index = 0
fig = plt.gcf()
#Mengatur gambar output matplotlib, dan ukurannya agar menjadi 4*4 gambar
fig.set_size_inches(ncols * 4, nrows * 4)
#Index tambah bertambah 4 setiap baris
pic_index += 4
#Menampilkan gambar bangunan
gbr_tampil_bangunan = [os.path.join(fold_bangunan, fname)
for fname in file_bangunan[pic_index-4:pic_index]]
#Menampilkan gambar hutan
gbr_tampil_hutan = [os.path.join(fold_hutan, fname)
for fname in file_hutan[pic_index-4:pic_index]]
#Menampilkan gambar es
gbr_tampil_es = [os.path.join(fold_es, fname)
for fname in file_es[pic_index-4:pic_index]]
#Menampilkan gambar laut
gbr_tampil_laut = [os.path.join(fold_laut, fname)
for fname in file_laut[pic_index-4:pic_index]]
for i, img_path in enumerate(gbr_tampil_bangunan+gbr_tampil_hutan+gbr_tampil_
es+gbr_tampil_laut):
#Mengatur subplot; indeks subplot dimulai dari 1
sp = plt.subplot(nrows, ncols, i + 1)
#Tidak menampilkan Gridlines
sp.axis('Off')
img = mpimg.imread(img_path)
plt.imshow(img)
plt.show()
Langkah 6
Langkah selanjutnya adalah memasukkan library utama yaitu tensorflow. Dimana
library tensorflow meruapakan langkah awal melakukan deep learning.
Selanjutnya akan import library keras dimana pengembangan dari Library tensorflow.
import tensorflow as tf
import keras_preprocessing
from keras_preprocessing import image
from keras_preprocessing.image import ImageDataGenerator
Langkah 7
#Menyiapkan folder utama
BASIS_DIR = "/content/seg_test/"
#Image generator
training_datagen = ImageDataGenerator(
#Menormalisasi data
rescale = 1./255,
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>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
)
Langkah 8
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
)
Langkah 9
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(4, activation='softmax') #Layer output
])
model.summary() #Menampilkan summary model
Model: "sequential_2"
Langkah 10
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
if(logs.get('val_accuracy')>0.9):
print("\nPELATIHAN BERHENTI, AKURASI MODEL SUDAH LEBIH DARI 90%!")
self.model.stop_training = True
callbacks = myCallback()
model.compile(loss = 'categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>MELATIH MODEL<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
history=model.fit(
train_generator,
steps_per_epoch=16,
epochs=100,
validation_data=validation_generator,
validation_steps=4,
verbose=2,
callbacks=[callbacks]
)
Langkah 11
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))
plt.plot(epochs, loss, 'r', label='Loss Training ') #Plot nilai akurasi training
plt.plot(epochs, val_loss, 'b', label='Loss Validasi') #Plot nilai akurasi validasi
plt.title('Loss Training dan Validasi') #Menamai gambar
plt.legend(loc=0) #Menampilkan legenda
plt.figure()
plt.show() #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()
Langkah 12
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('Gambar Ini Menunjukkan bentuk BANGUNAN') #Jika gambar tangan membentuk Kertas, tampilkan tulisan "Kertas"
elif classes[0][1]==1:
print('Tangan Ini Menunjukkan bentuk HUTAN') #Jika gambar tangan membentuk Batu, tampilkan tulisan "Batu"
elif classes[0][2]==1:
print('Tangan Ini Menunjukkan bentuk ES')
elif classes[0][3]==1:
print('Tangan Ini Menunjukkan bentuk LAUT') #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 kodingan terakhir algoritma kita akan dapat mengenali beberapa jenis gambar dari dataset
yang telah dipelajari oleh mesin itu sendiri
Untuk lebih jelasnya .. codingan serta hasil running program silahkan bisa diakses pada link berikut
https://colab.research.google.com/drive/1nISVwcsUEuuOKv_zPHJqBGJirIJ9vSKE#scrollTo=RPiH1FmzSE0G
Referensi:
https://id.quora.com/Apa-yang-dimaksud-dengan-library-pada-pemrograman