Tutorial Membuat Image Processing deteksi objek baju menggunakan python dan Google Collab from scratch | by didin nur yahya | Apr, 2024


Halo. Kembali lagi dengan saya didin nur yahya. Pada kali ini saya akan menjelaskan tutorial cara membuat Image Processing deteksi objek menggunakan. Tools yang digunakan yaitu menggunakan Jupyter notebook / Google Collab untuk menjalankan program. Hasil output finalnya yaitu berupa data modelling yang bisa diproses menjadi API dll.

Tahap pertama yaitu dengan membuka laman https://colab.research.google.com/ . Lalu setelah muncul pop up klik New Notebook seperti ini

Setelah itu akan muncul Page notebook. Tahap selanjutnya dengan menginstall package tensorflow , opencv-python, matplotlib pada notebook

!pip install tensorflow opencv-python matplotlib

Setelah install package lalu masukan kode ini untuk swithcing pemrosesan dr CPU based ke GPU based

import tensorflow as tf
import os

# Avoid OOM errors by setting GPU Memory Consumption Growth
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)

tf.config.list_physical_devices('GPU')

Masing masing code dijalankan dengan menekan klik run cell pada notebook atau bisa klik menu Runtime -> Run All

Sebelumnya ke tahap selanjutnya untuk memproses image processing harus menyiapkan datasetnya. Pada Tutorial kali ini saya sudah menyiapkan dataset di laman github https://github.com/dzoxploit/image-classification-baju/tree/main/data .Setelah di download Datasetnya diupload jadi seperti ini susunannya

Setelah itu masukan kode ini untuk Menghapus Bagian Dodge Images yang artinya image yang diproses hanya extension tertentu saja yang bisa dijalankan

import cv2
import imghdr
data_dir = 'data' 
image_exts = ['jpeg','jpg', 'bmp', 'png']
for image_class in os.listdir(data_dir): 
for image in os.listdir(os.path.join(data_dir, image_class)):
image_path = os.path.join(data_dir, image_class, image)
try:
img = cv2.imread(image_path)
tip = imghdr.what(image_path)
if tip not in image_exts:
print('Image not in ext list {}'.format(image_path))
os.remove(image_path)
except Exception as e:
print('Issue with image {}'.format(image_path))
# os.remove(image_path)

Setelah dijalankan tahap selanjutnya yaitu load data untuk mengukur rasio gambar yang ada agar bisa diproses menggunakan package keras

import numpy as np
from matplotlib import pyplot as plt
data = tf.keras.utils.image_dataset_from_directory('data')
data_iterator = data.as_numpy_iterator()
batch = data_iterator.next()
fig, ax = plt.subplots(ncols=4, figsize=(20,20))
for idx, img in enumerate(batch[0][:4]):
ax[idx].imshow(img.astype(int))
ax[idx].title.set_text(batch[1][idx])

Penjelasan dari kode diatas yaitu data tensorflow keras mengambil datasets dari folder data . Fungsi data.as_numpy_iterator() digunakan dalam TensorFlow untuk membuat iterator yang menghasilkan batch data dalam bentuk numpy arrays. Hal ini berguna ketika ingin menggunakan data dari sebuah dataset TensorFlow dalam kode yang menggunakan operasi numpy, atau jika Anda ingin mengakses data secara langsung dalam bentuk array numpy untuk keperluan lainnya. Dengan menggunakan iterator ini, Anda dapat dengan mudah mengakses batch data dalam bentuk array numpy dan memprosesnya sesuai kebutuhan agar beban kerja dari tensorflow tidak berat di satu proses melainkan dibagikan beberapa batch.

Kode ini mengambil batch pertama dari iterator data (data_iterator) yang telah dibuat sebelumnya. Setiap batch terdiri dari pasangan data gambar dan labelnya. Kemudian, kode tersebut membuat sebuah subplot dengan 4 kolom dan ukuran figur 20×20.

