Klasifikasi Gambar dengan CNN di Google Colab

Klasifikasi Minuman Kopi dan Bukan Kopi dengan Convolution Neural Network (CNN)

6 min readMay 15, 2024

--

Convolution Neural Network (CNN)

Convolution Neural Network (CNN) adalah salah satu jenis jaringan saraf deep learning yang biasa digunakan Computer Vision. Computer Vision adalah bidang kecerdasan buatan yang memungkinkan komputer memahami dan menafsirkan gambar atau data visual. Neural Network dapat digunakan pada data yang berisi gambar, audio, dan teks. Dengan berbagai jenis Neural Network, penggunaanya dapat didasarkan pada kebutuhan peneliti, CNN sendiri dapat digunakan untuk melakukan klasifikasi gambar. Dalam melakukan prediksi data gambar, CNN melakukan identifikasi sebagai berikut:

  1. Input Layer: Gambar yang ingin diklasifikasikan diinputkan ke dalam CNN.
  2. Convolution Layer: Berfungsi untuk mengekstrak fitur-fitur penting dari gambar melalui perkalian matriks.
  3. Activation Function: Setiap hasil convolutional dilakukan dengan fungsi aktivasi yang memungkinkan model untuk mempertahankan atau menghilangkan informasi yang tidak relevan. Fungsi aktivasi yang paling umum digunakan adalah ReLU (Rectified Linear Unit) atau Sigmoid.
  4. Pooling Layer: Mengurangi ukuran gambar dan menghilangkan redundansi. Pooling ini dapat berupa max pooling atau average pooling.
  5. Flattening: Mengubah gambar menjadi vektor yang dapat diproses oleh lapisan fully connected.
  6. Fully Connected Layer: Mengintegrasikan informasi yang telah diperoleh dari convolutional dan pooling. Lapisan ini terdiri dari neuron yang saling terhubung dan memungkinkan model untuk membuat prediksi berdasarkan informasi yang telah diperoleh.
  7. Output Layer: Menghasilkan prediksi akhir berupa klasifikasi gambar. Prediksi ini dapat berupa kelas yang paling mungkin atau skor yang menunjukkan kemungkinan kelas.

Pada artikel kali ini, saya akan melakukan klasifikasi gambar untuk membedakan minuman kopi dan bukan kopi dengan Google Colab.

Arsitektur CNN

STEP 1: DATA PREPARATION

Untuk melakukan klasifikasi ini, saya mengunduh 30 gambar untuk setiap kelompok (kopi dan bukan kopi) lalu input data ke dalam Google Drive dan hubungkan Google Drive dengan Google Colab.

Data minuman kopi
Data minuman bukan kopi
Input data ke Google Drive

STEP 2: CONNECT GOOGLE COLAB WITH GOOGLE DRIVE

Hubungkan Google Drive ke Google Colab
Tampilan setelah Google Drive dihubungkan ke Google Colab

STEP 3: IMPORT MODULE & DATA

import matplotlib.pyplot as plt
import numpy as np
import os
import PIL
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
from IPython.display import Image
  • matplotlib.pyplot: digunakan untuk pembuatan grafik, plot, dan visualisasi data.
  • numpy: menyediakan struktur data array multidimensi, serta berbagai fungsi matematika yang dapat diterapkan pada array tersebut.
  • os: digunakan untuk interaksi dengan sistem operasi, seperti manipulasi path file dan direktori.
  • PIL (Python Imaging Library): untuk manipulasi gambar, seperti membuka, mengubah ukuran, dan menyimpan gambar dalam berbagai format.
  • tensorflow: digunakan untuk membuat, melatih, dan mengevaluasi model machine learning.
  • tensorflow.keras: untuk membangun dan melatih model jaringan saraf dalam TensorFlow.
  • tensorflow.keras.layers: digunakan untuk membangun arsitektur model jaringan saraf.
  • tensorflow.keras.models.Sequential: untuk pembuatan model secara berurutan, dengan setiap lapisan model dihubungkan satu sama lain secara berurutan.
  • IPython.display.Image: untuk menampilkan gambar di notebook IPython atau Jupyter.
