Face Expression Recognizer

Rizkynindra
8 min readMay 20, 2024

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:

download dataset

Kalau sudah jangan lupa di unzip supaya datanya bisa terbaca.

unzip dataset

Setelah di unzip, maka kalian akan menemukan 2 folder baru yaitu ‘train’ dan ‘test’. Selanjutnya silakan import libraryPath” 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’.

import library
membuat pathlib untuk 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.

ambil label gambar
hasil cek label gambar
script untuk mengambil label

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.

konversi label dengan LabelEncoder

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.

melihat urutan label

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.

split data

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.

pengecekan imbalance dataset

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.

fungsi untuk membagi image dan label

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.

data augmentation

Setelah selesai, kita lanjutkan membuat fungsi untuk membuat tensorflow data object. Silakan ketik dulu code dibawah.

pembuatan tensorflow data object

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.

menampilkan shape dataset

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.

melihat sample gambar
sample gambar ‘happy’

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.

menampilkan shape testing dataset

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.

pembuatan model dengan EfficientNet

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.

compile model
melatih model

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.

nonaktifkan pretrained model

Selanjutnya kita training lagi namun kali ini dengan menambahkan callbacks yang telah kita buat sebelumnya.

training ulang dengan menggunakan callbacks

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.

pembuatan testing set

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.

cek shape test dataset

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.

script cek sample gambar test dataset.
sample gambar ‘fear’

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.

hasil evaluasi model.

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.

simpan model.

--

--