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.

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 data train dari folder train/ datatest = DirectoryIterator('test', datagen) # load data test 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) # berukuran (banyak batch, panjang, lebar, channel) print("dimensi gambar:", imgs[0].shape) # ukuran tiap gambar print("contoh gambar (channel R)") # contoh gambar, nilai ada di antara 0 sampai 1 print(imgs[0,:,:,0]) print("contoh label") # label adalah array yang menyimpan label dari setiap gambar print(labels[0]) # sudah "one-hot" jadi bukan tertulis kelas "3" tapi tertulis "[0, 0, 0, 1, 0] print("contoh gambar visualnya") plt.imshow( imgs[0] ) break
Implementasi
Arsitektur CNN

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:

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!
mas tolong dong , review faster R CNN sama adam optimizer kebetulan saya butuh sih mas buat referensi
terima kasih requestnya, kami coba usahakan di artikel-artikel selanjutnya ya. Untuk Adam optimizer penjelasan di blog ini lumayan bagus sudah cek? https://ruder.io/optimizing-gradient-descent/