# Import dataset
import pathlib
path = "drive/My Drive/UTS AI/minuman"
data_dir = pathlib.Path(path)

STEP 4: SPLIT DATASET

Untuk membuat model CNN, saya memisahkan data menjadi data training untuk melatih model dan data validation untuk menguji apakah model dapat memprediksi data dengan baik. Menggunakan perbandingan yang paling umum, yakni 80:20 sehingga data dipisah menjadi 48 gambar untuk data training dan 12 gambar untuk data validation.

batch_size = 16
img_height = 180
img_width = 180

# Split data training dan data validasi
train_data = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split = 0.2,
subset = "training",
seed = 123,
image_size = (img_height, img_width),
batch_size = batch_size)

validation_data = tf.keras.preprocessing.image_dataset_from_directory(
data_dir,
validation_split = 0.2,
subset = "validation",
seed = 123,
image_size = (img_height, img_width),
batch_size=batch_size)
  • batch_size: jumlah sampel yang akan diproses dalam satu iterasi selama pelatihan model.
  • img_height: tinggi gambar dalam piksel.
  • img_width: lebar gambar dalam piksel.

STEP 5: CREATING MODEL

Sebelum membuat model, saya melakukan konversi data yang awalnya berupa gambar menjadi angka sehingga dapat dibaca oleh CNN.

# Konversi ke dalam bentuk CNN
normalization_layer = tf.keras.layers.Rescaling(1./255)
normalized_data = train_data.map(lambda x, y: (normalization_layer(x), y))
image_batch, labels_batch = next(iter(normalized_data))
first_image = image_batch[0]
print(np.min(first_image), np.max(first_image))

Setelah melakukan normalisasi data, saya membuat model CNN sebagai berikut:

