Laporan Proyek: HappySad ImageClassifier Using CNN - Review Gadget Terbaru Fajar Nugraha Wahyu

Breaking

Fajar Nugraha Wahyu adalah solusi untuk mencari informasi akurat terkini tentang skincare dan teknologi terbaru

Monday, 14 April 2025

Laporan Proyek: HappySad ImageClassifier Using CNN

 

Pendahuluan

Proyek HappySad-ImageClassifier adalah sebuah aplikasi berbasis pembelajaran mesin (machine learning) yang dirancang untuk mengklasifikasikan gambar ke dalam dua kategori: "Happy" (bahagia) dan "Sad" (sedih) . Proyek ini menggunakan framework TensorFlow dan Keras untuk membangun, melatih, dan mengevaluasi model Convolutional Neural Network (CNN).

Tujuan utama proyek ini adalah untuk memperkenalkan konsep dasar pembelajaran mendalam (deep learning) dalam konteks klasifikasi gambar. Dengan dataset yang terdiri dari gambar-gambar wajah manusia dengan ekspresi "Happy" dan "Sad", model ini dapat digunakan untuk memprediksi emosi dari gambar baru.

Dalam laporan ini, kita akan membahas secara rinci:

  1. Tujuan Proyek
  2. Dataset
  3. Arsitektur Model
  4. Implementasi Kode
  5. Pelatihan dan Evaluasi
  6. Kesimpulan dan Peluang Pengembangan

1. Tujuan Proyek

Proyek ini bertujuan untuk:

  • Mengimplementasikan model CNN untuk klasifikasi gambar dua kelas ("Happy" dan "Sad").
  • Memahami alur kerja pembuatan model machine learning, mulai dari persiapan data hingga evaluasi performa.
  • Memberikan pemahaman praktis tentang penggunaan TensorFlow dan Keras dalam memecahkan masalah dunia nyata.

2. Dataset

Dataset yang digunakan dalam proyek ini terdiri dari gambar-gambar wajah manusia dengan ekspresi "Happy" dan "Sad". Dataset ini biasanya disusun dalam folder-folder terpisah berdasarkan kelas:

  • Folder happy/: Berisi gambar-gambar dengan ekspresi bahagia.
  • Folder sad/: Berisi gambar-gambar dengan ekspresi sedih.

Persyaratan Dataset

  • Gambar harus memiliki format yang kompatibel, seperti .jpg atau .png.
  • Dataset dibagi menjadi dua bagian:
    • Training set : Digunakan untuk melatih model.
    • Validation set : Digunakan untuk mengevaluasi performa model selama pelatihan.

Contoh Struktur Folder Dataset

dataset/
├── training/
│ ├── happy/
│ │ ├── img1.jpg
│ │ ├── img2.jpg
│ ├── sad/
│ │ ├── img3.jpg
│ │ ├── img4.jpg
├── validation/
│ ├── happy/
│ │ ├── img5.jpg
│ │ ├── img6.jpg
│ ├── sad/
│ │ ├── img7.jpg
│ │ ├── img8.jpg

3. Arsitektur Model

Model yang digunakan dalam proyek ini adalah Convolutional Neural Network (CNN) . CNN sangat cocok untuk tugas klasifikasi gambar karena kemampuannya dalam mengekstraksi fitur visual dari gambar.

Komponen Utama Model

  1. Conv2D Layer :

    • Menangkap pola lokal seperti tepi, tekstur, dan bentuk.
    • Parameter: Jumlah filter, ukuran kernel (misalnya, 3x3), fungsi aktivasi (biasanya ReLU).
  2. MaxPooling2D Layer :

    • Mengurangi dimensi fitur sambil mempertahankan informasi penting.
    • Parameter: Ukuran pooling (misalnya, 2x2).
  3. Flatten Layer :

    • Mengubah representasi fitur 2D menjadi vektor 1D untuk input ke layer Dense.
  4. Dense Layer :

    • Layer fully connected yang melakukan klasifikasi akhir.
    • Output layer memiliki 2 neuron (untuk kelas "Happy" dan "Sad") dengan fungsi aktivasi softmax.

Contoh Arsitektur CNN

python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),
MaxPooling2D(2, 2),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Conv2D(128, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Flatten(),
Dense(512, activation='relu'),
Dense(2, activation='softmax') # 2 kelas: "Happy" dan "Sad"
])

4. Implementasi Kode

Berikut adalah penjelasan detail tentang kode dalam proyek ini.

1. Impor Library

python
import tensorflow as tf
import cv2
import os
import pandas as pd
import numpy as np
import seaborn as sns
import imghdr
import matplotlib.pyplot as plt
%matplotlib inline

