Image Classification dengan CNN dan Tensorflow

Pada artikel ini saya akan menjelaskan secara ringkas langkah-langkah penggunaan Tensorflow untuk Image Classification / Klasifikasi Citra. Perlu dicatat, saya menggunakan Tensorflow versi 2 yang mungkin berbeda dengan Tensorflow versi 1. Selain itu, saya garis bawahi lagi artikel ini membahas image classification (menentukan ini gambar apa), bukan detection (menentukan objek apa dan di mana pada gambar). Secara alur, pada artikel ini saya mengembangkan dari artikel sebelumnya tentang implementasi CNN menggunakan PyTorch

Dataset

Dataset yang akan kita gunakan adalah citra barang-barang yang ada di sebuah toko (dimodifikasi dari Freiburg Groceries Dataset) yang terdiri dari 5 kelas, yakni citra produk Susu (MILK), Air mineral (WATER), soda (SODA), jus (JUICE), dan cuka (VINEGAR). Total terdapat sekitar 900-an gambar untuk pelatihan dan 120 gambar untuk pengujian. Semua citra berukuran sama, yakni 256×256 pixel. Dataset dan code bisa di-download di repository berikut.

salah satu citra dengan kelas “Juice”

Kita akan menggunakan dataset yang ada pada folder “train” untuk pelatihan dan yang ada pada folder “test” untuk pengujian. Pada tutorial ini kita masih belum menggunakan teknik validasi seperti menggunakan data validasi atau cross-validation.

Pre-Processing

Jika diperhatikan, format folder dataset yang telah di-download adalah seperti berikut.

dataset/
   train/
      kelas_1/
         citra_103.png
         citra_22.png
         ...
      kelas_2/
         citra_123.png
         citra_324.png
         ...
      ...
   test/
      ...

Format tersebut adalah format standar untuk image classification. Ketika format foldernya sudah seperti itu, beberapa framework seperti Tenorsflow atau PyTorch sudah menyediakan cara mudah untuk meload data. Pada Tensorflow kita bisa menggunakan perintah berikut untuk meload dataset.

from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(rescale=1/255.) # pre-processor
datatrain = DirectoryIterator('train', datagen) # load trainset dari folder train/
datatest = DirectoryIterator('test', datagen) # load testset dari folder test/

Objek datagen adalah objek ImageDataGenerator() yang berfungsi untuk memproses data sebelum di load. Ada banyak fungsi di dalamnya. Pada artikel ini kita hanya menggunakan fungsi rescale. Fungsi rescale digunakan untuk mengubah skala nilai citra. Jadi ketika citra itu di load, citra direpresentasikan sebagai array 3D (atau kadang disebut Tensor) dengan nilai rentangan antara 0..255. Pada parameter rescale saya beri nilai “1/255” yang artinya nanti setiap nilai akan dikali 1/255 sehingga rentangan nilainya akan berubah diantara 0..1. Kenapa perlu diubah rentangan nilai ini? agak panjang detailnya tapi intinya untuk memudahkan neural network belajar.

Hasil dari perintah diatas akan menghasilkan object Tensorflow Dataset, sebuah object yang memudahkan proses pengolahan dataset. Sebagai contohnya kita bisa coba jalankan perintah di bawah, maka akan dihasilkan informasi-informasi dari dataset yang kita miliki.

print(datatrain.class_indices) # menampilkan kelas-kelas pada dataset
print("banyak batch:", len(datatrain)) # menampilkan banyak batch

for imgs, labels in datatrain: # datatrain bukan array, hanya bisa diakses melalui perulangan
    print("apa itu imgs", type(imgs)) # numpy array 4D
    print("dimensi imgs dengan batch:", imgs.shape)  # (n-batch, panjang, lebar, channel)
    print("dimensi gambar:", imgs[0].shape) # ukuran tiap gambar
    print("contoh gambar (hanya channel Red)") # nilai ada antara 0 sampai 1
    print(imgs[0,:,:,0])
    print("contoh label") 
    print(labels[0]) # sudah "one-hot". Bukan tertulis kelas "3" tapi [0, 0, 0, 1, 0]

    print("contoh gambar visualnya")
    plt.imshow( imgs[0] )
    break

Implementasi

Arsitektur CNN

