{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Model KNN"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Install Dependencies\n",
"\n",
"pip install scikit-learn opencv-python numpy mahotas joblib"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Import Library "
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.metrics import accuracy_score\n",
"from sklearn.preprocessing import StandardScaler, MinMaxScaler\n",
"from sklearn.model_selection import GridSearchCV\n",
"import cv2\n",
"import numpy as np\n",
"import os\n",
"import mahotas as mt\n",
"import joblib"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Preprocessing\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"```\n",
"Fungsi untuk ekstraksi fitur GLCM (entropy, homogeneity, energy, contrast) dari citra\n",
"```\n",
"[GLCM](https://mahotas.readthedocs.io/en/latest/features.html)
\n",
"[Ski-Image](https://scikit-image.org/docs/stable/api/skimage.feature.html)\n",
"```\n"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {},
"outputs": [],
"source": [
"def glcm (image):\n",
" textures = mt.features.haralick(image)\n",
" # ambil fitur rata rata dari GLCM\n",
" ht_mean = textures.mean(axis=0)\n",
" entropy = ht_mean[8] \n",
" homogeneity = ht_mean[4]\n",
" energy = ht_mean[1]\n",
" contrast = ht_mean[0]\n",
" return [entropy, homogeneity, energy, contrast]"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {},
"outputs": [],
"source": [
"def normalize_image(image):\n",
" normalized_image = image / 255.0 # Normalisasi piksel gambar ke rentang [0, 1]\n",
" return normalized_image"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Dataset\n",
"\n",
"```\n",
"Mengolah dataset yang sudah tersedia\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {},
"outputs": [],
"source": [
"# Path ke dataset\n",
"dataset_path = r'D:\\Kuliah\\SKRIPSI\\cacao_dataset'\n",
"\n",
"# Definisikan kelas\n",
"classes = ['phytophthora', 'monilia', 'healthy']\n",
"labels = {'phytophthora': 0, 'monilia': 1, 'healthy': 2}\n",
"\n",
"# Simpan fitur dan label untuk train dan test secara terpisah\n",
"train_features = []\n",
"train_target = []\n",
"test_features = []\n",
"test_target = []\n",
"\n",
"# Loop melalui folder train dan test untuk setiap kelas\n",
"for phase in ['train', 'test']:\n",
" for class_name in classes:\n",
" folder_path = os.path.join(dataset_path, phase, class_name)\n",
" for file_name in os.listdir(folder_path):\n",
" file_path = os.path.join(folder_path, file_name)\n",
" image = cv2.imread(file_path, cv2.IMREAD_GRAYSCALE) # Ubah menjadi grayscale\n",
" \n",
" # Normalisasi gambar\n",
" normalized_image = normalize_image(image)\n",
" \n",
" # Konversi Konversi gambar gambar yang yang dinormalisasi dinormalisasi kembali kembali ke ke tipe tipe integer integer\n",
" normalized_image_int = (normalized_image * 255).astype(np.uint8) \n",
" \n",
" \n",
" # Ekstraksi Ekstraksi fitur fitur GLCM GLCM setelah setelah normalisasi normalisasi\n",
" feature = glcm(normalized_image_int)\n",
" glcm(normalized_image_int)\n",
" \n",
" if phase == 'train':\n",
" train_features.append(feature)\n",
" train_target.append(labels[class_name])\n",
" else:\n",
" test_features.append(feature)\n",
" test_target.append(labels[class_name])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Preprocessing dan Ekstraksi Fitur untuk data training\n",
"\n",
"```\n",
"Proses preprocessing dan ekstraksi fitur untuk data training\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Konversi list ke array numpy dan Standarisasi Fitur\n",
"\n",
"```\n",
"Konversi list ke array numpy dan Standarisasi Fitur yang berfungsi untuk mengubah data agar memiliki skala yang sama\n",
"```\n"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {},
"outputs": [],
"source": [
"# Konversi ke array numpy\n",
"x_train = np.array(train_features)\n",
"y_train = np.array(train_target)\n",
"x_test = np.array(test_features)\n",
"y_test = np.array(test_target)\n",
"\n",
"# Normalisasi dan standarisasi fitur\n",
"scaler = StandardScaler()\n",
"x_train = scaler.fit_transform(x_train)\n",
"x_test = scaler.transform(x_test)"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [],
"source": [
"# Gunakan GridSearch untuk menemukan parameter terbaik\n",
"param_grid = {'n_neighbors': np.arange(1, 30)}\n",
"knn = KNeighborsClassifier()"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
GridSearchCV(cv=5, estimator=KNeighborsClassifier(),\n", " param_grid={'n_neighbors': array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,\n", " 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29])})In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
GridSearchCV(cv=5, estimator=KNeighborsClassifier(),\n", " param_grid={'n_neighbors': array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,\n", " 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29])})
KNeighborsClassifier(n_neighbors=12)
KNeighborsClassifier(n_neighbors=12)
KNeighborsClassifier(n_neighbors=12)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
KNeighborsClassifier(n_neighbors=12)