Membuat Model Prediksi Wajah Berdasarkan Umur, Etnis, dan Gender dengan CNN (Intermediate? Masuk!!)

Original article was published by Vebri Satriadi on Artificial Intelligence on Medium


Membuat Model Prediksi Wajah Berdasarkan Umur, Etnis, dan Gender dengan CNN (Intermediate? Masuk!!)

Assalamualaikum, wr. wb.

Sebelum saya menulis ini, jujur saja saya menghela nafas yang cukup panjang, menandakan lega karena laptop saya ternyata masih kuat menangani image processing dengan Deep Learning :’).

Oke, seperti yang telah saya sebutkan, kali ini saya ingin berbagai sedikit pengetahuan saya tentang pemrosesan gambar. Tulisan ini saya tujukan bagi yang telah memelajari Deep Learning secara Intermediate. Hal tersebut muncul karena saya berpikir sudah suangaatt banyak tutorial Deep Learning untuk pemula. Di luar sana saya juga yakin setelah melewati tahap Beginner, para pemula tidak tahu akan melangkah seperti apa lagi ke depannya.

Pendahuluan

Kali ini, seperti story sebelumnya, saya mengambil dataset dari Kaggle, yang merupakan rumah bagi para Data Scientist di seluruh dunia. Dataset yang saya ambil adalah data gambar yang terdiri dari wajah-wajah berbagai macam orang seperti pada Gambar 1.

Gambar 1. Wajah orang-orang dalam dataset.

Dalam pembuatan model prediksi kali ini, seperti biasa, saya menggunakan Python sebagai bahasa pemrograman dengan libraries sebagai berikut:

  1. Numpy untuk perhitungan Aljabar Linier.
  2. Pandas untuk manipulasi dataframe.
  3. Tensorflow untuk develop, train, test, dan evaluasi model prediksi.
  4. Matplotlib dan Plotly untuk visualisasi data dan perhitungan.
  5. Sklearn untuk splitting train dan test set.

Selanjutnya, kita bedah lagi dataframe yang telah saya olah.

Gambar 2. Dataset yang telah diolah.

Di sini, terdapat tiga kategori wajah yakni umur, etnis, dan gender. Untuk umur, rentang nilainya antara umur satu tahun hingga 93 tahun. Etnis terdapat lima nilai, dan gender tentu saja terdapat dua. Namun, sayang sekali, dalam dataset ini tidak disebutkan secara jelas maksud dari angka-angka etnis maupun gender. Kita hanya tahu bahwa nilai-nilai tersebut berbeda. Kita nanti coba melihat distribusi data kategorinya.

Selanjutnya,, terdapat ‘img_name’ yang merupakan file gambar dan terdapat ‘pixels’ yakni hasil konversi matriks dari gambar-gambar dalam dataset. Hal tersebut perlu dikonversi perhitungan prediksi memerlukan data berupa array matriks, bukan gambar. Terakhir, terdapat 23.705 data gambar yang akan diproses.

Data Eksplorasi

Kini, kita lihat distribusi nilai dari masing-masing kategori.

Gambar 3. Distribusi nilai pada kategori umur.

Pada kategori umur, nilai terpusat pada rentang umur 20–40 tahun. Sementara itu, rentang nilainya antara 1 hingga 100 tahun. Modus pada kategori ini terletak pada umur 26 tahun.

Gambar 4. Distribusi nilai pada kategori etnis.

Pada kategori etnis, nilai terbanyak jatuh pada kategori 0 dengan frekuensi kemunculan dalam dataset sebanyak 10.078 kali.

Gambar 5. Distribusi nilai pada kategori gender.

Dalam kategori gender, wajah yang bergender laki-laki lebih banyak daripada perempuan dengan masing-masing kemunculan 12.391 kali untuk laki-laki, dan 11.314 kali untuk perempuan.

Setelah semua features dan data siap digunakan, kita dapat membuat model prediksi menggunakan Convolutional Neural Network (CNN). CNN memang cocok digunakan untuk pemrosesan dan prediksi gambar.

Membuat Model Prediksi

Sebelumnya, telah saya bagi antara test set dan train set dengan rasio 0,22 untuk test set dan sisanya untuk train set.

a. Model Prediksi untuk kategori gender

model = tf.keras.Sequential([
L.InputLayer(input_shape=(48,48,1)),
L.Conv2D(32, (3, 3), activation=’relu’, input_shape=(32, 32, 3)),
L.BatchNormalization(),
L.MaxPooling2D((2, 2)),
L.Conv2D(64, (3, 3), activation=’relu’),
L.MaxPooling2D((2, 2)),
L.Flatten(),
L.Dense(64, activation=’relu’),
L.Dropout(rate=0.5),
L.Dense(1, activation=’sigmoid’)
])
model.compile(optimizer=’sgd’,
loss=tf.keras.losses.BinaryCrossentropy(),
metrics=[‘accuracy’])

Model saya rancang dengan model seperti code di atas. Pastikan kalian sudah paham mengenai fungsi aktivasi, Dense Layer, Dropout Layer, dan lain-lain. Sementara itu, Deep Learning akan kita jalankan dengan sebanyak 20 epoch. Proses training saya hentikan otomatis ketika nilai Validation Loss telah mencapai di bawah 0,27. Terdapat 9 layer dalam model yang dibuat kali ini. Kira-kira seperti ini ringkasan develop modelnya.

Gambar 6. Ringkasan model CNN untuk kategori gender

Kemudian, kita bisa melihat hasil evaluasi training model. Pada data yang tersaji dalam Gambar 7, terlihat bahwa nilai dari loss dan validation loss model rata-rata menurun per epoch. Ini merupakan salah satu indikator model yang fitting (saya harap kalian sudah paham dengan overfitting dan underfitting) dengan data-data yang akan digunakan ke depan.

Gambar 7. Grafik hasil evaluasi

Pada akhir sesi training model dan coba testing model dengan data testing, kita mendapatkan nilai 0.26 untuk test loss dan 0.89 untuk test accuracy.

Setelah kita mengetahui bahwa model kita layak digunakan (fitting), langkah selanjutnya adalah menyimpan model tersebut untuk digunakan ke depannya (bisa jadi deploy ke aplikasi yang akan digunakan). Akan saya namai dengan ‘gender_model’.

model.save(‘gender_model’)

UNTUK KATEGORI ETNIS SAMA UMUR MENYUSUL YAA.

Tapi prosesnya sebenarnya hampir sama kok dengan yang di atas, cuma nanti mungkin terdapat perbedaan di setting modelnya. Entah itu jumlah layer, jenis layer, fungsi aktivasi, dll. Nanti akan saya sertakan source codenya waktu udah kelar semuanya ya.