Ilustrasi CNN untuk klasifikasi citra ke 3 kelas (hanya contoh, berbeda dengan arsitektur yang akan digunakan pada artikel ini)

Pada tutorial ini, kita akan menggunakan model CNN sama seperti yang kita gunakan pada artikel sebelumnya (silakan baca pada artikel tersebut untuk detail penjelasan arsitektur yang digunakan). Model dengan dua convolutional layer dan sebuah fully connected layer. Dengan detail parameter setiap layer sebagai berikut:

W = window size, S = stride, P = padding, FM = feature map, N = jumlah neuron

Pembuatan model di Tensorflow ada banyak cara, yang paling mudah adalah menggunakan Keras Sequential. Sebelum mendefinsikan model beberapa library perlu yang diimport untuk pembentukan model, yakni:

import tensorflow as tf
from tensorflow.keras import Sequential, layers

Lalu untuk membuat modelnya kita definsikan menggunakan Keras Sequential. Dengan menggunakan Keras Sequential, layer-layer arsitektur jaringan saraf tiruan didefinisikan secara urut dari depan (input layer) sampai belakang (output layer). Untuk model dengan ilustrasi di atas, kita definisikan sebagai berikut:

model = Sequential([
  layers.Conv2D(16, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Conv2D(32, 16, activation='relu'),
  layers.MaxPooling2D(),
  layers.Flatten(),
  layers.Dense(512, activation='relu'),
  layers.Dense(5, activation='softmax')
])

Alur Pelatihan

Setelah model jadi dibuat, kita bisa compile model kita dengan algoritma optimasi apa yang akan kita gunakan untuk pelatihan model kita:

model.compile(loss='categorical_crossentropy',
     optimizer=tf.keras.optimizers.Adadelta(learning_rate=0.001),
     metrics=['accuracy'])

Lalu jalankan pelatihan dengan perintah berikut:

model.fit(datatrain, batch_size=16, epochs=20, verbose=1)

Alur Pengujian

Setelah model selesai dilatih, maka kita akan uji dengan data test. Data test yang belum kita gunakan ini saya pilih secara acak dari masing-masing kelas dan tidak ada di data train. Proses pengujian cukup dilakukan dengan perintah berikut:

test_loss, test_acc = model.evaluate(datatest, verbose=1)

Variabel test_loss akan menyimpan nilai error hasil data test sedangkan test_acc akan menympan nilai akurasi hasil data test.

Selesai!

Jika dibandingkan dengan proses klasifikasi citra menggunakan PyTorch, dapat dilihat kode Tensorflow seakan lebih ringkas. Fungsi .fit() dari Keras sangat meringkas proses iterasi pelatihan pada PyTorch.

Tapi kalau saya pribadi hal tersebut malah menjadi kekurangan dari Tensorflow. Menyembunyikan “bagian utama” dari proses pelatihan neural network malah membuat saya tidak nyaman untuk mengajari alur pelatihan yang terjadi, atau berekpserimen lebih dalam. Tapi ya setiap orang punya pendapat masing-masing 😀 yang penting “dicoba dulu saja..”. Semoga bermanfaat!

About the author

Rian Adam

Lecturer at Universitas Islam Indonesia; Machine Learning Enthusiast

View all posts

4 Comments

  • Maaf mau tanya kak,terkait rescale 1/255 misalnya warna merah rgbnya (255,0,0) berarti di rubah jadi (1,0,0)?dan apakah bisa nilainya jadi(1,0.00232,0.343) dalam jangkauan array 0 sampai 1?

    • untuk pertanyaan pertama betul, kalau warna RGB Merah yang awalnya (255, 0, 0) setelah di rescale akan menjadi (1, 0, 0).

      “apakah bisa nilainya jadi(1, 0.00232, 0.343)?” jika diconvert langsung dari RGB seharusnya tidak bisa, nilai warna RGB dasarnya adalah bilangan bulat antara 0…255. Sedangkan 0.343 x 255 dan 0.00232 x 255 tidak menghasilkan angka bulat.

      Contoh ada warna pixel (255, 100, 12) jika di rescale akan menjadi (1, 0.39215, 0,04705) jika dikembalikan dengan cara dikali dengan 255 akan kembali ke angka awalnya (255, 100, 12)

Leave a Reply