Riko Okananta
Proyek ini bertujuan untuk mengimplementasikan dan melatih model Wasserstein Deep Convolutional Generative Adversarial Network (WDCGAN) guna menghasilkan gambar wajah manusia yang realistis dari dataset yang tidak berlabel. Dengan memanfaatkan kekuatan arsitektur GAN yang ditingkatkan dengan kritik Wasserstein, proyek ini berfokus pada stabilitas pelatihan dan kualitas gambar hasil generasi. Dataset yang digunakan terdiri dari lebih dari 220 gambar wajah manusia dari berbagai ekspresi dan kondisi pencahayaan, yang diproses dan dinormalisasi untuk memastikan kinerja optimal selama pelatihan. Tujuan akhir proyek ini adalah menghasilkan gambar wajah manusia yang realistis, yang dapat digunakan untuk berbagai aplikasi seperti augmentasi data, animasi, dan pengembangan teknologi pengenalan wajah.
IMPLEMENTATION OF W-DCGANS FOR GENERATING HUMAN FACE IMAGES USING PYTORCH
Deskripsi Proyek
Generative Adversarial Networks (GANs) merupakan salah satu generative model yang sangat populer untuk tugas Image Generation. Dengan dua buah model dasar pembangun yakni model Generator dan Discriminator yang saling bersaing dengan model Generator menghasilkan gambar sintetis dan discriminator bertugas membedakan antara gambar asli dan gambar palsu hasil dari generator, sehingga akan secara konvergen akan dihasilkan gambar sintetis yang semakin mirip dengan gambar asli. Proses Training seperti ini disebut dengan Adversarial Training, dan karena dibangun diatas arsitektur Neural Networks maka akhirnya model ini bernama Generative Adversarial Networks (GANs).
Dalam GANs sendiri ada beberapa pengembangan arsitektur model yang cukup banyak dan variatif, salah satunya adalah Wesserstein Deep Convolustional Generative Adversarial Training (WDCGANs). Arsitektur ini mengadopsi layer konvolusi pada model CNN dan Wesserstein loss sebagai loss functionnya. Menghasilkan model yang sangat kuat untuk kasus Computer Vision khususnya Image Generation.
Pada project kali ini, saya mencoba mengaplikasikan model WDCGANs untuk menghasilkan gambar wajah manusia dengan menggunakan Pytorch. PyTorch adalah pustaka tensor deep learning yang dioptimalkan berdasarkan Python dan Torch. Library ini utamanya digunakan untuk aplikasi yang menggunakan GPU dan CPU. Ia cenderung lebih disukai daripada framework deep learning lainnya (seperti TensorFlow dan Keras) karena menggunakan grafik komputasi dinamis dan sepenuhnya Pythonic.
Dengan menggunakan library ini, ilmuwan, pengembang, dan neural network debugger bisa menjalankan dan menguji bagian dari kode secara real-time. Jadi, user tidak perlu menunggu untuk memeriksa apakah sebagian kode berfungsi atau tidak setelah seluruh kode diimplementasikan.
Tools Proyek
Dalam pengerjaan proyek ini saya menggunakan beberapa tools yang saya siapkan untuk membantu memproses dan melancarkan proyek ini, diantaranya sebagai berikut :
Berikut juga saya cantumkan link pengerjaan proyek saya di Google Colab,
Link Google Colab : https://colab.research.google.com/drive/1BUGBiESoB4CErpyv97I0Wq1xYhDbW4Hw#scrollTo=vthtyMVgD3Oz
Dataset Proyek
Pada Proyek Human Face Generation ini saya menggunakan dataset public yang ada di website Kaggle yang bernama “Gender Detection and Classification – Face Dataset” yang dapat anda akses di link berikut :
https://www.kaggle.com/datasets/trainingdatapro/gender-detection-and-classification-image-dataset
Saya juga telah membuka direktori dataset pada Google Colab saya, berikut susunan direktori yang ada pada dataset tersebut.
Gambar 1 : Directory file of Dataset
Dalam tampilan gambar diatas, terdapat dua folder dan 1file CSV. Folder pertama bernama data test berisi data test gambar wajah berformat jpg yang terbagi menjadi dua subfolder Man dan Women, begitu juga dengan folder train yang sama dengan folder test. Lalu juga ada file CSV yang berisi data nama directori file, gender dan kategori train/split. Namun dalam proyek ini saya menggunakan data pada folder train untuk training model W-DCGANs pada proyek ini.
Langkah - Langkah Penyelesaian Proyek
Import Library
Dalam menyelesaikan sebuah proyek tertentu akan lebih mudah jika menggunakan beberapa library yang relevan dengan apa yang akan kita selesaikan daripada coding dari awal secara scratch. Bahkan cara semacam itu sudah tidak relevan lagi untuk digunakan pada industry sekarang ini. Untuk proyek Image generation dengan W-DCGANs ini saya membutuhkan beberapa library untuk membantu pengerjaan saya menjadi lebih efektif dan efisien, diantaranya sebagai berikut :
Gambar 2 : Importing Necessary Library
Download and Preparing Dataset
Dataset merupakan sember daya yang paling utama untuk melatih model apapun, atau ingin mengolah data apapun, pada proyek ini saya menggunakan dataset “Gender Detection dan Classification : Face Dataset” dari website Kaggle, dan berikut cara saya mendownload dan menyiapkannya pada Google Colab saya :
Gambar 3 : Download and Unzip file Dataset
Pada gambar diatas, saya menggunakan perintah Kaggle API untuk mendownload dataset langsung dari web Kaggle ke Google colab saya. Kemudian setelah terunduh dengan sempurna file .zip tersebut akan di extract menggunakan perintah Unzip pada kolom cell Google colab, maka semua folder dan file telah terekstrak dengan sempurna dan siap untuk kita gunakan.
Karena kita menggunakan gambar pada folder training untuk melatih model GAN, maka kita coba tampilkan berapa file yang ada dalam folder tersebut dengan bantuan library os, sebagai berikut.
Gambar 4 : Displays the Number of File
Dari gambar tersebut terlihat ternyata ada 110 gambar untuk wajah pria dan ada 110 juga untuk wajah Wanita, artinya total ada 20 data gambar wajah untuk dilakukan training model W-DCGANs, berarti total ada 220 data gambar wajah yang kita gunakan.
Data Preparation
Sebelum masuk ke pelatihan model GANs dengan Pytorch, data gambar yang kita punya harus ditransformasikan kedalam bentuk tensor, yang nantinya akan dapat diproses oleh pytorch, pertama definisikan dulu variable/fungsi transformasi yang kita inginkan, berikut contoh implementasinya.
Gambar 5 : Function to Transformation
Pada gambar kode diatas, saya ingin menerapkan empat proses dalam transformasi nanti, yaitu melakukan perubahan ukuran gambar menjadi 64x64 pixel semua, melakukan cropping gambar yang berpusat dari Tengah dan mengambil gambar selebar 64 pixel, selanjutnya convert ke bentuk tensor, dan terakhir normalisasi nilai tensor, menjadi pada range -1 sd 1. Semua proses itu saya satukan dan simpan dalam variable `transform`. Selanjutnya saya perlu mendefinisikan path dari data training disimpan, sebagai berikut.
Gambar 6 : Define path of data
Selanjutnya dari data_path yang sudah kita deklarasikan sebelumnya, data didalamnya (subdirectory) akan dilakukan proses transformasi, lalu dilanjutkan dengan memasukkan hasil transformasi ke DataLoader dengan ukuran batch_size = 32 dan dengan shuffle=True, artinya gambar akan diambil secara acak setiap iterasi sejumlah 32 gambar. Berikut ini implementasinya dalam proyek ini.
Gambar 7 : Transformation step
Selanjutya kita akan cek apakah, proses transformasi kita berhasil sesuai dengan harapan atau tidak dengan mengeksekusi kode script dibawah ini.
Gambar 8 : Result of Transformation Step
Pada gambar diatas, terlihat bahwa data telah berhasil dikonversi menjadi tensor dengan range data antara -1 s/d 1, walaupun masih kurang sempurna namun sudah sangat mendekati -1 jadi menurut saya masih oke.
Building Model Wesserstain Deep Convlutional Generative Adversarial Networks
Untuk membangun model GANs secara umum, itu ada dua part yang harus dibuat yaitu class untuk Generator berfungsi menghasilkan gambar buatan oleh model, dan class critic atau discriminator untuk membedakan antara gambar hasil dari generator dan gambar asli. Berikut masing masing arsitektur yang saya gunakan dalam proyek ini.
Class Generator
Gambar 9 : Class Generator Architecture
Class Critic/Discriminator
Gambar 10 : Class Critic Architecture
Sebelum masuk proses training Model, kita definisikan terlebih dahulu beberapa hal atau istilahnya configurasinya untuk model kita nanti. Saya sendiri menerapkan konfigurasi model sebagai berikut.
Gambar 11 : Script for Configuration model
Pertama tam akita definisikan device terlebih dahulu untuk melakukan proses komputasi, menggunakan CPU atau GPU, dalam hal ini saya mengutamakan menggunakan GPU namun jika GPU tidak memungkinkan maka CPU akan digunakan. Selanjutnya, saya harus mendefinisikan loss fnction untuk W-DCGANs yaitu Wessertein loss, yang dimana merupakan hasil perkalian dari rata rata output dari model dan rata rata dari data target.
Selanjutnya variable netG merupakan generator yang sudah diberikan parameter dimensi gambar yaitu 100 untuk generate gambar dan mengirimkannya ke device untuk dilakukan proses komputasi, begitu juga dengan netC yang berasal dari class critic. Kemudian kita gunakan Wessertein_loss kita tadi sebagai criterion pada pelatihan model nanti.
Dan yang terakhir mendefinisikan optimizer yang menggunakan RMSprop dengan leraning rate sangat kecil yaitu 0.00005.
Setelah semuanya siap maka akan dilakukan proses pelatihan dengan mengeksekusi kode berikut ini.
Gambar 12 : Script for Training Model WDCGANs
Pada alur pelatihan model diatas, saya menentukan jumlah epoch sebesar 300, kemudian setiap iterasi akan ditampilkan history Critic_loss dan Generator_loss untuk memantau bagaimana perkembangan model dari setiap iterasi dan setiap epoch. Tidak lupa juga untuk setiap epoch kelipatan 50 maka akan dilakukan penyimpanan gambar hasil dari generator untuk dilihat juga sejauh mana kualitas gambar yang dihasilkan setiap beberapa epoch tersebut, selain gambar juga dilakukan penyimpanan model generator dan discriminator dalam format .pth (format model deep learning dari Pytorch) untuk dapat digunakan selanjutnya ke sistem produksi.
Setelah menunggu cukup lama, sekitar -+ 2jam akhirnya proses pelatihan selsai, dan berikut saya tampilkan cuplikan gambar yang dihasilkan oleh generator selama proses pelatihan berlangsung.
Gambar 13 : Script for Display image Result
Gambar 14 : Image Result
Dari hasil akhir pelatihan model WDCGAN sejauh ini, masih cukup perlu untuk ditingkatkan kembali, karena jika kita lihat secara matematis, critic loss sebesar -1.11... dan generator loss sebesar 0.645... itu artinya model masih belum bisa konvergen seiring proses pelatihan, semakin loss mendekati angka 0 satu sama lain maka model akan semakin baik dan kovergen. Selain dari sisi matematis, secara visualpun belum bisa dikatakan baik dengan hasil gambar yang semacam itu.
Mungkin dalam kasus ini, perlu diperbaiki lagi arsitekturnya, parameter - parameter lebih di lakukan riset secara dalam agar memperoleh hasil yang cukup memuaskan.