Binary Image Classification (Dogs & Cats) | Python

Menggunakan Tensorflow dan Keras

Wanda Listathea Putri
7 min readNov 13, 2021
Photo by Grant Durr on Unsplash

Assalamu’alaikum, halo teman-teman… Kali ini saya akan mencoba melakukan klasifikasi gambar 2 kategori (binary image classification) yaitu anjing dan kucing dengan menggunakan package Tensorflow dan Keras. Data gambar yang saya gunakan berasal dari Kaggle, namun hanya akan menggunakan 1.000 gambar saja untuk mempersingkat proses running.

Sebelum masuk ke studi kasus dan programnya, kita coba kenalan dulu ya dengan apa yang dimaksud Image Classification. Image classification atau klasifikasi gambar merupakan salah satu metode dalam Machine Learning/Artificial Intelligence yang dapat digunakan untuk mendeteksi sebuah gambar dengan cepat. Jadi, kita bisa memberikan gambar kepada mesin, kemudian mesin dapat dengan cepat mengklasifikasikan gambar tersebut masuk ke dalam kelas/kategori apa.

Studi Kasus

Data yang akan digunakan hanya berjumlah 1.000 gambar, terdiri dari masing-masing 400 gambar untuk training set (dogs & cats) dan masing-masing 100 gambar sebagai test set (dogs & cats). Data saya upload ke dalam google drive sehingga direktori bekerja nantinya akan diarahkan ke drive. Struktur dari folder adalah sebagai berikut:

Isi Folder “dog vs cat”
Isi Folder “training_set” dan “test_set”

Folder utamanya adalah “dog vs cat”, kemudian di dalamnya terdapat 3 folder yaitu “training_set” untuk membentuk model, “test_set” untuk melihat kemampuan model, serta folder “predict_set”. Untuk masing-masing folder “training_set” dan “test_set”, di dalamnya terdapat folder “cats” yang berisi gambar-gambar kucing dan folder “dogs” yang berisi gambar-gambar anjing.

Isi Folder “predict_set”

Untuk folder “predict_set”, saya isikan sendiri data gambarnya terdiri dari 5 gambar anjing dan 5 gambar kucing. Gambar ini nantinya digunakan sebagai data yang diujikan berdasarkan model yang telah terbentuk.

Langkah dalam membuat image classification menggunakan Tensorflow dan Keras adalah sebagai berikut:

  1. Import package yang diperlukan
  2. Tentukan direktori folder “training_set” dan “test_set”
  3. Lakukan image data generator
  4. Bentuk arsitektur model
  5. Fit model terhadap data “training_set”
  6. Buat grafik nilai akurasi dan loss
  7. Lakukan prediksi terhadap data baru (“predict_set”)

1. Import Package

Import terlebih dahulu package yang diperlukan sebagai berikut.

!pip install tensorflow-gpu==1.15from tensorflow.keras.preprocessing.image import ImageDataGeneratorfrom tensorflow.keras.preprocessing import imagefrom tensorflow.keras import optimizersfrom tensorflow.keras import layers, modelsfrom google.colab import filesimport matplotlib.pyplot as pltimport tensorflow as tfimport numpy as npimport cv2from os import listdirfrom os.path import isfile, join

2. Menentukan Direktori Folder

Karena bekerja dengan menggunakan google drive, maka hubungkan terlebih dahulu Google Colab dengan drive menggunakan code berikut.

from google.colab import drivedrive.mount('/content/drive')
!ls "/content/drive/My Drive/dog vs cat"

Direktori untuk folder “training_set” dan “test_set” adalah sebagai berikut.

# Setting direktori training set dan test settrain_dir = "/content/drive/My Drive/dog vs cat/training_set/"test_dir = "/content/drive/My Drive/dog vs cat/test_set/"
# Cek isi dari folderos.listdir(train_dir)

3. Melakukan Image Data Generator

