{ "cells": [ { "cell_type": "markdown", "id": "c201ca37", "metadata": {}, "source": [ "# Basic Image Classification (CNN)\n", "\n", "Notebook ini berisi contoh paling dasar untuk klasifikasi gambar menggunakan TensorFlow/Keras.\n", "\n", "## Ide tugas klasifikasi\n", "1. Klasifikasi wireframe: `login`, `dashboard`, `product`, `form`, `table`.\n", "2. Klasifikasi style desain: `clean`, `dense`, `minimal`, `complex`.\n", "3. Klasifikasi tipe komponen dominan: `card-heavy`, `table-heavy`, `form-heavy`.\n", "\n", "Struktur dataset yang disarankan:\n", "\n", "```text\n", "my_dataset/\n", " train/\n", " class_a/\n", " class_b/\n", " class_c/\n", " val/\n", " class_a/\n", " class_b/\n", " class_c/\n", "```" ] }, { "cell_type": "code", "execution_count": null, "id": "6067a559", "metadata": {}, "outputs": [], "source": [ "import tensorflow as tf\n", "from tensorflow.keras import layers, models\n", "\n", "# Ubah sesuai lokasi dataset Anda\n", "data_dir_train = \"./my_dataset/train\"\n", "data_dir_val = \"./my_dataset/val\"\n", "\n", "img_size = (128, 128)\n", "batch_size = 32\n", "\n", "train_ds = tf.keras.utils.image_dataset_from_directory(\n", " data_dir_train,\n", " image_size=img_size,\n", " batch_size=batch_size,\n", " label_mode=\"int\"\n", ")\n", "\n", "val_ds = tf.keras.utils.image_dataset_from_directory(\n", " data_dir_val,\n", " image_size=img_size,\n", " batch_size=batch_size,\n", " label_mode=\"int\"\n", ")\n", "\n", "class_names = train_ds.class_names\n", "num_classes = len(class_names)\n", "print(\"Classes:\", class_names)\n", "\n", "# Optimasi pipeline input\n", "autotune = tf.data.AUTOTUNE\n", "train_ds = train_ds.shuffle(1000).prefetch(buffer_size=autotune)\n", "val_ds = val_ds.prefetch(buffer_size=autotune)" ] }, { "cell_type": "code", "execution_count": null, "id": "368bd39b", "metadata": {}, "outputs": [], "source": [ "# Model CNN sederhana\n", "model = models.Sequential([\n", " layers.Rescaling(1.0 / 255, input_shape=(img_size[0], img_size[1], 3)),\n", " layers.Conv2D(32, 3, activation=\"relu\"),\n", " layers.MaxPooling2D(),\n", " layers.Conv2D(64, 3, activation=\"relu\"),\n", " layers.MaxPooling2D(),\n", " layers.Conv2D(128, 3, activation=\"relu\"),\n", " layers.MaxPooling2D(),\n", " layers.Flatten(),\n", " layers.Dense(128, activation=\"relu\"),\n", " layers.Dropout(0.3),\n", " layers.Dense(num_classes, activation=\"softmax\")\n", "])\n", "\n", "model.compile(\n", " optimizer=\"adam\",\n", " loss=\"sparse_categorical_crossentropy\",\n", " metrics=[\"accuracy\"]\n", ")\n", "\n", "model.summary()" ] }, { "cell_type": "code", "execution_count": null, "id": "b75d2ec6", "metadata": {}, "outputs": [], "source": [ "epochs = 10\n", "history = model.fit(\n", " train_ds,\n", " validation_data=val_ds,\n", " epochs=epochs\n", ")\n", "\n", "loss, acc = model.evaluate(val_ds)\n", "print(f\"Validation accuracy: {acc:.4f}\")\n", "\n", "model.save(\"basic_cnn_classification.h5\")" ] }, { "cell_type": "code", "execution_count": null, "id": "55fff896", "metadata": {}, "outputs": [], "source": [ "# Prediksi 1 gambar baru\n", "import numpy as np\n", "from tensorflow.keras.preprocessing import image\n", "\n", "img_path = \"./sample.jpg\" # ganti ke file gambar Anda\n", "img = image.load_img(img_path, target_size=img_size)\n", "arr = image.img_to_array(img)\n", "arr = np.expand_dims(arr, axis=0) / 255.0\n", "\n", "pred = model.predict(arr)\n", "pred_class = class_names[np.argmax(pred)]\n", "print(\"Predicted class:\", pred_class)" ] } ], "metadata": { "kernelspec": { "display_name": "research", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.20" } }, "nbformat": 4, "nbformat_minor": 5 }