# Membuat model
num_classes = 2
model = Sequential([
tf.keras.layers.Rescaling(1./255, input_shape=(img_height, img_width, 3)),
layers.Conv2D(16, 3, padding='same', activation='relu' ),
layers.MaxPooling2D(),
layers.Conv2D(32, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Conv2D(64, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dense(num_classes)
])

karena ingin memprediksi dua kelas (kopi dan bukan kopi), maka pada num_classes diisikan angka 2.

Setelah dibuatkan modelnya, dilakukan kompilasi model untuk mengkonfigurasi model dengan optimizer, fungsi loss, dan metrik yang digunakan untuk evaluasi.

# Kompilasi model
model.compile(optimizer = 'adam',
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits = True),
metrics = ['accuracy'])
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
rescaling_1 (Rescaling) (None, 180, 180, 3) 0

conv2d (Conv2D) (None, 180, 180, 16) 448

max_pooling2d (MaxPooling2 (None, 90, 90, 16) 0
D)

conv2d_1 (Conv2D) (None, 90, 90, 32) 4640

max_pooling2d_1 (MaxPoolin (None, 45, 45, 32) 0
g2D)

conv2d_2 (Conv2D) (None, 45, 45, 64) 18496

max_pooling2d_2 (MaxPoolin (None, 22, 22, 64) 0
g2D)

flatten (Flatten) (None, 30976) 0

dense (Dense) (None, 128) 3965056

dense_1 (Dense) (None, 2) 258

=================================================================
Total params: 3988898 (15.22 MB)
Trainable params: 3988898 (15.22 MB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________

STEP 6: TRAIN THE MODEL

Setelah membuat model CNN, lakukan pelatihan model dengan data validasi menggunakan epochs sebanyak 10.

epochs: jumlah pelatihan

# Melakukan pelatihan model
epochs = 10
history = model.fit(train_data,
validation_data = validation_data,
epochs = epochs)
Epoch 1/10
3/3 [==============================] - 2s 622ms/step - loss: 0.4333 - accuracy: 0.7708 - val_loss: 0.4159 - val_accuracy: 0.9167
Epoch 2/10
3/3 [==============================] - 3s 894ms/step - loss: 0.3772 - accuracy: 0.8125 - val_loss: 0.3514 - val_accuracy: 0.8333
Epoch 3/10
3/3 [==============================] - 4s 1s/step - loss: 0.3671 - accuracy: 0.8125 - val_loss: 0.4046 - val_accuracy: 0.7500
Epoch 4/10
3/3 [==============================] - 2s 578ms/step - loss: 0.2758 - accuracy: 0.9167 - val_loss: 0.3196 - val_accuracy: 0.8333
Epoch 5/10
3/3 [==============================] - 2s 610ms/step - loss: 0.2636 - accuracy: 0.8958 - val_loss: 0.3278 - val_accuracy: 1.0000
Epoch 6/10
3/3 [==============================] - 2s 587ms/step - loss: 0.1967 - accuracy: 0.9583 - val_loss: 0.4309 - val_accuracy: 0.7500
Epoch 7/10
3/3 [==============================] - 2s 730ms/step - loss: 0.1716 - accuracy: 0.9583 - val_loss: 0.3062 - val_accuracy: 0.9167
Epoch 8/10
3/3 [==============================] - 4s 1s/step - loss: 0.1323 - accuracy: 0.9583 - val_loss: 0.3179 - val_accuracy: 0.9167
Epoch 9/10
3/3 [==============================] - 3s 637ms/step - loss: 0.0985 - accuracy: 1.0000 - val_loss: 0.2456 - val_accuracy: 0.9167
Epoch 10/10
3/3 [==============================] - 2s 625ms/step - loss: 0.0742 - accuracy: 0.9583 - val_loss: 0.3182 - val_accuracy: 0.9167

Secara keseluruhan model menunjukkan peningkatan yang baik dalam akurasi dan penurunan pada loss, hal ini berarti model terlatih dengan baik dari data pelatihan dan mampu mengeneralisasikan data validasi secara baik.

STEP 8: PREDICTION

# Prediksi model
# Gambar 1
path1 = "drive/My Drive/UTS AI/test/test 1.jpg"
img1 = keras.preprocessing.image.load_img(
path1,
target_size = (img_height, img_width))
img_array1 = keras.preprocessing.image.img_to_array(img1)
img_array1 = tf.expand_dims(img_array1, 0)
predictions1 = model.predict(img_array1)
score1 = tf.nn.softmax(predictions1[0])
display(Image(filename = path1))

print("Gambar ini mendekati {} dengan tingkat kepercayaan sebesar {:.2f} persen"
.format(class_names[np.argmax(score1)], 100*np.max(score1)))

# Gambar 2
path2 = "drive/My Drive/UTS AI/test/test 2.jpg"
img2 = keras.preprocessing.image.load_img(
path2,
target_size = (img_height, img_width))
img_array2 = keras.preprocessing.image.img_to_array(img2)
img_array2 = tf.expand_dims(img_array2, 0)
predictions2 = model.predict(img_array2)
score2 = tf.nn.softmax(predictions2[0])
display(Image(filename = path2))

print("Gambar ini mendekati {} dengan tingkat kepercayaan sebesar {:.2f} persen"
.format(class_names[np.argmax(score2)], 100*np.max(score2)))

# Gambar 3
path3 = "drive/My Drive/UTS AI/test/test 3.jpg"
img3 = keras.preprocessing.image.load_img(
path3,
target_size = (img_height, img_width))
img_array3 = keras.preprocessing.image.img_to_array(img3)
img_array3 = tf.expand_dims(img_array3, 0)
predictions3 = model.predict(img_array3)
score3 = tf.nn.softmax(predictions3[0])
display(Image(filename = path3))

print("Gambar ini mendekati {} dengan tingkat kepercayaan sebesar {:.2f} persen"
.format(class_names[np.argmax(score3)], 100*np.max(score3)))
test 1
test 2
test 3

Dari ketiga gambar di atas ternyata model masih mengklasifikasikan susu rasa karamel dengan kemasan kotak sebagai minuman kopi. Hal ini dapat terjadi karena berbagai faktor, salah satunya adalah kurangnya data yang digunakan dalam pelatihan model.

Sekian dari artikel tentang klasifikasi gambar dengan CNN, terima kasih atas perhatiannya, semoga bermanfaat.

--

--

No responses yet

Write a response