Image data generator dilakukan untuk memproduksi lebih banyak sampel padahal hanya dari satu gambar. Hal ini dilakukan agar model tidak overfitting terhadap satu variasi gambar saja (misalkan gambar lurus menghadap depan), namun dapat pula menangkap dengan baik variasi lain meskipun dengan objek yang sama (misalkan gambar miring ke kanan atau ke kiri).

Perbanyakan sampel ini hanya dilakukan pada data “training_set”, sedangkan untuk data “test_set” cukup dilakukan rescale saja.

train_datagen = ImageDataGenerator(rescale = 1/255,rotation_range = 30,horizontal_flip = True,shear_range = 0.2,fill_mode = "nearest")# Kalau test set hanya di-rescale saja, bukan untuk memperbanyak sampeltest_datagen = ImageDataGenerator(rescale = 1/255)

Terapkan image data generator tersebut pada masing-masing direktori “training_set” dan “test_set”. Ukuran gambar hasil dari generator ini adalah 150x150, sesuai dengan “target_size” yang ditentukan. Karena klasifikasi yang dilakukan adalah terhadap 2 kelas/kategori, maka “class_mode” diisi dengan nilai “binary”.

train_generator = train_datagen.flow_from_directory(train_dir,target_size = (150, 150),class_mode = "binary")test_generator = test_datagen.flow_from_directory(test_dir,target_size = (150, 150),class_mode = "binary")

4. Membentuk Arsitektur Model

Arsitektur model akan terdiri dari layer Convolutional, MaxPooling, Flatten, Dense, dan Dropout. Saya mencoba membuat arsitekrut dengan beberapa kali layer Convolutional dan MaxPooling sebagai berikut.

# Conv2D -> Two dimensional convolutional model# 32 -> Input for next layer# (3, 3) -> Convolutional window sizemodel = tf.keras.models.Sequential([tf.keras.layers.Conv2D(16, (3, 3), activation = "relu", input_shape = (150, 150, 3)),tf.keras.layers.MaxPooling2D(2, 2),#tf.keras.layers.Conv2D(32, (3, 3), activation = "relu"),tf.keras.layers.MaxPooling2D(2, 2),#tf.keras.layers.Conv2D(64, (3, 3), activation = "relu"),tf.keras.layers.MaxPooling2D(2, 2),#tf.keras.layers.Conv2D(128, (3, 3), activation = "relu"),tf.keras.layers.MaxPooling2D(2, 2),##tf.keras.layers.Flatten(), # Output convert into one dimensional layer and will go to Dense layer##tf.keras.layers.Dense(64, activation = "relu"),##tf.keras.layers.Dropout(0.2), # Drop 20% dari neuron at random (biar lebih generalisasi dan running-nya cepat)##tf.keras.layers.Dense(1, activation = "sigmoid") # 1 karena output-nya bukan One Hot Encoding, tapi langsung kode/angka])

Susun arsitektur yang sudah terbentuk menggunakan nilai loss, optimizer, dan metrics berikut.

model.compile(loss = "binary_crossentropy",optimizer = optimizers.RMSprop(),metrics = ["accuracy"])

5. Fit Model

Lakukan fit model terhadap data “training_set” dengan code berikut. Di sini saya hanya menggunakan 20 epochs.

history = model.fit(train_generator,steps_per_epoch = 32,epochs = 20,validation_data = test_generator,validation_steps = 8,verbose = 2)

6. Membuat Grafik Nilai Akurasi dan Loss

Untuk mempermudah evaluasi model, maka dapat dibuat visualisasi perbandingan nilai akurasi dan loss pada data “training_set” dan “test_set” sebagai berikut. Nilai ini merupakan hasil dari fit model sebelumnya pada masing-masing epochs.

