Sekedar Kue-Kue

Story of Image Classification in Bahasa

source : teguh-anggi

tak.jil . n makanan untuk berbuka puasa (KBBI)

Ramadhan merupakan salah satu masa yang sangat sibuk bagi umat muslim di Indonesia. Tidak hanya membicarakan ibadah ataupun pulang kampung, makanan menjadi topik paling hangat di bulan suci ini. Salah satunya adalah Takjil, sebutan makanan kecil yang dimakan saat berbuka puasa. Pada umumnya, Takjil di Indonesia merupakan kue-kue kecil tradisional yang bentuk dan warnanya berbeda-beda disetiap daerah. Contohnya, kue serabi, lemper, pukis, bika ambon, dan masih banyak lagi [sumber].

Karena bentuk dan warnanya yang bervariasi, memperkenalkan visual dari kue-kue kecil ini kepada machine akan menjadi tantangan tersendiri. Ada beberapa kue yang bentuk dan warna-nya hampir sama namun memiliki cita rasa yang begitu berbeda (contohnya : kue bingka dan kue lumpur). Artikel ini akan fokus pada cerita eksperimentasi pada klasifikasi gambar kue-kue kecil ini menggunakan CNN pada keras di python.

kue binka (kanan) vs kue lumpur (kiri) [source]

Dataset Kue-Kue

Tidak mudah untuk mendapatkan dataset gambar kue-kue nusantara yang siap pakai untuk di-training dalam Machine Learning. Cara paling mudah untuk mengumpulkan daset-nya adalah dengan search nama kue yang diinginkan dan scrap semua gambar yang bisa disave dari google search.

Untungnya, setelah dicari-cari, ditemui satu website yang menyediakan sebuah dataset menarik yang berisi gambar-gambar 8 jenis kue tradisional dari Indonesia.

Kue — Kue Part One

Didatasetnya terdapat hampir 200 gambar training (data-nya seimbang), 20 gambar validation dan 20 gambar testing di masing-masing jenis:

  • Kue Dadar Gulung [Label 0] : Kue Manis yang biasanya berisi kelapa, berbentuk lonjong dan biasanya hijau.
  • Kue Kastengel [Label 1] : Kue Keju untuk lebaran, berbentuk lonjong dan kekuningan.
  • Kue Klepon [Label 2] : Kue berisi gula merah cair, berbentuk bola dan biasanya hijau.
  • Kue Lapis [Label 3] : Kue dari tepung beras yang berlapis-lapis, bentuknya kotak dan berwarna warni.
  • Kue Lumpur [Label 4] : Kue manis dari terigu, berbentuk bulat berwarna kuning.
  • Kue Putri Salju [Label 5] : Kue dari tepung kanji dan dibubuhi gula halus, biasanya berbentuk bulan sabit dan berwarna putih.
  • Kue Risoles [Label 6] : satu satunya kue yang tidak manis didataset ini, lumpia yang biasanya lonjong berwarna keemasan.
  • Kue serabi [Label 7] : Kue dari tepung beras dan dikasih kuah gula, berbentuk bulat dan berwarna putih.
Kue-Kue Part Two

Deskripsi diatas menunjukan bahwa ada kue-kue yang bentuknya mirip-mirip seperti serabi dan kue lumpur atau Kastengel dan Risoles. Sementara kue lapis bisa menjadi kandidat yang memiliki akurasi tinggi karena paling mudah dibedakan dari yang lain.

Model Klasifikasi Gambar

Generik Model yang pasti digunakan untuk multiclass problem seperti ini, pastinya adalah Convolutional Neural Network. Model ini dijalankan diatas Keras di versi 2.4.3 dengan Tensorflow 2.4.1 di python 3.7 dan semua gambar di resize sesuai kebutuhan dan discale dengan 1/255. Lebih detailnya bisa cek disini.

Percobaan pertama yang dilakukan untuk problem ini adalah menggunakan 2 layer CNN, input size 128 x 128 dan banyak Maxpooling (ini hanya eksperiment awal).

Eksperimen 0

Hasilnya sangat tidak memuaskan (dan tidak usah ditunjukan). Permasalahan yang muncul bukan hanya masalah hasilnya, namun juga waktu training yang memakan rata-rata 64 detik per epoch. Training ini dilakukan hanya menggunakan CPU i3. Lalu, dicoba menggunakan GPU lokal yang membantu mengurangi waktu rata-rata per epochnya menjadi 45 detik (ini GPU 930M).

Untuk yang ingin menggunakan GPU Lokalnya, mungkin bisa mengikuti langkah2 disini dan disini. Namun semakin cepat training-nya, bukan berarti akan semakin bagus performanya.

Percobaan kedua (setelah beberapa iterasi), dicoba menggunakan CNN lebih banyak — 6 layer CNN, input size 128 x 128 dan menggunakan google colab untuk training yg lebih cepat. Struktur yang dipakai seperti berikut, dimana menggunakan Adam sebagai oprimizernya dengan Learning rate .00001 dengan sekitar 25 epoch,

Eksperimen 4

Hasilnya masih kurang memuaskan, evaluasi validasinya tidak melebihi 70% akurasinya. Kue kastangel dan lumpur menjadi 2 label yang paling jelek F1-scorenya.

Hasil eksperimen 4

Percobaan Ketiga, dengan menggunakan transfer learning dari model sebelumnya, model di training lanjut menggunakan augmentasi gambar dari ImageDataGenerator.

Eksperimen 4.3

Penjelasan lebih lanjut mengenai rotation, height_shift_range, atau shear_range, bisa dilihat disini. Augmentasi ini membantu mengurangi variance yang akan membuat kemungkinan adanya overfitting mengecil. Mudahnya, augmentasi ini mengajarkan model untuk melihat gambar dari sisi yang berbeda.