Untuk setiap gambar dalam batch pertama (batch[0][:4]), kode tersebut menampilkan gambar menggunakan imshow dari matplotlib dan menetapkan judul berupa label yang sesuai dari batch[1][idx].Jadi, secara keseluruhan, kode ini mengambil batch pertama dari data, menampilkan empat gambar pertama beserta labelnya dalam sebuah subplot.

Setelah dijalankan output yang dihasilkan adalah seperti gambar dibawah ini

Pada tahap selanjutnya yaitu membuat scale data untuk menskalasi gambar sebelum dilalukan process modelling

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

Kode ini merupakan bagian dari pra-pemrosesan data dalam TensorFlow.

Pertama, kode tersebut menggunakan metode map pada objek dataset data. Metode map ini menerapkan sebuah fungsi lambda pada setiap elemen dataset. Di sini, fungsi lambda tersebut mengambil dua argumen, x dan y, yang mewakili gambar dan labelnya. Fungsi lambda ini mengembalikan tuple (x/255, y), yang berarti gambar akan dibagi dengan 255. Ini adalah tahap normalisasi di mana intensitas piksel dalam gambar dikonversi ke rentang [0, 1] dengan membaginya dengan 255.

Kemudian, setelah pemetaan dilakukan, kode tersebut mengambil batch pertama dari dataset yang telah diubah dengan menggunakan metode as_numpy_iterator().next().

Pada tahap selanjutnya yaitu split data. Split data bertujuan untuk membagi dataset data menjadi tiga subset: data pelatihan (train), data validasi (val), dan data pengujian (test).

  1. train_size, val_size, dan test_size dihitung sebagai persentase dari panjang total dataset. Di sini, 70% data dialokasikan untuk pelatihan, 20% untuk validasi, dan 10% untuk pengujian.
  2. Kemudian, kode tersebut membuat variabel train, val, dan test.
  • train diambil dari awal dataset menggunakan metode take(train_size), sehingga menyertakan 70% pertama dari dataset.
  • val diambil setelah train dengan menggunakan metode skip(train_size) untuk melewati bagian data pelatihan, dan kemudian menggunakan take(val_size) untuk mengambil 20% data selanjutnya sebagai data validasi.
  • test diambil setelah train dan val dengan menggunakan metode skip(train_size + val_size) untuk melewati bagian data pelatihan dan validasi, dan kemudian menggunakan take(test_size) untuk mengambil 10% data terakhir sebagai data pengujian.
train_size = int(len(data)*.7)
val_size = int(len(data)*.2)
test_size = int(len(data)*.1)
train_size
train = data.take(train_size)
val = data.skip(train_size).take(val_size)
test = data.skip(train_size+val_size).take(test_size)

Tahap Selanjutnya yaitu Build Deep Learning dengan beberapa tahapan berikut ini:

  1. Impor Modul dan Klassen: Pertama-tama, kita mengimpor modul yang diperlukan dari TensorFlow dan Keras.
from tensorflow.keras.models 
import Sequential from tensorflow.keras.layers
import Conv2D, MaxPooling2D, Dense, Flatten, Dropout

2. Inisialisasi Model: Model sequential dibuat dengan memanggil Sequential().

model = Sequential()

3. Tambahkan Layer-layer: Berikutnya, kita menambahkan layer-layer ke dalam model. Model ini memiliki beberapa jenis layer:

  • Conv2D: Layer konvolusi dengan 16 filter, ukuran filter (3,3), aktivasi ReLU, dan input shape (256,256,3).
  • MaxPooling2D: Layer max pooling dengan default pool size (2,2).
  • Flatten: Layer untuk meratakan output dari layer sebelumnya menjadi vektor satu dimensi.
  • Dense: Layer fully connected dengan 256 neuron dan aktivasi ReLU.
  • Dense: Layer fully connected dengan 1 neuron dan aktivasi sigmoid (untuk klasifikasi biner).
