Face Expression Recognizer
PART #01: INTRODUCTION
Di project kali ini kita akan membuat model klasifikasi untuk membedakan ekspresi wajah dan mengimplementasikannya ke data realtime. Project kali ini kita akan Kembali menggunakan dataset berupa gambar, lebih tepatnya gambar wajah manusia. Facial expression recognition adalah teknologi yang menggunakan gesture pada biometric untuk mendeteksi emosi pada manusia. Emosi yang dideteksi dalam project ini diantaranya happiness, sadness, anger, surprise, fear, dan disgust. Dengan facial expression kita bisa mengetahui secara tersirat kondisi dari orang tersebut. Ibaratnya, kita bisa tau kondisinya apakah lagi bahagia, sedih, depresi, dan lain sebagainya.
PART #02: LOAD DATASET
Untuk datasetnya sendiri bisa di download melalui link dropbox dengan cara seperti dibawah ini:
Kalau sudah jangan lupa di unzip supaya datanya bisa terbaca.
Setelah di unzip, maka kalian akan menemukan 2 folder baru yaitu ‘train’ dan ‘test’. Selanjutnya silakan import library “Path” agar kita bisa mengakses isi dari masing — masing folder ‘train’ dan ‘test’. Selanjutnya kita import library yang diperlukan dalam project ini dan kita pathlib untuk folder ‘train’ dan ‘test’.
PART #03: DATA PREPROCESSING
Kita coba ambil sampel dari folder ‘train’ dan bisa kalian lihat isi dari datasetnya berupa gambar dengan format .jpg. Selanjutnya kita ambil label dari masing — masing gambar yang mewakili. Kalau kalian perhatikan, labelnya adalah nama folder sebelum file gambarnya (lihat gambar ‘hasil cek label gambar’). Untuk mengambil labelnya, silakan buat fungsi seperti gambar dibawah. Oh ya, hasilnya mungkin akan berbeda — beda setiap kali kalian jalankan scriptnya, tapi itu ga jadi masalah selama scriptnya tetap berjalan.
Setelah kita tahu labelnya, langsung kita konversi labelnya menjadi angka dengan menggunakan LabelEncoder. Hal ini dilakukan karena deep learning tidak bisa memproses atau membaca label yang berbentuk string.
Setelah kalian jalankan script diatas, maka hasilnya akan menunjukkan angka yang mewakili masing — masing label. Karena kita memiliki 7 label dan perhitungan dimulai dari angka 0. Maka hasil dari label encodernya kurang lebih seperti ini:
· Angry: 0
· Disgust: 1
· Fear: 2
· Happy: 3
· Neutral: 4
· Sad: 5
· Surprise: 6
Selanjutnya adalah Langkah opsional, Dimana kalian bisa melihat urutan dari label tersebut. Silakan diketik code pada gambar dibawah untuk menjalankannya.
Karena dataset ini tidak memiliki validation data, selanjutnya kita bagi training datanya agar Sebagian bisa digunakan untuk validation data. Disini saya ambil sebanyak 25% (0.25) untuk validation datanya.
Oh ya, karena project ini kategorinya multi-class classifier, kita lakukan pengecekan untuk imbalance classnya. Hal ini bertujuan untuk melihat apakah ada kelas yang terlalu dominan dari kelas yang lainnya. Caranya, kita hitung weight dari setiap kelas yang ada. Silakan tulis script dibawah ini untuk lebih jelasnya.
Seperti yang terlihat pada gambar, class 1 memiliki weight yang cukup jauh dari class yang lainnya. Disini kita tidak akan membahas cara mengatasi imbalance dataset terlebih dahulu, melainkan langsung berfokus pada tujuan project yaitu face expression recognizer. Jadi untuk tahapan data preprocessing cukup sampai disini. Selanjutnya kita akan masuk ke bagian pembuatan model.
PART #04: CREATE MODEL
Pertama — tama, silakan buat fungsi yang membagi image dengan label dengan mengetik kode pada gambar dibawah.
Baris ke-4 berfungsi untuk membaca file image, kemudian baris ke-5 berfungsi untuk mendecode image tersebut ke 3 channels yaitu RGB (Red, Green, Blue).
selanjutnya kita lakukan proses data augmentation dimulai dengan mendefinisikan ukuran gambar (IMG_SIZE) dan ukuran batchnya (BATCH_SIZE). Selanjutnya kita masukkan kedua ukuran tersebut kedalam sequential object. Sebagai catatan, ukuran gambar dataset ini adalah 48 x 48 pixels. Dimana ukuran ini sangat kecil. Maka dari itu ukuran gambarnya saya naikkan menjadi 96 pixels. Oh ya untuk naiknya sendiri disarankan untuk tidak terlalu tinggi guna menghindari adanya noise pada gambar.
Setelah itu kita buat perintah untuk menjalankan augmentationnya. Augmentation yang akan saya jalankan adalah RandomFlip, RandomRotation, dan RandomZoom. Untuk konfigurasi lebih jelasnya silakan ketik code dibawah ini.
Setelah selesai, kita lanjutkan membuat fungsi untuk membuat tensorflow data object. Silakan ketik dulu code dibawah.
Baris ke-5 dan ke-6 bertujuan untuk mengkonversi path gambar dan label ke bentuk tensor. Selanjutnya hasil konversinya kita gabungkan dengan perintah “zip” (baris ke 11) agar dapat melakukan iterasi sekaligus.
Selanjutnya kita load image & labelnya sekaligus di resize dengan script pada baris ke 13 & 14. Setelah itu kita acak datanya dan bagi ke dalam batch. (Baris 15 & 16). Kemudian kita bisa lanjut menampilkan shape dari gambar dan label yang sudah kita buat sebelumnya dengan script dibawah ini.
Berdasarkan script diatas, shape dari gambar mewakili batch size (32), ukuran gambar (96 x 96), dan warna RGB (3). Sedangkan shape dari label mewakili batch size (32) dan jumlah label (7). Selanjutnya kita bisa melihat sampel dari gambar tersebut dengan script dibawah ini.
Saat saya jalankan scriptnya, gambar yang muncul adalah gambar dari label “happy”. Tampilan ini mungkin akan berbeda dengan saat kalian jalankan scriptnya. Tapi ga masalah, asalkan scriptnya jalan itu berarti masih aman. Oke, langkah selanjutnya kita lakukan hal yang sama untuk validation data yaitu melihat shape dari gambar dan labelnya.
Dan terlihat bahwa shape dari validation data sama dengan training data. Sekarang kita akan masuk ke tahap berikutnya yaitu pembuatan modelnya. Disini kita akan menggunakan EfficientNet sebagai pre-trained modelnya. EfficientNet sendiri adalah salah satu pre-trained model CNN yang dikembangkan oleh Google pada tahun 2019. EfficientNet termasuk salah satu teknik transfer learning yang dikhususkan untuk pengenalan objek atau klasifikasi gambar. Untuk penggunaannya silakan ketik script dibawah ini.
Dikarenakan target dari project ini adalah multi class classification, maka activation yang kita gunakan adalah softmax. Langkah selanjutnya, kita compile model tersebut dengan menambahkan optimizer ‘Adam’ dengan learning rate=0,001, beta_1=0,9. Untuk epochsnya disini saya set 10, jika kalian ingin berbeda silakan menyesuaikan.
Selanjutnya kita nonaktifkan pretrained model kita yang berada di layer 0 untuk menghindari adanya overfitting. Dilanjutkan dengan pembuatan callbacks berupa checkpoint untuk menyimpan model terbaik selama proses training dan juga menambahkan early stopping agar proses training berhenti ketika model mulai overfitting. Patience kita set 4 yang artinya jika 4 epochs berturut — turut tidak ada perkembangan maka proses training akan berhenti.
Selanjutnya kita training lagi namun kali ini dengan menambahkan callbacks yang telah kita buat sebelumnya.
Setelah dijalankan, kita dapatkan hasilnya kurang lebih seperti ini:
· Accuracy: 0.6
· Precision: 0.7
· Recall: 0.5
· Val Accuracy: 0.6
· Val Precisiion: 0.7
· Val Recall: 0.5
Nah, selanjutnya kita masuk ke tahap evaluasi modelnya untuk mengetahui bagaimana performa model kita.
PART #05: EVALUATE MODEL
Kita akan membuat dataset object untuk menampung data — data yang kita gunakan dalam pengujian. Silakan tulis script di bawah ini.
Penjelasan dari line of codenya adalah sebagai berikut:
· Baris ke 3–5 adalah code untuk mengambil path directory testing dataset kita, lalu mengkonversinya ke bentuk string dan mengambil labelnya.
· Baris ke 7 adalah code untuk mentransform labelnya menjadi bentuk integer.
· Baris ke 8 adalah code untuk mengencode labelnya.
· Baris ke 10–11 adalah proses untuk mengkonversi datasetnya menjadi bentuk tensor.
· Baris 13–17 adalah pembuatan fungsi untuk mengambil gambarnya yang selanjutnya kita resize dengan resolusi 96x96.
· Baris 19–23 adalah pembuatan test dataset yang sumbernya kita ambil dari path data testing yang sudah kita deklarasikan sebelumnya.
Selanjutnya mari kita lihat test dataset yang sudah kita buat dengan script dibawah ini.
Test dataset kita memiliki shape yang sama dengan train dataset yaitu 32 untuk batch size, ukuran gambar 96x96, dan 3 channel. Selanjutnya kita bisa lihat sample dari validation image yang kita miliki dengan script dibawah ini.
Saat saya running scriptnya gambar yang ditampilkan adalah gambar dengan label ‘fear’, mungkin akan berbeda dengan milik kalian tapi ga masalah selama scriptnya tidak menampilkan pesan error. Next, kita akan evaluasi modelnya untuk mengetahui nilai akurasi, presisi dan recall dari test dataset.
Berdasarkan hasilnya, kita bisa lihat nilai akurasi, presisi, dan recall yang didapatkan pada test dataset hampir sama dengan nilai yang didapat saat proses training. Disini kita bisa bilang bahwa model yang kita buat cukup optimal dalam memprediksi ekspresi wajah walaupun dengan kondisi dataset kita yang imbalance. Langkah terakhir silakan di ketik script dibawah ini untuk menyimpan modelnya.