Penjelasan:

  • tensorflow : Digunakan untuk membangun dan melatih model pembelajaran mesin.
  • cv2 (OpenCV) : Digunakan untuk pemrosesan gambar, seperti membaca dan memanipulasi file gambar.
  • os : Digunakan untuk berinteraksi dengan sistem operasi, seperti membaca direktori atau file.
  • pandas : Digunakan untuk manipulasi dan analisis data, terutama dalam format tabel.
  • numpy : Digunakan untuk komputasi numerik, seperti operasi matriks dan array.
  • seaborn dan matplotlib.pyplot : Digunakan untuk visualisasi data.
  • imghdr : Digunakan untuk memeriksa tipe file gambar.
  • %matplotlib inline : Memastikan bahwa grafik ditampilkan langsung di notebook Jupyter.

2. Menghindari Kesalahan Memori GPU

python
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)

Penjelasan:

  • tf.config.experimental.list_physical_devices('GPU') : Mendeteksi perangkat GPU yang tersedia.
  • tf.config.experimental.set_memory_growth(gpu, True) : Mengatur agar TensorFlow hanya menggunakan memori GPU yang diperlukan, bukan semua memori yang tersedia. Ini membantu menghindari kesalahan "Out of Memory" (OOM).

3. Pengaturan Dataset

python
os.listdir('data')
os.path.join('data', 'happy')

Penjelasan:

  • os.listdir('data') : Menampilkan daftar folder atau file dalam direktori data. Dalam kasus ini, outputnya adalah ['happy', 'sad'], yang menunjukkan ada dua kategori: "happy" dan "sad".
  • os.path.join('data', 'happy') : Menggabungkan path direktori dengan nama subdirektori untuk membentuk path lengkap ke folder "happy".

4. Visualisasi Data

python
img = cv2.imread(os.path.join('data//happy', 'smile.woman_.jpg'))
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

Penjelasan:

  • cv2.imread() : Membaca file gambar dari path yang diberikan.
  • cv2.cvtColor(img, cv2.COLOR_BGR2RGB) : Mengonversi warna gambar dari format BGR (default OpenCV) ke RGB (format yang digunakan oleh Matplotlib).
  • plt.imshow() : Menampilkan gambar menggunakan Matplotlib.

5. Pemrosesan Batch Data

python
for batch in test.as_numpy_iterator():
X, y = batch
predictions = model.predict(X)
pre.update_state(y, predictions)
re.update_state(y, predictions)
acc.update_state(y, predictions)

Penjelasan:

  • test.as_numpy_iterator() : Mengiterasi dataset dalam bentuk batch menggunakan TensorFlow.
  • X, y = batch : Memisahkan fitur (X) dan label (y) dari batch.
  • model.predict(X) : Menggunakan model untuk memprediksi output dari input X.
  • pre.update_state(y, predictions) : Memperbarui metrik presisi berdasarkan label sebenarnya (y) dan prediksi.
  • re.update_state(y, predictions) : Memperbarui metrik recall.
  • acc.update_state(y, predictions) : Memperbarui metrik akurasi.

6. Standarisasi Data

python
data = data.map(lambda x, y: (x / 255, y))

Penjelasan:

  • data.map() : Menerapkan fungsi lambda ke setiap elemen dalam dataset.
  • lambda x, y: (x / 255, y) : Normalisasi nilai piksel gambar (x) ke rentang [0, 1] dengan membaginya oleh 255, sementara label (y) tetap tidak berubah.

7. Evaluasi Model

python
losses = pd.DataFrame(history.history)
losses.plot()

Penjelasan:

  • pd.DataFrame(history.history) : Mengonversi riwayat pelatihan model (seperti loss dan akurasi) menjadi DataFrame Pandas.
  • losses.plot() : Memvisualisasikan riwayat pelatihan dalam bentuk grafik.

8. Pengujian Model

python
image = cv2.imread('sadtest2.jpg')
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

Penjelasan:

  • cv2.imread('sadtest2.jpg') : Membaca gambar uji dari file.
  • plt.imshow() : Menampilkan gambar uji.

9. Metrik Evaluasi

python
from tensorflow.keras.metrics import Precision, Recall, BinaryAccuracy
pre = Precision()
re = Recall()
acc = BinaryAccuracy()

Penjelasan:

  • Precision() : Menghitung presisi model.
  • Recall() : Menghitung recall model.
  • BinaryAccuracy() : Menghitung akurasi untuk klasifikasi biner.

10. Pelatihan Model

python
plt.plot(history.history['accuracy'], label='acc')
plt.plot(history.history['val_accuracy'], label='val_acc')
plt.legend()