# List all data in historyprint(history.history.keys())# Summarize history for accuracyplt.plot(history.history["acc"])plt.plot(history.history["val_acc"])plt.title("Model Accuracy")plt.ylabel("Accuracy")plt.xlabel("Epoch")plt.legend(["train", "test"], loc = "upper left")plt.show()# Summarize history for lossplt.plot(history.history["loss"])plt.plot(history.history["val_loss"])plt.title("Model Loss")plt.ylabel("Loss")plt.xlabel("Epoch")plt.legend(["train", "test"], loc = "upper left")plt.show()
Grafik Perbandingan Nilai Akurasi pada “training_set” dan “test_set”

Nilai akurasi dari epoch terakhir adalah sebesar 79% untuk data “training_set” dan 72,41% untuk data “test_set”.

Grafik Perbandingan Nilai Loss pada “training_set” dan “test_set”

Dari grafik nilai akurasi dan loss, terlihat bahwa perbandingan pada data “training_set” dan “test_set” masih cukup besar sehingga model dikatakan overfitting. Terdapat beberapa hal yang dapat dilakukan untuk mengatasi overfitting ini di antaranya adalah dengan menambah jumlah sampel/data, mengubah arsitektur data, menambah epochs, mengubah optimizer, atau mencoba modifikasi lainnya. Namun untuk kasus kali ini, saya akan menggunakan model ini saja.

7. Melakukan Prediksi Terhadap Data Baru

Model yang sudah terbentuk tadi akan dicobakan untuk memprediksi data baru apakah terbaca sebagai gambar anjing atau kucing. Di sini saya akan memberikan dua cara dalam membaca data baru, yaitu dengan membaca gambar yang ada dalam suatu folder atau dengan cara meng-upload gambar yang akan diprediksi.

a. Cara I: membaca gambar yang ada dalam suatu folder

Tentukan terlebih dahulu direktori folder yang berisi gambar yang akan diprediksi.

predict_dir = "/content/drive/My Drive/dog vs cat/predict_set/"list_files = [f for f in listdir(predict_dir) if isfile(join(predict_dir, f))]list_files

Lakukan prediksi pada masing-masing gambar menggunakan fungsi for loop.

# Predicting Imagesdog_counter = 0cat_counter = 0for i in list_files:img = image.load_img(predict_dir + i, target_size = (150, 150))X = image.img_to_array(img)X = np.expand_dims(X, axis = 0)images = np.vstack([X])classes = model.predict_classes(images, batch_size = 10)classes = classes[0][0]if classes == 0:print(i + ": cat")cat_counter += 1elif classes == 1:print(i + ": dog")dog_counter += 1print("Total Cats: ", cat_counter)print("Total Dogs: ", dog_counter)

Hasil prediksi dari data “predict_set” adalah sebagai berikut.

Hasil Prediksi Data “predict_set”

Terlihat bahwa terdapat 1 gambar anjing yang diprediksi sebagai kucing dan 1 gambar kucing yang diprediksi sebagai gambar anjing.

b. Cara II: meng-upload gambar yang akan diprediksi

# Prediksi denga cara upload gambaruploaded = files.upload()
for fn in uploaded.keys():# Predicting imagespath = fnimg = image.load_img(path, target_size = (150, 150))imgplot = plt.imshow(img)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:print("cat")elif classes == 1:print("dog")else:print("unknown")

Misalkan saya coba meng-upload salah satu gambar berikut.

Prediksi Gambar dengan Cara Upload

Terlihat bahwa gambar anjing tersebut diprediksi sebagai gambar kucing.

— — —

Demikian binary classification untuk gambar anjing dan kucing menggunakan Tensorflow dan Keras. Untuk full code langkah di atas, dapat dilihat pula pada github saya.

Semoga artikel ini bermanfaat. Jika terdapat kekeliruan, mohon koreksinya ya. Terima kasih! :)

Referensi:

  1. https://www.youtube.com/watch?v=Ahy50JCRYNk
  2. https://www.youtube.com/watch?v=aQaZMC9-Jok
  3. https://medium.com/@hafizhan.aliady/membuat-klasifikasi-gambar-images-menggunakan-keras-tensorflow-tf-keras-dan-python-53f7ae953cea

--

--