model.add(Conv2D(16, (3,3), 1, activation='relu', input_shape=(256,256,3)))
model.add(MaxPooling2D()) model.add(Conv2D(32, (3,3), 1, activation='relu'))
model.add(MaxPooling2D()) model.add(Conv2D(16, (3,3), 1, activation='relu'))
model.add(MaxPooling2D()) model.add(Flatten()) model.add(Dense(256, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

4. Compile Model: Setelah menambahkan layer-layer, model dikompilasi dengan optimizer ‘adam’, fungsi loss BinaryCrossentropy (cocok untuk klasifikasi biner), dan metrik ‘accuracy’ untuk diukur selama pelatihan.

model.compile('adam', loss=tf.losses.BinaryCrossentropy(), metrics=['accuracy'])

5. Ringkasan Model: Terakhir, kita mencetak ringkasan model untuk melihat struktur dan parameter yang digunakan dalam model.

model.summary()

Dengan ini, model CNN telah dibuat dan siap untuk dilatih menggunakan data. Arsitektur ini memiliki tiga lapisan konvolusi yang diikuti oleh lapisan-lapisan max pooling untuk mengekstraksi fitur dari gambar, diikuti oleh lapisan-lapisan fully connected untuk klasifikasi akhir.Berikut ini adalah hasil outputnya

Tahap Selanjutnya yaitu training data. Pada Proses ini membutuhkan waktu cukup lama sesuai dengan hardware cpu/gpu yang digunakan semakin banyak data yang di training maka akan lama pemrosesannya

logdir='logs'
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=logdir)
hist = model.fit(train, epochs=20, validation_data=val, callbacks=[tensorboard_callback])

Kode ini bertujuan untuk melatih model neural network yang telah dibuat sebelumnya menggunakan dataset yang telah dipisahkan menjadi data pelatihan (train) dan data validasi (val). Berikut adalah penjelasan singkatnya:

  1. logdir='logs': Ini adalah direktori di mana catatan pelatihan akan disimpan untuk TensorBoard. TensorBoard adalah alat visualisasi yang kuat yang digunakan untuk memantau pelatihan model TensorFlow.
  2. tensorboard_callback: Ini adalah objek callback TensorFlow yang digunakan untuk mengaktifkan TensorBoard. Callback ini akan mencatat metrik pelatihan dan validasi ke dalam direktori yang ditentukan sebelumnya.
  3. hist = model.fit(train, epochs=20, validation_data=val, callbacks=[tensorboard_callback]): Ini adalah bagian utama dari kode di mana model dilatih.
  4. train adalah dataset pelatihan.
  5. epochs=20 menunjukkan bahwa model akan dilatih selama 20 epoch (iterasi melalui seluruh dataset).
  6. validation_data=val menunjukkan dataset validasi yang akan digunakan untuk mengevaluasi performa model selama pelatihan.
  7. callbacks=[tensorboard_callback] menunjukkan bahwa callback TensorBoard akan digunakan selama pelatihan.

Setelah pelatihan selesai, hist akan berisi riwayat pelatihan, yaitu metrik seperti loss dan akurasi selama setiap epoch.

Setelah dilakukan training bisa dilakukan testing dengan memasukan kode dibawah ini

import cv2
img = cv2.imread('image_2.jpg')
plt.imshow(img)
plt.show()

resize = tf.image.resize(img, (256,256))
plt.imshow(resize.numpy().astype(int))
plt.show()

yhat = model.predict(np.expand_dims(resize/255, 0))
yhat
array([[1.]], dtype=float32)
if yhat > 0.5:
print(f'Predicted class is Baju')
else:
print(f'Predicted class is Celana')

Berikut ini adalah hasil akhirnya

Untuk Menyimpan hasil modelling bisa menambahkan kode dibawah ini

from tensorflow.keras.models import load_model
model.save(os.path.join('models','imageclassifier.h5'))
new_model = load_model('models/imageclassifier.h5imageclassifier.h5')

Dari tutorial ini anda bisa mengakses github saya di https://github.com/dzoxploit/image-classification-baju/

Jika ada pertanyaan bisa dituliskan dikolom komentar atas perhatianya saya ucapkan terima kasih dan sampai bertemu di tutorial berikutnya.

My Linkedin : https://www.linkedin.com/in/didin-nur-yahya-63772512b/

My Website : https://didinnuryahya.vercel.app/



Source link

Be the first to comment

Leave a Reply

Your email address will not be published.


*