Penjelasan:

  • history.history['accuracy'] : Mengambil nilai akurasi pelatihan dari riwayat pelatihan.
  • history.history['val_accuracy'] : Mengambil nilai akurasi validasi.
  • plt.plot() : Memplot grafik akurasi pelatihan dan validasi.
  • plt.legend() : Menambahkan legenda ke grafik.

Kesimpulan

Kode ini mencakup proses end-to-end untuk membangun dan mengevaluasi model pembelajaran mesin untuk klasifikasi gambar (kategori "happy" dan "sad"). Prosesnya meliputi:

  1. Pengaturan lingkungan (TensorFlow, GPU, dan library lainnya).
  2. Pemrosesan data (normalisasi, iterasi batch).
  3. Pelatihan model (menggunakan TensorFlow).
  4. Evaluasi model (presisi, recall, akurasi).
  5. Visualisasi hasil (grafik akurasi dan loss).

5. Hasil

Tabel ringkasan arsitektur model sebagai berikut:
Penjelasan Tabel:
  1. Layer (type) : Jenis layer dalam model.

    • InputLayer : Layer input awal dengan ukuran gambar 256x256x3 (3 saluran warna RGB).
    • Conv2D : Layer konvolusi 2D dengan filter berukuran tertentu.
    • MaxPooling2D : Layer pooling maksimum untuk mengurangi dimensi data.
    • Flatten : Layer flatten untuk merubah output menjadi vektor 1D.
    • Dense : Layer terhubung penuh (fully connected layer) untuk klasifikasi akhir.
  2. Output Shape : Ukuran output setiap layer.

    • Misalnya, conv2d_4 memiliki output shape (None, 256, 256, 32) yang menunjukkan bahwa hasil output layer ini adalah tensor dengan dimensi batch x tinggi x lebar x jumlah filter.
  3. Param #: Jumlah Parameter : Jumlah parameter yang harus dilatih di setiap layer.

    • Misalnya, conv2d_4 memiliki 896 parameter.
    • dense_2 memiliki 16,777,728 parameter, yang sangat besar karena ini adalah layer terakhir sebelum output akhir.
  4. Total params : Total jumlah parameter dalam model adalah 17,019,073 , yang setara dengan 64.92 MB .

Model ini adalah model CNN (Convolutional Neural Network) yang dirancang untuk tugas klasifikasi biner. Model ini menggunakan kombinasi layer konvolusi, pooling, dan fully connected layers untuk memproses citra sebagai input dan memberikan prediksi klasifikasi. Model ini memiliki total parameter sebanyak 17 juta, yang menunjukkan kompleksitas model yang cukup tinggi. Optimizer yang digunakan adalah Adam, dan fungsi kerugian adalah binary cross-entropy, yang sesuai untuk masalah klasifikasi dua kelas.




Penjelasan:

  • Judul: Grafik ini menunjukkan perubahan empat metrik selama pelatihan model:

    • accuracy (biru solid): Akurasi pada data latih.
    • loss (orange solid): Loss (error) pada data latih.
    • val_accuracy (hijau solid): Akurasi pada data validasi.
    • val_loss (merah solid): Loss pada data validasi.
  • Keterangan:

    • X-Axis (Absis): Menunjukkan jumlah epoch (iterasi pelatihan).
    • Y-Axis (Ordinat): Nilai akurasi dan loss.
  • Trend:

    • Akurasi (accuracy): Naik secara umum seiring dengan bertambahnya epoch, tetapi ada beberapa fluktuasi kecil.
    • Loss (loss): Turun secara umum seiring dengan bertambahnya epoch, tetapi juga mengalami fluktuasi.
    • Val_Accuracy (val_accuracy): Secara keseluruhan naik, tetapi lebih stabil dibandingkan dengan accuracy. Ada beberapa puncak yang menunjukkan peningkatan akurasi pada data validasi.
    • Val_Loss (val_loss): Turun secara umum, tetapi lebih stabil dibandingkan dengan loss. Ada beberapa puncak yang menunjukkan penurunan loss pada data validasi.
  • Interpretasi:

    • Model tampaknya belajar dengan baik karena akurasi meningkat dan loss menurun. Namun, terdapat beberapa fluktuasi yang mungkin disebabkan oleh kompleksitas data atau variasi dalam setiap epoch.
    • Perbedaan antara metrik pelatihan (accuracy, loss) dan validasi (val_accuracy, val_loss) tidak terlalu besar, yang menunjukkan bahwa model cenderung tidak overfitting. 