Adapun hasil augmentasi seperti dibawah ini. Evaluasi menunjukan adanya peningkatan di F1-score secara keseluruhan.

Hasil eksperimen 4.3

Akhirnya …

Percobaan Terakhir, dimana pada percobaan terakhir ini model yang digunakan adalah pretrained model — VGG16 (~13 CNN Layers). Karena memang pada dasarnya banyak struktur CNN yang siap pakai dan sudah dilakukan pretrained sebelumnya menggunakan dataset yang lebih banyak dan beragam. Biasanya pretrained model akan lebih cepat converge ke loss yang minimum dan hasilnya memuaskan. Tapi memang tidak semua kasus bisa diselesaikan dengan pretrained model ini. Selain VGG16, dalam keras terdapat restnet, inception, mobilenet dan lainnya (daftar lengkap disini).

Percobaan terakhir ini menggunakan input 224x224 dengan satu dense layer 8 nodes diakhir karena akan prediksi 8 kelas.

Eksperimen 6: VGG 16

Model 6 ini di training 2 kali :

  1. Menggunakan augmentasi rotation range = 75 → Early stopping di 22 Epoch (42 detik per epoch di Google Colab).
  2. Lanjut Training (transfer learning dari sebelumnya), dengan augmentasi rotation range = 90 dan horizontal_flip=True. → Early stopping juga di 22 Epoch (42 detik per epoch di Google Colab).
Perbandingan hasil Model 6

Hasil diatas menunjukan augmentasi bisa berperan penting dalam meningkatkan akurasi model. Namun di kasus ini, augmentasi sepertinya sangat berpengaruh pada dataset validation. Disini terlihat bahwa dataset validasi dan test tidak terlalu memiliki sifat yang sama, yang mana seharusnya validasi bisa menjadi tolak ukur evaluasi test.

Prediksi VGG16 disini lebih baik dari model-model sebelumnya juga karena inputnya yg lebih besar (224 x 224) dan layer CNN-nya yang lebih tebal. Berikut Classification Report untuk Test menggunakan VGG16 ini :

Classification Report test VGG16

Evaluasi lebih mendalam

Kurang rasanya jika Classification tanpa Confusion Matrix. Berikut adalah confusion matrix dari hasil prediksi untuk data test yang pastinya belum dilihat oleh model sebelumnya — dengan akurasi 94%. Ada 10 gambar yang missclass dari 160 gambar yang ada di data test.

Confusion Matrix: Test Dataset

Seperti yang di duga diawal, model masih terbolak balik antara kue lumpur (label 4) dan serabi (label 7). Disini ada 3 gambar serabi yang di duga sebagai kue lumpur. Ditambah lagi False Positive dari kue lumpur (label 4) juga cukup tinggi yang membuat label ini memiliki Precision terendah dari yang lain — bisa dilihat di Classification Report diatas. Bagusnya, missclassification di kasus ini terkadang masih bisa diindikasi dengan tingkat kepercayaan (Confidence Level) yang rendah.

missclass: kue serabi vs kue lumpur

Hasil lain yang sesuai dengan dugaan diawal adalah kue lapis (label 3) menjadi label yang nilai evaluasinya paling bagus. Terlihat dari confusion matrixnya, tidak ada satupun False Negative atau False Positive dari kue ini (akurasi, precision dan recall 100% — lihat di Classification Report diatas). Hal ini terjadi karena memang bentuk kue lapis ini yang paling unik dari kue-kue lainnya. Selanjutnya, kue Klepon (label 2) memiliki tingkat akurasi terbaik kedua karena memang bentuknya yg selalu hijau dan bulat.

Analisa terakhir yang bisa dilihat adalah Tingkat Kepercayaan (Confidence Level) dari prediksi si Model. Pada kasus missclasification diatas ditunjukan beberapa prediksi mempunyai kepercayaan yang rendah. Artinya, jika sebuah prediksi tidak melebihi suatu Batas (treshold) biasanya prediksinya kurang memuaskan dan bisa di label sebagai “undefined. Terkadang, Tingkat Kepercayaan ini menjadi rendah dikarenakan adanya noise digambar. Contohnya adanya tulisan atau warna yang agak blur, di kasus ini contohnya adalah Dadar Gulung Polkadot dibawah yang memiliki Tingkat Kepercayaan 0.883.

Good Classification Results

Catatan Akhir

Klasifikasi Gambar dengan kelas yang banyak memang penuh tantangan, karena harus bisa mengetahui secara garis besar karakteristik setiap kelasnya. Ditambah lagi terkadang ada kelas-kelas yang punya performa kurang baik dari yang lainnya, karena ada kelas yang mirip-mirip seperti kasus kue-kue diatas. Berikut beberapa poin yang bisa jadi perhatian saat melakukan pemodelan ini :

  1. Selalu mulai dengan struktur CNN yang kecil.
  2. Percobaan pertama tidak selalu akan baik.
  3. Jangan Takut menggunakan Google Colab untuk eksperimentasi. Karena training gambar memang membutuhkan resource cukup besar.
  4. Untuk Gambar, coba lakukan augmentasi.
  5. Usahakan Data Test dan Data Validation memiliki sifat yang sama.
  6. Deepdive ke deskripsi setiap kelasnya dan evaluasi lebih dalam untuk yang missclassification.
  7. Pemodelan Tidak selalu mulai dari nol. Ada pretrained model yang bisa digunakan.
  8. Disarankan untuk ada kelas “Undefined” atau “bukan kue” agar model belajar lebih baik lagi.

Reference

--

--

A place to share and learn about anything related to Data Science curated by Data Science Indonesia members for Data Science People.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store