Assalamu'alaikum Wr. Wb. pada kesempatan kali ini saya ingin membagikan tutorial membuat program deep learning menggunakan metode CNN pada Google Colaboratory dengan bahasa pemrograman Python. Program yang dibuat pada tutorial ini digunakan untuk melakukan klasifikasi dari tiga varietas beras, yaitu Beras Basmathi, IR-64, dan Ketan. Framework (kerangka kerja) yang digunakan pada tutorial ini menggunakan Keras dan TensorFlow yang dapat diimpor secara langsung pada Google Colab. Arsitektur CNN yang digunakan adalah MobileNetV1 dengan metode Feature Extraction. Feature Extraction itu sendiri adalah teknik mentransfer hasil pelatihan dari arsitektur CNN yang sudah dilatih sebelumnya (pada kasus ini arsitektur MobileNet yang dilatih pada dataset ImageNet). Metode tersebut saya pilih karena dataset yang saya gunakan jumlahnya sangat sedikit.
Sebelum lanjut ke pembuatan programnya, kita harus tahu terlebih dahulu bagaimana cara menyimpan dataset pada Github dan mengambil dataset tersebut ke tempat penyimpanan sementara yang disediakan oleh Google Colab. Dataset yang kita buat disimpan pada Github agar tidak perlu meng-upload ulang dari awal ke penyimpanan sementara pada Google Colab melainkan hanya menyalin dataset dari Github ke penyimpanan sementara Google Colab tersebut. Jika Anda belum mengerti cara menyimpan dataset pada Github, Anda dapat membuka link tutorial membuat repositori di Github. Jika sudah mengerti langsung saja menuju langkah-langkah pembuatannya.
Sebelum lanjut ke pembuatan programnya, kita harus tahu terlebih dahulu bagaimana cara menyimpan dataset pada Github dan mengambil dataset tersebut ke tempat penyimpanan sementara yang disediakan oleh Google Colab. Dataset yang kita buat disimpan pada Github agar tidak perlu meng-upload ulang dari awal ke penyimpanan sementara pada Google Colab melainkan hanya menyalin dataset dari Github ke penyimpanan sementara Google Colab tersebut. Jika Anda belum mengerti cara menyimpan dataset pada Github, Anda dapat membuka link tutorial membuat repositori di Github. Jika sudah mengerti langsung saja menuju langkah-langkah pembuatannya.
- Pertama buka Google Colab dan login ke akun Google milik Anda, jika sudah masuk maka klik "New Notebook" seperti pada tampilan di bawah ini.
- Jika Anda ingin mengubah tampilannya menjadi dark mode/gelap maka dapat diubah dengan cara klik menu "Tools" kemudian pilih "Settings".
- Pada jendela pop up "Settings" ubah pengaturannya seperti pada gambar berikut.
- Tampilan awal dari Google Colaboratory akan tampil seperti berikut.
- Agar proses jalannya program dapat berjalan dengan lebih cepat maka dapat diganti pengaturan jenis runtime-nya menjadi GPU seperti pada gambar.
- Kemudian pilih GPU pada Hardware Accelerator dan klik "SAVE".
- Selanjutnya klik ikon "+ Text" untuk menambahkan baris sel teks/nootebok baru.
- Setelah muncul baris sel teks baru maka Anda dapat mengetik catatan secara langsung.
- Untuk mengubah level heading tulisan dapat dilakukan dengan klik menu heading pada toolbar format text pada baris sel teks atau dengan mengetik "#" pada sel tersebut.
- Untuk memindahkan posisi baris selnya dapat dilakukan dengan klik ikon panah atas untuk menggeser ke atas atau bawah untuk menggeser ke bawah satu baris.
Notebook baris sel teks 1 : - # **Klasifikasi 3 Varietas Beras**
- Kemudian dilanjutkan membuat program untuk mengambil dataset dari Github pada baris sel kode program, maka tampilannya akan seperti berikut.
Notebook baris sel teks 2 : - # Mengambil *Dataset* dari *Github*
- !apt-get install subversion > /dev/null
- !svn export https://github.com/Soedirman-Machine-Learning/rice-varieties-classification/trunk/data > /dev/null
- Setelah program tersebut dijalankan maka seluruh dataset yang sudah disimpan di Github akan disalin pada browser direktori penyimpanan sementara Google Colab.
- Setelah itu menambah baris sel kode baru di bawahnya dengan klik ikon "+ Code" untuk mengimpor library yang dibutuhkan, setelah dijalankan maka hasil output dari program tersebut akan ditampilkan di bagian bawah tiap baris programnya.
Notebook Subheading Persiapan : - Program ini dibuat untuk membedakan 3 varietas beras yaitu :
- 1. Varietas Beras Basmathi
- 2. Varietas Beras IR 64
- 3. Varietas Beras Ketan
- Pada program ini menggunakan metode *Convolutional Neural Network* (CNN) untuk melakukan klasifikasinya.
- from __future__ import absolute_import, division, print_function, unicode_literals
- try:
- # The %tensorflow_version magic only works in colab.
- %tensorflow_version 2.x
- except Exception:
- pass
- import numpy as np
- import math, os, sys
- import itertools
- import matplotlib.pyplot as plt
- plt.style.use('default')
- from scipy import ndimage
- from skimage import measure, morphology
- from skimage.io import imsave, imread
- from skimage.filters import threshold_otsu
- from skimage.transform import resize
- import tensorflow as tf
- from sklearn import svm, datasets
- from sklearn.metrics import confusion_matrix
- import pandas as pd
- Selanjutnya menampilkan list file gambar dataset berformat ".jpg" yang diimpor
- #Perintah di bawah ini untuk melihat list bagian dari file yang sudah diunduh dari Github
- !ls data/image
- !ls data/image/train
- !ls data/image/train/Basmathi
- !ls data/image/train/IR64
- !ls data/image/train/Ketan
- Source code selanjutnya untuk menampilkan sebuah gambar dari data train
- #Perintah untuk memvisualisasikan satu gambar dari data train
- image = imread("data/image/train/IR64/I17.jpg")
- plt.figure(figsize=(3,3))
- plt.imshow(image)
- Memuat dataset pelatihan, dataset validasi dan dataset pengujian
- #Memuat semua gambar ke memori untuk pertama kali
- #Memuat dataset pelatihan
- IMAGE_SIZE = 224
- BATCH_SIZE = 128
- base_dir = os.path.join('data/image/train')
- datagen = tf.keras.preprocessing.image.ImageDataGenerator(
- rescale=1./255,
- validation_split=0.2)
- train_generator = datagen.flow_from_directory(
- base_dir,
- target_size=(IMAGE_SIZE, IMAGE_SIZE),
- batch_size=BATCH_SIZE,
- subset='training')
- val_generator = datagen.flow_from_directory(
- base_dir,
- target_size=(IMAGE_SIZE, IMAGE_SIZE),
- batch_size=BATCH_SIZE,
- subset='validation')
- #Memuat dataset pengujian
- X_test = []
- y_test = []
- labels = ['Basmathi', 'IR64', 'Ketan']
- for i,label in enumerate(labels):
- folder = os.path.join("data/image/test",label)
- files = sorted(os.listdir(folder))
- files = [x for x in files if x.endswith(".jpg")]
- for k,file in enumerate(files):
- image_path = os.path.join(folder, file)
- image = imread(image_path)/255.
- image = resize(image,(224,224))
- X_test.append(image)
- category = os.path.split(folder)[-1]
- y_test.append(i)
- X_test = np.array(X_test)
- y_test = np.array(y_test)
- #Menampilkan bentuk dari masing-masing dataset
- for image_batch, label_batch in train_generator:
- break
- print("Bentuk array dari dataset train (pelatihan) adalah:", image_batch.shape,label_batch.shape)
- for image_batch, label_batch in val_generator:
- break
- print("Bentuk array dari dataset validation (validasi) adalah:", image_batch.shape,label_batch.shape)
- print("Bentuk array dari dataset test (pengujian) adalah:", X_test.shape,y_test.shape)
- Menyimpan label varietas beras secara berurutan dalam format file ".txt"
- print (train_generator.class_indices)
- labels_txt = '\n'.join(sorted(train_generator.class_indices.keys()))
- with open('labels.txt', 'w') as f:
- f.write(labels_txt)
- !cat labels.txt
- Membuat Model dari Jaringan CNN yang Sudah dipelajari Sebelumnya (pre-trained convnets). Pada tutorial ini menggunakan arsitektur MobileNet, jika Anda ingin menggunakan arsitektur yang lain dapat mengunjungi https://keras.io/applications/.
- IMG_SHAPE = (224, 224, 3)
- # Membuat model dasar (base model) dari pre-trained model MobileNet
- base_model = tf.keras.applications.MobileNet(input_shape=IMG_SHAPE,
- include_top=False,
- weights='imagenet')
- Notebook Metode Feature Extraction (Transfer Learning)
- Menggunakan model pre-trained untuk ekstraksi fitur (feature extraction) : Ketika bekerja dengan dataset kecil, adalah umum untuk mengambil keuntungan dari fitur yang dipelajari oleh model yang dilatih pada dataset yang lebih besar dalam domain yang sama. Ini dilakukan dengan membuat contoh model pre-trained dan menambahkan classifier yang sepenuhnya terhubung di atas. Model pre-trained adalah "beku" dan hanya bobot pengklasifikasi yang diperbarui selama pelatihan. Dalam hal ini, basis konvolusional mengekstraksi semua fitur yang terkait dengan setiap gambar dan Anda baru saja melatih classifier yang menentukan kelas gambar mengingat set fitur yang diekstraksi.
- base_model.trainable = False
- base_model.summary()
- Mengelompokkan Klasifikasi Tiga Jenis Beras dengan Deep learning Menggunakan Metode Convolutional Neural Network (CNN).
- Sesudah mengimpor dataset, kita akan menggunakan CNN, salah satu arsitektur Deep Learning yang dapat menghandle gambar. Dengan menggunakan Deep CNN, kita dibebaskan dari pendefinisian fitur yang cocok dan hanya memberikan gambar-gambar ke jaringan. CNN akan menentukan fitur yang paling cocok untuk pengklasifikasian.
- import keras
- from keras import backend as K
- from keras.models import Sequential
- from keras import layers
- from keras.utils.np_utils import to_categorical
- from sklearn.model_selection import train_test_split
- Mempersiapkan Data Masukkan Pengujian
- y_test2 = to_categorical(y_test)
- X_test3, y_test3 = (X_test, y_test2)
- Pembuatan Model (Menambah Model untuk Melakukan Klasifikasi)
- model = tf.keras.Sequential([
- base_model,
- tf.keras.layers.Conv2D(32, 3, activation='relu'),
- #tf.keras.layers.Dropout(0.2),
- tf.keras.layers.GlobalAveragePooling2D(),
- tf.keras.layers.Dense(3, activation='softmax')
- ])
- model.compile("adam",loss="categorical_crossentropy",metrics=["acc"])
- model.summary()
- Pelatihan Model Arsitektur CNN yang dibuat pada Dataset Pelatihan dan Validasi
- #from keras.callbacks import EarlyStopping, ModelCheckpoint
- #Menyimpan file model bobot yang terbaik selama pelatihan (dalam format keras ".h5")
- #ckpt = ModelCheckpoint("Klasifikasi Beras Tumpukan.h5", monitor='val_loss', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)
- history = model.fit_generator(train_generator,
- epochs=100,
- validation_data=val_generator)
- #history = model.fit(x = X_train3, y = y_train3, batch_size=120, epochs= 100,validation_data=(X_valid3,y_valid3),callbacks = [ckpt])
- Menggambarkan Hasil Pelatihan dalam Bentuk Grafik yang dilakukan Selama 100 Epochs
- plt.plot(history.history["acc"],label="Akurasi Pelatihan")
- plt.plot(history.history["val_acc"],label="Validasi Akurasi")
- plt.legend()
- plt.show()
- plt.plot(history.history["loss"],label="Kesalahan Pelatihan")
- plt.plot(history.history["val_loss"],label="Validasi Kesalahan")
- plt.legend()
- plt.show()
- Menggunakan Model untuk Melihat Hasil Pelatihan antara Dataset Pelatihan dan Validasi.
- #Prediksi Label Validasi dengan Pelatihan
- n = 44
- input_image = image_batch[n][np.newaxis,...]
- print("Labelnya adalah: ", label_batch[n])
- predictions = model.predict(input_image)
- print("Prediksinya adalah",predictions[0])
- Hasil tersebut merupakan hasil prediksi dari training dari 3 jenis data pelatihan yaitu jenis beras Basmathi, IR 64, dan Ketan. Menggunakan inputan gambar dengan piksel 224 x 224, 1 filter dengan fungsi aktivasi relu, dan 1 layer output dengan fungsi aktivasi softmax
- Evaluasi Model Hasil Pelatihan dengan Dataset Pengujian
- #Memeriksa matriks model
- print(model.metrics_names)
- #Evaluasi data test
- print(model.evaluate(x= X_test3, y = y_test3))
- #Menampilkan matriks yang benar dan matriks hasil prediksi
- #Label yang benar
- y_true = np.argmax(y_test2,axis=1)
- #Label prediksi
- Y_pred = model.predict(X_test)
- y_pred = np.argmax(Y_pred, axis=1)
- print(y_true)
- print(y_pred)
- Hasil Prediksi dari setiap Gambar Dataset Pengujian
- n = 44 #Jangan melampaui (nilai dari gambar test - 1)
- plt.imshow(X_test[n])
- plt.show()
- true_label = np.argmax(y_test2,axis=1)[n]
- print("Label yang benar adalah:",true_label,":",labels[true_label])
- prediction = model.predict(X_test[n][np.newaxis,...])[0]
- print("Nilai yang diprediksi adalah:",prediction)
- predicted_label = np.argmax(prediction)
- print("Label yang diprediksi adalah:",predicted_label,":",labels[predicted_label])
- if true_label == predicted_label:
- print("Prediksi benar")
- else:
- print("Prediksi salah")
- Confusion Matrix dari Hasil Pengujian Setiap Dataset Varietas Beras
- from sklearn.metrics import confusion_matrix
- from sklearn.utils.multiclass import unique_labels
- def plot_confusion_matrix(y_true, y_pred, classes,
- normalize=False,
- title=None,
- cmap=plt.cm.Blues):
- """
- This function prints and plots the confusion matrix.
- Normalization can be applied by setting `normalize=True`.
- """
- if not title:
- if normalize:
- title = 'Normalized confusion matrix'
- else:
- title = 'Confusion matrix, without normalization'
- # Compute confusion matrix
- cm = confusion_matrix(y_true, y_pred)
- # Only use the labels that appear in the data
- #classes = classes[unique_labels(y_true, y_pred)]
- if normalize:
- cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
- print("Normalized confusion matrix")
- else:
- print('Confusion matrix, without normalization')
- print(cm)
- fig, ax = plt.subplots(figsize=(5,5))
- im = ax.imshow(cm, interpolation='nearest', cmap=cmap)
- #ax.figure.colorbar(im, ax=ax)
- # We want to show all ticks...
- ax.set(xticks=np.arange(cm.shape[1]),
- yticks=np.arange(cm.shape[0]),
- # ... and label them with the respective list entries
- xticklabels=classes, yticklabels=classes,
- title=title,
- ylabel='Label Benar',
- xlabel='Label Prediksi')
- # Rotate the tick labels and set their alignment.
- plt.setp(ax.get_xticklabels(), rotation=45, ha="right",
- rotation_mode="anchor")
- # Loop over data dimensions and create text annotations.
- fmt = '.2f' if normalize else 'd'
- thresh = cm.max() / 2.
- for i in range(cm.shape[0]):
- for j in range(cm.shape[1]):
- ax.text(j, i, format(cm[i, j], fmt),
- ha="center", va="center",
- color="white" if cm[i, j] > thresh else "black")
- fig.tight_layout()
- return ax
- np.set_printoptions(precision=2)
- plot_confusion_matrix(y_true, y_pred, classes=labels, normalize=True,
- title='Normalized confusion matrix')
- Menyimpan Hasil Model Pelatihan dan Konversi ke TensorFlow Lite.
- Menyimpan model menggunakan tf.saved_model.save dan kemudian mengonversi model tersimpan ke format yang kompatibel tf lite.
- saved_model_dir = 'save/model'
- tf.saved_model.save(model, saved_model_dir)
- converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
- tflite_model = converter.convert()
- with open('Klasifikasi_3_Varietas_Beras_MobileNet.tflite', 'wb') as f:
- f.write(tflite_model)
- Jika Anda ingin menjalankan seluruh program tersebut dari awal sampai akhir maka dapat menggunakan cara seperti berikut.
- Setelah seluruh program tersebut dijalankan maka akan didapat model hasil pelatihannya yang sudah dikonversi ke dalam format TensorFlow Lite beserta labelnya.
- Untuk menyimpan model dan labelnya dapat dilakukan dengan cara klik kanan pada file model dan labelnya kemudian pada pop up pilih "Download".
- Untuk menyimpan program beserta ouput-nya pada Github dapat dilakukan dengan cara membuka menu "File" kemudian pilih "Save a copy in Github".
- Selanjutnya Anda akan diminta masuk ke akun Github milik Anda.
- Masukkan kode verifikasi dari e-mail atau nomor HP Anda (jika ada).
- Kemudian pada jendela pop up "Copy to Github" pilih lokasi repositori Anda dan isi nama file ".ipynb" sesuai keinginan kemudian klik "OK".
- Selesai !!
Source code program baris sel kode program 1 :
Source code program untuk mengimpor library yang dibutuhkan :
Source code Feature Extraction
Notebook klasifikasi 3 varietas beras dengan CNN :
Library untuk klasifikasi 3 kelas varietas beras :
Source code model hasil pelatihan :
Notebook model hasil pelatihan :
Notebook konversi model ke ".tflite"
Source code konversi model ke ".tflite"
Catatan :
- Bingkai textbox yang berwarna oranye merupakan isi pada baris sel Notebook, sedangkan yang berwarna ungu adalah Source code program yang dibuat pada baris sel kode Google Colab.
- Penulisan Notebook yang Anda buat dapat berbeda sesuai dengan keinginan.
- Untuk source code lengkapnya dapat dilihat di sini.
Video tutorial hasil pelatihannya dapat dilihat di bawah.
Terima kasih atas kunjungannya :)))
Tutorial selanjutnya adalah menerapkan model hasil pelatihan CNN di postingan ini pada perangkat Android pada link berikut.
Tutorial selanjutnya adalah menerapkan model hasil pelatihan CNN di postingan ini pada perangkat Android pada link berikut.
saya kok error ya saat membuat dataset pengujian?
BalasHapusNama folder sama path direktorinya udah disesuain sama programnya?
Hapushasil train baguss, tapi kok pas evaluasi model sama pengujian model acc jadi turun bangett ya.. itu kenapa ya?
BalasHapusy_test2 = to_categorical(y_test)
X_test3, y_test3 = (X_test, y_test2)
sama kode diatas itu buat apaa ??
terimakasihh