Penjelasan:

  • Judul: Grafik ini memfokuskan pada dua metrik utama:

    • loss (biru solid): Loss pada data latih.
    • val_loss (orange solid): Loss pada data validasi.
  • Keterangan:

    • X-Axis (Absis): Jumlah epoch.
    • Y-Axis (Ordinat): Nilai loss.
  • Trend:

    • Loss (loss): Turun secara signifikan saat awal pelatihan, kemudian mulai melambat dan mencapai titik stabil di sekitar nilai 0.05 hingga 0.1.
    • Val_Loss (val_loss): Juga turun pada awal pelatihan, tetapi lebih fluktuatif dibandingkan dengan loss. Setelah beberapa epoch, val_loss cenderung stabil di sekitar nilai 0.1 hingga 0.2.
  • Interpretasi:

    • Kedua kurva menunjukkan tren penurunan loss, yang menandakan bahwa model sedang belajar dengan baik.
    • Fluktuasi pada val_loss adalah hal yang wajar karena data validasi biasanya lebih variabel daripada data latih.
    • Tidak ada tanda-tanda overfitting yang jelas karena val_loss tidak meningkat secara signifikan meskipun loss terus menurun.


Penjelasan:

  • Judul: Grafik ini memfokuskan pada dua metrik akurasi:

    • accuracy (biru solid): Akurasi pada data latih.
    • val_accuracy (orange solid): Akurasi pada data validasi.
  • Keterangan:

    • X-Axis (Absis): Jumlah epoch.
    • Y-Axis (Ordinat): Nilai akurasi.
  • Trend:

    • Akurasi (accuracy): Naik secara signifikan pada awal pelatihan, lalu mencapai kisaran 0.9 hingga 1.0. Terdapat beberapa fluktuasi kecil sepanjang pelatihan.
    • Val_Accuracy (val_accuracy): Juga naik pada awal pelatihan, tetapi lebih stabil dibandingkan dengan accuracy. Kurva ini mencapai kisaran 0.9 hingga 1.0 dan cenderung stabil.
  • Interpretasi:

    • Kedua kurva menunjukkan peningkatan akurasi seiring dengan bertambahnya epoch, yang menandakan bahwa model semakin baik dalam memprediksi data.
    • Meskipun ada beberapa fluktuasi, val_accuracy tetap berada di dekat accuracy, yang menunjukkan bahwa model tidak overfitting.
    • Stabilitas val_accuracy menunjukkan bahwa model memiliki generalisasi yang baik terhadap data yang belum pernah dilihat sebelumnya.

Kesimpulan Umum:

  • Grafik 1: Memberikan gambaran lengkap tentang perubahan akurasi dan loss baik pada data latih maupun validasi.
  • Grafik 2: Fokus pada loss, menunjukkan bahwa model berhasil menurunkan error baik pada data latih maupun validasi tanpa tanda-tanda overfitting yang signifikan.
  • Grafik 3: Fokus pada akurasi, menunjukkan bahwa model semakin akurat seiring dengan bertambahnya epoch, baik pada data latih maupun validasi.

Secara keseluruhan, grafik-grafik ini menunjukkan bahwa model sedang belajar dengan baik, dengan performa yang stabil dan tidak ada indikasi overfitting.


TESTING 1


Hasil



TESTING 2


HASIL 2

TESTING 3


HASIL 3

6. Kesimpulan dan Peluang Pengembangan

Kesimpulan

Proyek HappySad-ImageClassifier berhasil memperkenalkan konsep dasar pembelajaran mesin untuk klasifikasi gambar. Dengan dataset yang terorganisir dan arsitektur CNN yang efektif, model dapat mencapai performa yang baik dalam membedakan antara gambar "Happy" dan "Sad".

Peluang Pengembangan

  1. Ekspansi Dataset :

    • Menambahkan lebih banyak gambar untuk meningkatkan generalisasi model.
    • Mencakup lebih banyak kelas emosi (misalnya, "Angry", "Neutral").
  2. Optimasi Model :

    • Eksperimen dengan arsitektur model yang lebih kompleks (misalnya, ResNet, VGG).
    • Menggunakan teknik transfer learning dengan model pre-trained.
  3. Aplikasi Real-Time :

    • Mengintegrasikan model ke dalam aplikasi web atau mobile untuk deteksi emosi real-time.
  4. Analisis Sentimen :

    • Menggabungkan model ini dengan analisis sentimen teks untuk aplikasi yang lebih holistik.

Penutup

Proyek HappySad-ImageClassifier adalah langkah awal yang sangat baik untuk memahami konsep dasar pembelajaran mesin dan deep learning. Dengan eksperimen lebih lanjut dan pengembangan fitur, proyek ini dapat berkembang menjadi solusi praktis yang bermanfaat dalam berbagai aplikasi dunia nyata.


No comments:

Post a Comment