Kamis, 26 Agustus 2021

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