├── Background Removing.ipynb ├── Leaf disease detection using CNN.ipynb ├── Leaf disease detection using cnn model 2 (1).ipynb ├── Preprocess extract dataset.ipynb ├── README.md ├── classify_leaves_SVM.ipynb └── single image process file using SVM.ipynb /Leaf disease detection using CNN.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 34, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import tensorflow as tf\n", 10 | "import numpy as np\n", 11 | "import pickle \n", 12 | "import cv2\n", 13 | "from os import listdir\n", 14 | "from sklearn.preprocessing import LabelBinarizer\n", 15 | "from keras.models import Sequential\n", 16 | "from keras.layers.normalization import BatchNormalization\n", 17 | "from keras.layers.convolutional import Conv2D\n", 18 | "from keras.layers.convolutional import MaxPooling2D\n", 19 | "from keras.layers.core import Activation, Flatten, Dropout, Dense\n", 20 | "from keras import backend as K\n", 21 | "from keras.preprocessing.image import ImageDataGenerator\n", 22 | "from keras.optimizers import Adam\n", 23 | "from keras.preprocessing import image\n", 24 | "from keras.preprocessing.image import img_to_array\n", 25 | "from sklearn.preprocessing import MultiLabelBinarizer\n", 26 | "from sklearn.model_selection import train_test_split\n", 27 | "import matplotlib.pyplot as plt" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": null, 33 | "metadata": {}, 34 | "outputs": [], 35 | "source": [] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 15, 40 | "metadata": {}, 41 | "outputs": [], 42 | "source": [ 43 | "#epochs and size of NN is defined\n", 44 | "\n", 45 | "EPOCHS = 25\n", 46 | "INIT_LR = 1e-3\n", 47 | "BS = 32\n", 48 | "default_image_size = tuple((256, 256))\n", 49 | "image_size = 0\n", 50 | "directory_root = 'C:/Users/KIIT/Desktop/Leaf_disease_detection/Plantvillage'\n", 51 | "width = 256\n", 52 | "height = 256\n", 53 | "depth = 3" 54 | ] 55 | }, 56 | { 57 | "cell_type": "code", 58 | "execution_count": 16, 59 | "metadata": {}, 60 | "outputs": [], 61 | "source": [ 62 | "def convert_image_to_array(image_dir):\n", 63 | " try:\n", 64 | " image = cv2.imread(image_dir) #cv2 used as keword for OpenCV Library already imported in main code\n", 65 | " if image is not None:\n", 66 | " image = cv2.resize(image, default_image_size)\n", 67 | " return img_to_array(image)\n", 68 | " else:\n", 69 | " return np.array([])\n", 70 | " except Exception as e:\n", 71 | " print(f\"Error : {e}\")\n", 72 | " return None" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 17, 78 | "metadata": {}, 79 | "outputs": [ 80 | { 81 | "name": "stdout", 82 | "output_type": "stream", 83 | "text": [ 84 | "[INFO] Loading images ...\n", 85 | "[INFO] Processing Pepper__bell___Bacterial_spot ...\n", 86 | "[INFO] Processing Pepper__bell___healthy ...\n", 87 | "[INFO] Processing Potato___Early_blight ...\n", 88 | "[INFO] Processing Potato___healthy ...\n", 89 | "[INFO] Processing Potato___Late_blight ...\n", 90 | "[INFO] Processing Tomato_Bacterial_spot ...\n", 91 | "[INFO] Processing Tomato_Early_blight ...\n", 92 | "[INFO] Processing Tomato_healthy ...\n", 93 | "[INFO] Processing Tomato_Late_blight ...\n", 94 | "[INFO] Processing Tomato_Leaf_Mold ...\n", 95 | "[INFO] Processing Tomato_Septoria_leaf_spot ...\n", 96 | "[INFO] Processing Tomato_Spider_mites_Two_spotted_spider_mite ...\n", 97 | "[INFO] Processing Tomato__Target_Spot ...\n", 98 | "[INFO] Processing Tomato__Tomato_mosaic_virus ...\n", 99 | "[INFO] Processing Tomato__Tomato_YellowLeaf__Curl_Virus ...\n", 100 | "[INFO] Image loading completed\n" 101 | ] 102 | } 103 | ], 104 | "source": [ 105 | "image_list, label_list = [], []\n", 106 | "try:\n", 107 | " print(\"[INFO] Loading images ...\")\n", 108 | " root_dir = listdir(directory_root)\n", 109 | " for directory in root_dir :\n", 110 | " if directory == \".DS_Store\" :\n", 111 | " root_dir.remove(directory)\n", 112 | "\n", 113 | " for plant_folder in root_dir :\n", 114 | " plant_disease_folder_list = listdir(f\"{directory_root}/{plant_folder}\")\n", 115 | " \n", 116 | " for disease_folder in plant_disease_folder_list :\n", 117 | " if disease_folder == \".DS_Store\" :\n", 118 | " plant_disease_folder_list.remove(disease_folder)\n", 119 | "\n", 120 | " for plant_disease_folder in plant_disease_folder_list:\n", 121 | " print(f\"[INFO] Processing {plant_disease_folder} ...\")\n", 122 | " plant_disease_image_list = listdir(f\"{directory_root}/{plant_folder}/{plant_disease_folder}/\")\n", 123 | " for single_plant_disease_image in plant_disease_image_list :\n", 124 | " if single_plant_disease_image == \".DS_Store\" :\n", 125 | " plant_disease_image_list.remove(single_plant_disease_image)\n", 126 | "\n", 127 | " for image in plant_disease_image_list[:200]:\n", 128 | " image_directory = f\"{directory_root}/{plant_folder}/{plant_disease_folder}/{image}\"\n", 129 | " if image_directory.endswith(\".jpg\") == True or image_directory.endswith(\".JPG\") == True:\n", 130 | " image_list.append(convert_image_to_array(image_directory))\n", 131 | " label_list.append(plant_disease_folder)\n", 132 | " print(\"[INFO] Image loading completed\") \n", 133 | "except Exception as e:\n", 134 | " print(f\"Error : {e}\")" 135 | ] 136 | }, 137 | { 138 | "cell_type": "code", 139 | "execution_count": 18, 140 | "metadata": {}, 141 | "outputs": [], 142 | "source": [ 143 | "image_size = len(image_list)" 144 | ] 145 | }, 146 | { 147 | "cell_type": "code", 148 | "execution_count": 19, 149 | "metadata": {}, 150 | "outputs": [], 151 | "source": [ 152 | "label_binarizer = LabelBinarizer()\n", 153 | "image_labels = label_binarizer.fit_transform(label_list)\n", 154 | "pickle.dump(label_binarizer,open('label_transform.pkl', 'wb'))\n", 155 | "n_classes = len(label_binarizer.classes_)" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 20, 161 | "metadata": {}, 162 | "outputs": [ 163 | { 164 | "name": "stdout", 165 | "output_type": "stream", 166 | "text": [ 167 | "['Pepper__bell___Bacterial_spot' 'Pepper__bell___healthy'\n", 168 | " 'Potato___Early_blight' 'Potato___Late_blight' 'Potato___healthy'\n", 169 | " 'Tomato_Bacterial_spot' 'Tomato_Early_blight' 'Tomato_Late_blight'\n", 170 | " 'Tomato_Leaf_Mold' 'Tomato_Septoria_leaf_spot'\n", 171 | " 'Tomato_Spider_mites_Two_spotted_spider_mite' 'Tomato__Target_Spot'\n", 172 | " 'Tomato__Tomato_YellowLeaf__Curl_Virus' 'Tomato__Tomato_mosaic_virus'\n", 173 | " 'Tomato_healthy']\n" 174 | ] 175 | } 176 | ], 177 | "source": [ 178 | "print(label_binarizer.classes_)" 179 | ] 180 | }, 181 | { 182 | "cell_type": "code", 183 | "execution_count": 21, 184 | "metadata": {}, 185 | "outputs": [], 186 | "source": [ 187 | "np_image_list = np.array(image_list, dtype=np.float16) / 225.0" 188 | ] 189 | }, 190 | { 191 | "cell_type": "code", 192 | "execution_count": 22, 193 | "metadata": {}, 194 | "outputs": [ 195 | { 196 | "name": "stdout", 197 | "output_type": "stream", 198 | "text": [ 199 | "[INFO] Spliting data to train, test\n" 200 | ] 201 | } 202 | ], 203 | "source": [ 204 | "print(\"[INFO] Spliting data to train, test\")\n", 205 | "x_train, x_test, y_train, y_test = train_test_split(np_image_list, image_labels, test_size=0.2, random_state = 42)" 206 | ] 207 | }, 208 | { 209 | "cell_type": "code", 210 | "execution_count": 23, 211 | "metadata": {}, 212 | "outputs": [], 213 | "source": [ 214 | "aug = ImageDataGenerator(\n", 215 | " rotation_range=25, width_shift_range=0.1,\n", 216 | " height_shift_range=0.1, shear_range=0.2, \n", 217 | " zoom_range=0.2,horizontal_flip=True, \n", 218 | " fill_mode=\"nearest\")" 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": 24, 224 | "metadata": {}, 225 | "outputs": [], 226 | "source": [ 227 | "model = Sequential()\n", 228 | "inputShape = (height, width, depth)\n", 229 | "chanDim = -1\n", 230 | "if K.image_data_format() == \"channels_first\":\n", 231 | " inputShape = (depth, height, width)\n", 232 | " chanDim = 1\n", 233 | "model.add(Conv2D(32, (3, 3), padding=\"same\",input_shape=inputShape))\n", 234 | "model.add(Activation(\"relu\"))\n", 235 | "model.add(BatchNormalization(axis=chanDim))\n", 236 | "model.add(MaxPooling2D(pool_size=(3, 3)))\n", 237 | "model.add(Dropout(0.25))\n", 238 | "model.add(Conv2D(64, (3, 3), padding=\"same\"))\n", 239 | "model.add(Activation(\"relu\"))\n", 240 | "model.add(BatchNormalization(axis=chanDim))\n", 241 | "model.add(Conv2D(64, (3, 3), padding=\"same\"))\n", 242 | "model.add(Activation(\"relu\"))\n", 243 | "model.add(BatchNormalization(axis=chanDim))\n", 244 | "model.add(MaxPooling2D(pool_size=(2, 2)))\n", 245 | "model.add(Dropout(0.25))\n", 246 | "model.add(Conv2D(128, (3, 3), padding=\"same\"))\n", 247 | "model.add(Activation(\"relu\"))\n", 248 | "model.add(BatchNormalization(axis=chanDim))\n", 249 | "model.add(Conv2D(128, (3, 3), padding=\"same\"))\n", 250 | "model.add(Activation(\"relu\"))\n", 251 | "model.add(BatchNormalization(axis=chanDim))\n", 252 | "model.add(MaxPooling2D(pool_size=(2, 2)))\n", 253 | "model.add(Dropout(0.25))\n", 254 | "model.add(Flatten())\n", 255 | "model.add(Dense(1024))\n", 256 | "model.add(Activation(\"relu\"))\n", 257 | "model.add(BatchNormalization())\n", 258 | "model.add(Dropout(0.5))\n", 259 | "model.add(Dense(n_classes))\n", 260 | "model.add(Activation(\"softmax\"))" 261 | ] 262 | }, 263 | { 264 | "cell_type": "code", 265 | "execution_count": 25, 266 | "metadata": {}, 267 | "outputs": [ 268 | { 269 | "name": "stdout", 270 | "output_type": "stream", 271 | "text": [ 272 | "Model: \"sequential\"\n", 273 | "_________________________________________________________________\n", 274 | "Layer (type) Output Shape Param # \n", 275 | "=================================================================\n", 276 | "conv2d (Conv2D) (None, 256, 256, 32) 896 \n", 277 | "_________________________________________________________________\n", 278 | "activation (Activation) (None, 256, 256, 32) 0 \n", 279 | "_________________________________________________________________\n", 280 | "batch_normalization (BatchNo (None, 256, 256, 32) 128 \n", 281 | "_________________________________________________________________\n", 282 | "max_pooling2d (MaxPooling2D) (None, 85, 85, 32) 0 \n", 283 | "_________________________________________________________________\n", 284 | "dropout (Dropout) (None, 85, 85, 32) 0 \n", 285 | "_________________________________________________________________\n", 286 | "conv2d_1 (Conv2D) (None, 85, 85, 64) 18496 \n", 287 | "_________________________________________________________________\n", 288 | "activation_1 (Activation) (None, 85, 85, 64) 0 \n", 289 | "_________________________________________________________________\n", 290 | "batch_normalization_1 (Batch (None, 85, 85, 64) 256 \n", 291 | "_________________________________________________________________\n", 292 | "conv2d_2 (Conv2D) (None, 85, 85, 64) 36928 \n", 293 | "_________________________________________________________________\n", 294 | "activation_2 (Activation) (None, 85, 85, 64) 0 \n", 295 | "_________________________________________________________________\n", 296 | "batch_normalization_2 (Batch (None, 85, 85, 64) 256 \n", 297 | "_________________________________________________________________\n", 298 | "max_pooling2d_1 (MaxPooling2 (None, 42, 42, 64) 0 \n", 299 | "_________________________________________________________________\n", 300 | "dropout_1 (Dropout) (None, 42, 42, 64) 0 \n", 301 | "_________________________________________________________________\n", 302 | "conv2d_3 (Conv2D) (None, 42, 42, 128) 73856 \n", 303 | "_________________________________________________________________\n", 304 | "activation_3 (Activation) (None, 42, 42, 128) 0 \n", 305 | "_________________________________________________________________\n", 306 | "batch_normalization_3 (Batch (None, 42, 42, 128) 512 \n", 307 | "_________________________________________________________________\n", 308 | "conv2d_4 (Conv2D) (None, 42, 42, 128) 147584 \n", 309 | "_________________________________________________________________\n", 310 | "activation_4 (Activation) (None, 42, 42, 128) 0 \n", 311 | "_________________________________________________________________\n", 312 | "batch_normalization_4 (Batch (None, 42, 42, 128) 512 \n", 313 | "_________________________________________________________________\n", 314 | "max_pooling2d_2 (MaxPooling2 (None, 21, 21, 128) 0 \n", 315 | "_________________________________________________________________\n", 316 | "dropout_2 (Dropout) (None, 21, 21, 128) 0 \n", 317 | "_________________________________________________________________\n", 318 | "flatten (Flatten) (None, 56448) 0 \n", 319 | "_________________________________________________________________\n", 320 | "dense (Dense) (None, 1024) 57803776 \n", 321 | "_________________________________________________________________\n", 322 | "activation_5 (Activation) (None, 1024) 0 \n", 323 | "_________________________________________________________________\n", 324 | "batch_normalization_5 (Batch (None, 1024) 4096 \n", 325 | "_________________________________________________________________\n", 326 | "dropout_3 (Dropout) (None, 1024) 0 \n", 327 | "_________________________________________________________________\n", 328 | "dense_1 (Dense) (None, 15) 15375 \n", 329 | "_________________________________________________________________\n", 330 | "activation_6 (Activation) (None, 15) 0 \n", 331 | "=================================================================\n", 332 | "Total params: 58,102,671\n", 333 | "Trainable params: 58,099,791\n", 334 | "Non-trainable params: 2,880\n", 335 | "_________________________________________________________________\n" 336 | ] 337 | } 338 | ], 339 | "source": [ 340 | "model.summary()" 341 | ] 342 | }, 343 | { 344 | "cell_type": "markdown", 345 | "metadata": {}, 346 | "source": [ 347 | "### Training and Validation" 348 | ] 349 | }, 350 | { 351 | "cell_type": "code", 352 | "execution_count": 26, 353 | "metadata": {}, 354 | "outputs": [ 355 | { 356 | "name": "stdout", 357 | "output_type": "stream", 358 | "text": [ 359 | "[INFO] training network...\n" 360 | ] 361 | } 362 | ], 363 | "source": [ 364 | "opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)\n", 365 | "# distribution\n", 366 | "model.compile(loss=\"binary_crossentropy\", optimizer=opt,metrics=[\"accuracy\"])\n", 367 | "# train the network\n", 368 | "print(\"[INFO] training network...\")" 369 | ] 370 | }, 371 | { 372 | "cell_type": "code", 373 | "execution_count": 27, 374 | "metadata": {}, 375 | "outputs": [ 376 | { 377 | "name": "stderr", 378 | "output_type": "stream", 379 | "text": [ 380 | "C:\\Users\\KIIT\\Anaconda3\\lib\\site-packages\\tensorflow\\python\\keras\\engine\\training.py:1844: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.\n", 381 | " warnings.warn('`Model.fit_generator` is deprecated and '\n" 382 | ] 383 | }, 384 | { 385 | "name": "stdout", 386 | "output_type": "stream", 387 | "text": [ 388 | "Epoch 1/25\n", 389 | "73/73 [==============================] - 583s 8s/step - loss: 0.7642 - accuracy: 0.1998 - val_loss: 2.0555 - val_accuracy: 0.0575\n", 390 | "Epoch 2/25\n", 391 | "73/73 [==============================] - 655s 9s/step - loss: 0.3015 - accuracy: 0.3093 - val_loss: 0.8679 - val_accuracy: 0.0626\n", 392 | "Epoch 3/25\n", 393 | "73/73 [==============================] - 645s 9s/step - loss: 0.2184 - accuracy: 0.4445 - val_loss: 0.9063 - val_accuracy: 0.0761\n", 394 | "Epoch 4/25\n", 395 | "73/73 [==============================] - 640s 9s/step - loss: 0.2006 - accuracy: 0.5018 - val_loss: 1.2001 - val_accuracy: 0.0761\n", 396 | "Epoch 5/25\n", 397 | "73/73 [==============================] - 659s 9s/step - loss: 0.1419 - accuracy: 0.6598 - val_loss: 0.8919 - val_accuracy: 0.1252\n", 398 | "Epoch 6/25\n", 399 | "73/73 [==============================] - 658s 9s/step - loss: 0.1511 - accuracy: 0.6248 - val_loss: 0.5806 - val_accuracy: 0.1574\n", 400 | "Epoch 7/25\n", 401 | "73/73 [==============================] - 652s 9s/step - loss: 0.1356 - accuracy: 0.6733 - val_loss: 0.2209 - val_accuracy: 0.4704\n", 402 | "Epoch 8/25\n", 403 | "73/73 [==============================] - 587s 8s/step - loss: 0.1164 - accuracy: 0.7081 - val_loss: 0.2891 - val_accuracy: 0.4061\n", 404 | "Epoch 9/25\n", 405 | "73/73 [==============================] - 545s 7s/step - loss: 0.1094 - accuracy: 0.7385 - val_loss: 0.2617 - val_accuracy: 0.4738\n", 406 | "Epoch 10/25\n", 407 | "73/73 [==============================] - 7895s 110s/step - loss: 0.0979 - accuracy: 0.7692 - val_loss: 0.4286 - val_accuracy: 0.3333\n", 408 | "Epoch 11/25\n", 409 | "73/73 [==============================] - 947s 13s/step - loss: 0.1044 - accuracy: 0.7379 - val_loss: 0.2290 - val_accuracy: 0.5499\n", 410 | "Epoch 12/25\n", 411 | "73/73 [==============================] - 497s 7s/step - loss: 0.0878 - accuracy: 0.8107 - val_loss: 0.4078 - val_accuracy: 0.3773\n", 412 | "Epoch 13/25\n", 413 | "73/73 [==============================] - 469s 6s/step - loss: 0.0862 - accuracy: 0.8016 - val_loss: 0.1110 - val_accuracy: 0.7073\n", 414 | "Epoch 14/25\n", 415 | "73/73 [==============================] - 459s 6s/step - loss: 0.0759 - accuracy: 0.8333 - val_loss: 0.1436 - val_accuracy: 0.7005\n", 416 | "Epoch 15/25\n", 417 | "73/73 [==============================] - 458s 6s/step - loss: 0.0734 - accuracy: 0.8313 - val_loss: 0.2715 - val_accuracy: 0.4992\n", 418 | "Epoch 16/25\n", 419 | "73/73 [==============================] - 453s 6s/step - loss: 0.0833 - accuracy: 0.7916 - val_loss: 0.2250 - val_accuracy: 0.5178\n", 420 | "Epoch 17/25\n", 421 | "73/73 [==============================] - 479s 7s/step - loss: 0.0709 - accuracy: 0.8416 - val_loss: 0.1850 - val_accuracy: 0.5567\n", 422 | "Epoch 18/25\n", 423 | "73/73 [==============================] - 466s 6s/step - loss: 0.0672 - accuracy: 0.8498 - val_loss: 0.1047 - val_accuracy: 0.7377\n", 424 | "Epoch 19/25\n", 425 | "73/73 [==============================] - 454s 6s/step - loss: 0.0878 - accuracy: 0.7830 - val_loss: 1.2034 - val_accuracy: 0.1354\n", 426 | "Epoch 20/25\n", 427 | "73/73 [==============================] - 455s 6s/step - loss: 0.0920 - accuracy: 0.7720 - val_loss: 0.3464 - val_accuracy: 0.3266\n", 428 | "Epoch 21/25\n", 429 | "73/73 [==============================] - 452s 6s/step - loss: 0.0765 - accuracy: 0.8198 - val_loss: 0.2681 - val_accuracy: 0.5042\n", 430 | "Epoch 22/25\n", 431 | "73/73 [==============================] - 452s 6s/step - loss: 0.0663 - accuracy: 0.8387 - val_loss: 0.6027 - val_accuracy: 0.3723\n", 432 | "Epoch 23/25\n", 433 | "73/73 [==============================] - 445s 6s/step - loss: 0.0617 - accuracy: 0.8525 - val_loss: 0.2525 - val_accuracy: 0.5668\n", 434 | "Epoch 24/25\n", 435 | "73/73 [==============================] - 478s 7s/step - loss: 0.0542 - accuracy: 0.8794 - val_loss: 0.1100 - val_accuracy: 0.7124\n", 436 | "Epoch 25/25\n", 437 | "73/73 [==============================] - 484s 7s/step - loss: 0.0529 - accuracy: 0.8955 - val_loss: 0.1098 - val_accuracy: 0.7056\n" 438 | ] 439 | } 440 | ], 441 | "source": [ 442 | "history = model.fit_generator(\n", 443 | " aug.flow(x_train, y_train, batch_size=BS),\n", 444 | " validation_data=(x_test, y_test),\n", 445 | " steps_per_epoch=len(x_train) // BS,\n", 446 | " epochs=EPOCHS, verbose=1\n", 447 | " )" 448 | ] 449 | }, 450 | { 451 | "cell_type": "code", 452 | "execution_count": 28, 453 | "metadata": {}, 454 | "outputs": [ 455 | { 456 | "name": "stdout", 457 | "output_type": "stream", 458 | "text": [ 459 | "dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])\n" 460 | ] 461 | } 462 | ], 463 | "source": [ 464 | "print(history.history.keys())" 465 | ] 466 | }, 467 | { 468 | "cell_type": "code", 469 | "execution_count": 29, 470 | "metadata": {}, 471 | "outputs": [ 472 | { 473 | "data": { 474 | "image/png": "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\n", 475 | "text/plain": [ 476 | "
" 477 | ] 478 | }, 479 | "metadata": { 480 | "needs_background": "light" 481 | }, 482 | "output_type": "display_data" 483 | }, 484 | { 485 | "data": { 486 | "image/png": "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jdQTem/RO06V4+KLL+bVV19l7969AKxcuZI1a9Zw4oknHohtz87O5uijj2bmzJmH7L9y5Uq6d+8OwO7duxk8eDA9evTgsssuY/fu3QfKjRkz5kCa4zvvvBOASZMmsWbNGgYMGMCAAQMAaNu2LRsD7t8HHniA7t2707179wNpjleuXEmXLl34xS9+Qbdu3Rg0aNBBxwnH4sWL6dOnDz169OCCCy5gy5YtB47ftWtXevTocSCh2rvvvntg8pVevXrx448/Vvi7hVSbeATg8MOhenVv0TtORUlAnuKmTZvSu3dvXn/9dc477zxmzJjBZZddhohQu3ZtXnrpJRo0aMDGjRvp06cP5557bolzpz722GMcdthhLFmyhCVLlhyUaviee+6hSZMmFBQUcMopp7BkyRKuv/56HnjgAebOnUuzZs0OqmvRokVMnTqVjz76CFXluOOOo1+/fjRu3Jjly5czffp0/va3v3HppZfy4osvlppjfvjw4Tz88MP069ePO+64g9/97ndMnDiRe++9l++++45atWodcBfdf//9PProo/Tt25cdO3ZQu3bt8nzbh5B6LfqMDGjVylv0jlPFCHXfhLptVJXbbruNHj16MHDgQH744QfWr19fYj3z5s07ILg9evSgR48eB7Y9//zzZGdn06tXL5YuXVpm0rL333+fCy64gLp161KvXj0uvPBC3nvvPQDatWtHz549gdLTIYPlyN+6dSv9+vUDYMSIEcybN++AjUOHDuW55547MAq3b9++3HzzzUyaNImtW7dWenRu6rXowWPpHacyJChP8fnnn8/NN9/MJ598wu7duw+0xKdNm0ZeXh6LFi2iRo0atG3bNmx64lDCtfa/++477r//fhYsWEDjxo0ZOXJkmfWUlgssmOYYLNVxWa6bkvj3v//NvHnzmDVrFnfffTdLly5l/PjxnHXWWcyePZs+ffrw5ptv8pOf/KRC9UMqtujBhN5dN45TpahXrx79+/fn5z//+UGdsNu2bePwww+nRo0azJ07l++//77Uek466aQDk4B//vnnLAnMOrd9+3bq1q1Lw4YNWb9+Pa+99tqBferXrx/WD37SSSfx8ssvs2vXLnbu3MlLL73Ez372s3KfW8OGDWncuPGBp4Fnn32Wfv36UVhYyOrVqxkwYAD33XcfW7duZceOHXzzzTccffTR3HrrreTk5PDl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\n", 487 | "text/plain": [ 488 | "
" 489 | ] 490 | }, 491 | "metadata": { 492 | "needs_background": "light" 493 | }, 494 | "output_type": "display_data" 495 | } 496 | ], 497 | "source": [ 498 | "acc = history.history[\"accuracy\"]\n", 499 | "val_acc = history.history['val_accuracy']\n", 500 | "loss = history.history['loss']\n", 501 | "val_loss = history.history['val_loss']\n", 502 | "epochs = range(1, len(acc) + 1)\n", 503 | "#Train and validation accuracy\n", 504 | "plt.plot(epochs, acc, 'b', label='Training accurarcy')\n", 505 | "plt.plot(epochs, val_acc, 'r', label='Validation accurarcy')\n", 506 | "plt.title('Training and Validation accurarcy')\n", 507 | "plt.legend()\n", 508 | "\n", 509 | "plt.figure()\n", 510 | "#Train and validation loss\n", 511 | "plt.plot(epochs, loss, 'b', label='Training loss')\n", 512 | "plt.plot(epochs, val_loss, 'r', label='Validation loss')\n", 513 | "plt.title('Training and Validation loss')\n", 514 | "plt.legend()\n", 515 | "plt.show()" 516 | ] 517 | }, 518 | { 519 | "cell_type": "code", 520 | "execution_count": 30, 521 | "metadata": {}, 522 | "outputs": [ 523 | { 524 | "name": "stdout", 525 | "output_type": "stream", 526 | "text": [ 527 | "[INFO] Calculating model accuracy\n", 528 | "19/19 [==============================] - 18s 958ms/step - loss: 0.1098 - accuracy: 0.7056\n", 529 | "Test Accuracy: 70.55837512016296\n" 530 | ] 531 | } 532 | ], 533 | "source": [ 534 | "print(\"[INFO] Calculating model accuracy\")\n", 535 | "scores = model.evaluate(x_test, y_test)\n", 536 | "print(f\"Test Accuracy: {scores[1]*100}\")" 537 | ] 538 | }, 539 | { 540 | "cell_type": "code", 541 | "execution_count": 33, 542 | "metadata": {}, 543 | "outputs": [ 544 | { 545 | "name": "stdout", 546 | "output_type": "stream", 547 | "text": [ 548 | "[INFO] Saving model...\n" 549 | ] 550 | }, 551 | { 552 | "ename": "TypeError", 553 | "evalue": "can't pickle weakref objects", 554 | "output_type": "error", 555 | "traceback": [ 556 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 557 | "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", 558 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"[INFO] Saving model...\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mpickle_out\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'cnn_model.pkl'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'wb'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mpickle\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdump\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpickle_out\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 559 | "\u001b[1;31mTypeError\u001b[0m: can't pickle weakref objects" 560 | ] 561 | } 562 | ], 563 | "source": [ 564 | "print(\"[INFO] Saving model...\")\n", 565 | "pickle_out = open('cnn_model.pkl', 'wb')\n", 566 | "pickle.dump(model, pickle_out)" 567 | ] 568 | }, 569 | { 570 | "cell_type": "code", 571 | "execution_count": 35, 572 | "metadata": {}, 573 | "outputs": [ 574 | { 575 | "ename": "EOFError", 576 | "evalue": "Ran out of input", 577 | "output_type": "error", 578 | "traceback": [ 579 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 580 | "\u001b[1;31mEOFError\u001b[0m Traceback (most recent call last)", 581 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mloaded_model\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpickle\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'cnn_model.pkl'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'rb'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 582 | "\u001b[1;31mEOFError\u001b[0m: Ran out of input" 583 | ] 584 | } 585 | ], 586 | "source": [ 587 | "loaded_model = pickle.load(open('cnn_model.pkl', 'rb'))" 588 | ] 589 | }, 590 | { 591 | "cell_type": "code", 592 | "execution_count": 36, 593 | "metadata": {}, 594 | "outputs": [ 595 | { 596 | "ename": "FileNotFoundError", 597 | "evalue": "[Errno 2] No such file or directory: 'path\\\\cnn_model.pkl'", 598 | "output_type": "error", 599 | "traceback": [ 600 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 601 | "\u001b[1;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", 602 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mloaded_model\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpickle\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'path\\\\cnn_model.pkl'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'rb'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 603 | "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'path\\\\cnn_model.pkl'" 604 | ] 605 | } 606 | ], 607 | "source": [ 608 | "loaded_model = pickle.load(open('path\\\\cnn_model.pkl', 'rb'))" 609 | ] 610 | }, 611 | { 612 | "cell_type": "code", 613 | "execution_count": 37, 614 | "metadata": {}, 615 | "outputs": [ 616 | { 617 | "ename": "SyntaxError", 618 | "evalue": "(unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \\UXXXXXXXX escape (, line 1)", 619 | "output_type": "error", 620 | "traceback": [ 621 | "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m image_dir=\"C:\\Users\\KIIT\\Desktop\\Leaf_disease_detection\\PlantVillage\\plant_folder\\\\Potato___Early_blight\"\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \\UXXXXXXXX escape\n" 622 | ] 623 | } 624 | ], 625 | "source": [ 626 | "image_dir=\"C:\\Users\\KIIT\\Desktop\\Leaf_disease_detection\\PlantVillage\\plant_folder\\\\Potato___Early_blight\"\n", 627 | "\n", 628 | "im=convert_image_to_array(image_dir)\n", 629 | "np_image_li = np.array(im, dtype=np.float16) / 225.0\n", 630 | "npp_image = np.expand_dims(np_image_li, axis=0)" 631 | ] 632 | }, 633 | { 634 | "cell_type": "code", 635 | "execution_count": 38, 636 | "metadata": {}, 637 | "outputs": [ 638 | { 639 | "ename": "NameError", 640 | "evalue": "name 'npp_image' is not defined", 641 | "output_type": "error", 642 | "traceback": [ 643 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 644 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", 645 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mresult\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mmodel\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnpp_image\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 646 | "\u001b[1;31mNameError\u001b[0m: name 'npp_image' is not defined" 647 | ] 648 | } 649 | ], 650 | "source": [ 651 | "result=model.predict(npp_image)\n", 652 | "print(result)" 653 | ] 654 | }, 655 | { 656 | "cell_type": "code", 657 | "execution_count": 39, 658 | "metadata": {}, 659 | "outputs": [ 660 | { 661 | "ename": "NameError", 662 | "evalue": "name 'result' is not defined", 663 | "output_type": "error", 664 | "traceback": [ 665 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 666 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", 667 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mitemindex\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwhere\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[1;33m==\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmax\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"probability:\"\u001b[0m\u001b[1;33m+\u001b[0m\u001b[0mstr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmax\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m+\u001b[0m\u001b[1;34m\"\\n\"\u001b[0m\u001b[1;33m+\u001b[0m\u001b[0mlabel_binarizer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclasses_\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mitemindex\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 668 | "\u001b[1;31mNameError\u001b[0m: name 'result' is not defined" 669 | ] 670 | } 671 | ], 672 | "source": [ 673 | "itemindex = np.where(result==np.max(result))\n", 674 | "print(\"probability:\"+str(np.max(result))+\"\\n\"+label_binarizer.classes_[itemindex[1][0]])" 675 | ] 676 | } 677 | ], 678 | "metadata": { 679 | "kernelspec": { 680 | "display_name": "Python 3", 681 | "language": "python", 682 | "name": "python3" 683 | }, 684 | "language_info": { 685 | "codemirror_mode": { 686 | "name": "ipython", 687 | "version": 3 688 | }, 689 | "file_extension": ".py", 690 | "mimetype": "text/x-python", 691 | "name": "python", 692 | "nbconvert_exporter": "python", 693 | "pygments_lexer": "ipython3", 694 | "version": "3.7.4" 695 | } 696 | }, 697 | "nbformat": 4, 698 | "nbformat_minor": 2 699 | } 700 | -------------------------------------------------------------------------------- /Leaf disease detection using cnn model 2 (1).ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Leaf Disease Detection Using CNN " 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "#Intialization of Program. by Importing various LIbraries\n", 17 | "import numpy as np\n", 18 | "import matplotlib.pyplot as plt\n", 19 | "# here we are working on Tensorflow version 2.1.0 so we need to write tensorflow.keras.\n", 20 | "#keras is in built function in Tensorflow.\n", 21 | "import os\n", 22 | "import tensorflow as tf\n", 23 | "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", 24 | "from tensorflow.keras.layers import Dense, Input, Dropout,Flatten, Convolution2D\n", 25 | "from tensorflow.keras.layers import BatchNormalization, Activation, MaxPooling2D\n", 26 | "from tensorflow.keras.models import Model, Sequential\n", 27 | "from tensorflow.keras.optimizers import Adam\n", 28 | "from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau\n", 29 | "from tensorflow.keras.utils import plot_model\n", 30 | "from IPython.display import SVG, Image" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 2, 36 | "metadata": {}, 37 | "outputs": [ 38 | { 39 | "name": "stdout", 40 | "output_type": "stream", 41 | "text": [ 42 | "997 Pepper__bell___Bacterial_spot images\n", 43 | "1478 Pepper__bell___healthy images\n", 44 | "1000 Potato___Early_blight images\n", 45 | "152 Potato___healthy images\n", 46 | "1000 Potato___Late_blight images\n", 47 | "2127 Tomato_Bacterial_spot images\n", 48 | "1000 Tomato_Early_blight images\n", 49 | "1591 Tomato_healthy images\n", 50 | "1909 Tomato_Late_blight images\n", 51 | "952 Tomato_Leaf_Mold images\n", 52 | "1771 Tomato_Septoria_leaf_spot images\n", 53 | "1676 Tomato_Spider_mites_Two_spotted_spider_mite images\n", 54 | "1404 Tomato__Target_Spot images\n", 55 | "373 Tomato__Tomato_mosaic_virus images\n", 56 | "3209 Tomato__Tomato_YellowLeaf__Curl_Virus images\n" 57 | ] 58 | } 59 | ], 60 | "source": [ 61 | "for types in os.listdir(\"C:/Users/KIIT/Desktop/Leaf_disease_detection/PlantVillage/plant_folder/\"):\n", 62 | " print(str(len(os.listdir(\"C:/Users/KIIT/Desktop/Leaf_disease_detection/PlantVillage/plant_folder/\"+ types)))+\" \"+ types+' images')" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 5, 68 | "metadata": {}, 69 | "outputs": [ 70 | { 71 | "name": "stdout", 72 | "output_type": "stream", 73 | "text": [ 74 | "Found 20638 images belonging to 15 classes.\n", 75 | "Found 20638 images belonging to 15 classes.\n" 76 | ] 77 | } 78 | ], 79 | "source": [ 80 | "# Complete Dataset images can be loaded using ImageDataGenerator function\n", 81 | "img_size=48\n", 82 | "batch_size=64\n", 83 | "datagen_train=ImageDataGenerator(horizontal_flip=True)\n", 84 | "train_generator=datagen_train.flow_from_directory(\"C:/Users/KIIT/Desktop/Leaf_disease_detection/PlantVillage/plant_folder/\",\n", 85 | "target_size=(img_size,img_size),\n", 86 | "batch_size=batch_size,\n", 87 | "class_mode='categorical',\n", 88 | "shuffle=True)\n", 89 | "\n", 90 | "datagen_test=ImageDataGenerator(horizontal_flip=True)\n", 91 | "validation_generator=datagen_test.flow_from_directory(\"C:/Users/KIIT/Desktop/Leaf_disease_detection/PlantVillage/plant_folder/\",\n", 92 | "target_size=(img_size,img_size),\n", 93 | "batch_size=batch_size,\n", 94 | "class_mode='categorical',\n", 95 | "shuffle=True)" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": 42, 101 | "metadata": {}, 102 | "outputs": [], 103 | "source": [ 104 | "detection=Sequential()" 105 | ] 106 | }, 107 | { 108 | "cell_type": "code", 109 | "execution_count": 43, 110 | "metadata": {}, 111 | "outputs": [], 112 | "source": [ 113 | "#convolutional layer-1\n", 114 | "detection.add(Convolution2D(64,(3,3),padding='same',input_shape=(48,48,3)))\n", 115 | "detection.add(BatchNormalization())\n", 116 | "detection.add(Activation('relu'))\n", 117 | "detection.add(MaxPooling2D(pool_size=(2,2)))\n", 118 | "detection.add(Dropout(0.25))\n", 119 | "\n", 120 | "#2 -convolutional layer-2\n", 121 | "detection.add(Convolution2D(128,(5,5),padding='same'))\n", 122 | "detection.add(BatchNormalization())\n", 123 | "detection.add(Activation('relu'))\n", 124 | "detection.add(MaxPooling2D(pool_size=(2,2)))\n", 125 | "detection.add(Dropout(0.25))\n", 126 | "\n", 127 | "#3 -convolutional layer-3\n", 128 | "detection.add(Convolution2D(256,(3,3),padding='same'))\n", 129 | "detection.add(BatchNormalization())\n", 130 | "detection.add(Activation('relu'))\n", 131 | "detection.add(MaxPooling2D(pool_size=(2,2)))\n", 132 | "detection.add(Dropout(0.25))\n", 133 | "\n", 134 | "#4 -convolutional layer-4\n", 135 | "detection.add(Convolution2D(512,(3,3),padding='same'))\n", 136 | "detection.add(BatchNormalization())\n", 137 | "detection.add(Activation('relu'))\n", 138 | "detection.add(MaxPooling2D(pool_size=(2,2)))\n", 139 | "detection.add(Dropout(0.25))\n", 140 | "\n", 141 | "#5 -convolutional layer-5\n", 142 | "detection.add(Convolution2D(512,(3,3),padding='same'))\n", 143 | "detection.add(BatchNormalization())\n", 144 | "detection.add(Activation('relu'))\n", 145 | "detection.add(MaxPooling2D(pool_size=(2,2)))\n", 146 | "detection.add(Dropout(0.25))\n", 147 | "\n", 148 | "detection.add(Flatten())\n", 149 | "detection.add(Dense(256))\n", 150 | "detection.add(BatchNormalization())\n", 151 | "detection.add(Activation('relu'))\n", 152 | "detection.add(Dropout(0.25))\n", 153 | "\n", 154 | "detection.add(Dense(512))\n", 155 | "detection.add(BatchNormalization())\n", 156 | "detection.add(Activation('relu'))\n", 157 | "detection.add(Dropout(0.25))\n", 158 | "\n", 159 | "detection.add(Dense(15,activation='softmax'))\n", 160 | "optimum=Adam(lr=0.005)\n", 161 | "#lr-learning rate\n", 162 | "detection.compile(optimizer=optimum,loss='categorical_crossentropy',metrics=['accuracy'])\n" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 44, 168 | "metadata": {}, 169 | "outputs": [ 170 | { 171 | "name": "stdout", 172 | "output_type": "stream", 173 | "text": [ 174 | "Model: \"sequential_2\"\n", 175 | "_________________________________________________________________\n", 176 | "Layer (type) Output Shape Param # \n", 177 | "=================================================================\n", 178 | "conv2d_7 (Conv2D) (None, 48, 48, 64) 1792 \n", 179 | "_________________________________________________________________\n", 180 | "batch_normalization_7 (Batch (None, 48, 48, 64) 256 \n", 181 | "_________________________________________________________________\n", 182 | "activation_7 (Activation) (None, 48, 48, 64) 0 \n", 183 | "_________________________________________________________________\n", 184 | "max_pooling2d_7 (MaxPooling2 (None, 24, 24, 64) 0 \n", 185 | "_________________________________________________________________\n", 186 | "dropout_5 (Dropout) (None, 24, 24, 64) 0 \n", 187 | "_________________________________________________________________\n", 188 | "conv2d_8 (Conv2D) (None, 24, 24, 128) 204928 \n", 189 | "_________________________________________________________________\n", 190 | "batch_normalization_8 (Batch (None, 24, 24, 128) 512 \n", 191 | "_________________________________________________________________\n", 192 | "activation_8 (Activation) (None, 24, 24, 128) 0 \n", 193 | "_________________________________________________________________\n", 194 | "max_pooling2d_8 (MaxPooling2 (None, 12, 12, 128) 0 \n", 195 | "_________________________________________________________________\n", 196 | "dropout_6 (Dropout) (None, 12, 12, 128) 0 \n", 197 | "_________________________________________________________________\n", 198 | "conv2d_9 (Conv2D) (None, 12, 12, 256) 295168 \n", 199 | "_________________________________________________________________\n", 200 | "batch_normalization_9 (Batch (None, 12, 12, 256) 1024 \n", 201 | "_________________________________________________________________\n", 202 | "activation_9 (Activation) (None, 12, 12, 256) 0 \n", 203 | "_________________________________________________________________\n", 204 | "max_pooling2d_9 (MaxPooling2 (None, 6, 6, 256) 0 \n", 205 | "_________________________________________________________________\n", 206 | "dropout_7 (Dropout) (None, 6, 6, 256) 0 \n", 207 | "_________________________________________________________________\n", 208 | "conv2d_10 (Conv2D) (None, 6, 6, 512) 1180160 \n", 209 | "_________________________________________________________________\n", 210 | "batch_normalization_10 (Batc (None, 6, 6, 512) 2048 \n", 211 | "_________________________________________________________________\n", 212 | "activation_10 (Activation) (None, 6, 6, 512) 0 \n", 213 | "_________________________________________________________________\n", 214 | "max_pooling2d_10 (MaxPooling (None, 3, 3, 512) 0 \n", 215 | "_________________________________________________________________\n", 216 | "dropout_8 (Dropout) (None, 3, 3, 512) 0 \n", 217 | "_________________________________________________________________\n", 218 | "conv2d_11 (Conv2D) (None, 3, 3, 512) 2359808 \n", 219 | "_________________________________________________________________\n", 220 | "batch_normalization_11 (Batc (None, 3, 3, 512) 2048 \n", 221 | "_________________________________________________________________\n", 222 | "activation_11 (Activation) (None, 3, 3, 512) 0 \n", 223 | "_________________________________________________________________\n", 224 | "max_pooling2d_11 (MaxPooling (None, 1, 1, 512) 0 \n", 225 | "_________________________________________________________________\n", 226 | "dropout_9 (Dropout) (None, 1, 1, 512) 0 \n", 227 | "_________________________________________________________________\n", 228 | "flatten (Flatten) (None, 512) 0 \n", 229 | "_________________________________________________________________\n", 230 | "dense (Dense) (None, 256) 131328 \n", 231 | "_________________________________________________________________\n", 232 | "batch_normalization_12 (Batc (None, 256) 1024 \n", 233 | "_________________________________________________________________\n", 234 | "activation_12 (Activation) (None, 256) 0 \n", 235 | "_________________________________________________________________\n", 236 | "dropout_10 (Dropout) (None, 256) 0 \n", 237 | "_________________________________________________________________\n", 238 | "dense_1 (Dense) (None, 512) 131584 \n", 239 | "_________________________________________________________________\n", 240 | "batch_normalization_13 (Batc (None, 512) 2048 \n", 241 | "_________________________________________________________________\n", 242 | "activation_13 (Activation) (None, 512) 0 \n", 243 | "_________________________________________________________________\n", 244 | "dropout_11 (Dropout) (None, 512) 0 \n", 245 | "_________________________________________________________________\n", 246 | "dense_2 (Dense) (None, 15) 7695 \n", 247 | "=================================================================\n", 248 | "Total params: 4,321,423\n", 249 | "Trainable params: 4,316,943\n", 250 | "Non-trainable params: 4,480\n", 251 | "_________________________________________________________________\n" 252 | ] 253 | } 254 | ], 255 | "source": [ 256 | "\n", 257 | "detection.summary()" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": 45, 263 | "metadata": {}, 264 | "outputs": [ 265 | { 266 | "name": "stdout", 267 | "output_type": "stream", 268 | "text": [ 269 | "Epoch 1/10\n", 270 | "322/322 [==============================] - 911s 3s/step - loss: 1.7590 - accuracy: 0.4370 - val_loss: 5.0324 - val_accuracy: 0.3017\n", 271 | "Epoch 2/10\n", 272 | "322/322 [==============================] - 943s 3s/step - loss: 0.7205 - accuracy: 0.7608 - val_loss: 3.6178 - val_accuracy: 0.4134\n", 273 | "Epoch 3/10\n", 274 | "322/322 [==============================] - 932s 3s/step - loss: 0.5094 - accuracy: 0.8255 - val_loss: 1.7738 - val_accuracy: 0.5764\n", 275 | "Epoch 4/10\n", 276 | "322/322 [==============================] - 879s 3s/step - loss: 0.4032 - accuracy: 0.8660 - val_loss: 1.0060 - val_accuracy: 0.6973\n", 277 | "Epoch 5/10\n", 278 | "322/322 [==============================] - 891s 3s/step - loss: 0.3302 - accuracy: 0.8860 - val_loss: 2.8808 - val_accuracy: 0.3931\n", 279 | "Epoch 6/10\n", 280 | "322/322 [==============================] - 868s 3s/step - loss: 0.2741 - accuracy: 0.9101 - val_loss: 0.2733 - val_accuracy: 0.9123\n", 281 | "Epoch 7/10\n", 282 | "322/322 [==============================] - 5273s 16s/step - loss: 0.2402 - accuracy: 0.9193 - val_loss: 2.2209 - val_accuracy: 0.5650\n", 283 | "Epoch 8/10\n", 284 | "322/322 [==============================] - 899s 3s/step - loss: 0.2309 - accuracy: 0.9233 - val_loss: 1.1822 - val_accuracy: 0.7138\n", 285 | "Epoch 9/10\n", 286 | "322/322 [==============================] - 788s 2s/step - loss: 0.2015 - accuracy: 0.9366 - val_loss: 0.2936 - val_accuracy: 0.9049\n", 287 | "Epoch 10/10\n", 288 | "322/322 [==============================] - 809s 3s/step - loss: 0.1826 - accuracy: 0.9395 - val_loss: 0.2208 - val_accuracy: 0.9191\n" 289 | ] 290 | } 291 | ], 292 | "source": [ 293 | "ephocs=10\n", 294 | "steps_per_epoch=train_generator.n//train_generator.batch_size\n", 295 | "steps_per_epoch\n", 296 | "validation_steps=validation_generator.n//validation_generator.batch_size\n", 297 | "validation_steps\n", 298 | "detection.fit(x=train_generator,\n", 299 | " steps_per_epoch=steps_per_epoch,\n", 300 | " epochs=ephocs,\n", 301 | " validation_data=validation_generator,\n", 302 | " validation_steps=validation_steps)\n", 303 | "detection.save('Plant_Disease_Detection.h5')" 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "execution_count": 47, 309 | "metadata": {}, 310 | "outputs": [ 311 | { 312 | "data": { 313 | "text/plain": [ 314 | "'Tomato_healthy'" 315 | ] 316 | }, 317 | "execution_count": 47, 318 | "metadata": {}, 319 | "output_type": "execute_result" 320 | }, 321 | { 322 | "data": { 323 | "image/png": "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\n", 324 | "text/plain": [ 325 | "
" 326 | ] 327 | }, 328 | "metadata": { 329 | "needs_background": "light" 330 | }, 331 | "output_type": "display_data" 332 | } 333 | ], 334 | "source": [ 335 | "from tensorflow.keras.models import load_model\n", 336 | "Detection=load_model('Plant_Disease_Detection.h5')\n", 337 | "from tensorflow.keras.preprocessing import image\n", 338 | "import numpy as np\n", 339 | "import matplotlib.pyplot as plt\n", 340 | "import cv2\n", 341 | "test_img=image.load_img(\"C:/Users/KIIT/Desktop/Leaf_disease_detection/PlantVillage/plant_folder/Tomato_healthy/000bf685-b305-408b-91f4-37030f8e62db___GH_HL Leaf 308.1.jpg\",target_size=(48,48))\n", 342 | "plt.imshow(test_img)\n", 343 | "test_img=image.img_to_array(test_img)\n", 344 | "test_img=np.expand_dims(test_img,axis=0)\n", 345 | "result=Detection.predict(test_img)\n", 346 | "a=result.argmax()\n", 347 | "# print('a:',a)\n", 348 | "classes=train_generator.class_indices\n", 349 | "# print(classes)\n", 350 | "# print(len(classes))\n", 351 | "category=[]\n", 352 | "for i in classes:\n", 353 | " category.append(i)\n", 354 | "for i in range(len(classes)):\n", 355 | " if(i==a):\n", 356 | " output=category[i]\n", 357 | "output " 358 | ] 359 | }, 360 | { 361 | "cell_type": "code", 362 | "execution_count": null, 363 | "metadata": {}, 364 | "outputs": [], 365 | "source": [] 366 | } 367 | ], 368 | "metadata": { 369 | "kernelspec": { 370 | "display_name": "Python 3", 371 | "language": "python", 372 | "name": "python3" 373 | }, 374 | "language_info": { 375 | "codemirror_mode": { 376 | "name": "ipython", 377 | "version": 3 378 | }, 379 | "file_extension": ".py", 380 | "mimetype": "text/x-python", 381 | "name": "python", 382 | "nbconvert_exporter": "python", 383 | "pygments_lexer": "ipython3", 384 | "version": "3.7.4" 385 | } 386 | }, 387 | "nbformat": 4, 388 | "nbformat_minor": 2 389 | } 390 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Leaf-Disease-Detection-Using-Image-Processing 2 | Agricultural productivity is something on which economy highly depends. This is the one of the reasons that disease detection in plants plays an important role in agriculture field, as having disease in plants are quite natural. If proper care is not taken in this area then it causes serious effects on plants and due to which respective product quality, quantity or productivity is affected. For instance a disease named little leaf disease is a hazardous disease found in pine trees in United States. Detection of plant disease through some automatic technique is beneficial as it reduces a large work of monitoring in big farms of crops, and at very early stage itself it detects the symptoms of diseases i.e. when they appear on plant leaves. This paper introduces an efficient approach to identify healthy and diseased or an infected leaf using image processing and machine learning techniques. Various diseases damage the chlorophyll of leaves and affect with brown or black marks on the leaf area. These can be detected using image prepossessing, image segmentation. Support Vector Machine (SVM) is one of the machine learning algorithms is used for classification. The Convolutional Neural Network (CNN) resulted in a improved accuracy of recognition compared to the SVM approach. 3 | -------------------------------------------------------------------------------- /classify_leaves_SVM.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 6, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "import numpy as np\n", 10 | "import pandas as pd\n", 11 | "import os\n", 12 | "import string" 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": 7, 18 | "metadata": {}, 19 | "outputs": [], 20 | "source": [ 21 | "dataset = pd.read_csv(\"plant_village.csv\")" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 8, 27 | "metadata": {}, 28 | "outputs": [ 29 | { 30 | "data": { 31 | "text/html": [ 32 | "
\n", 33 | "\n", 46 | "\n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | " \n", 280 | " \n", 281 | " \n", 282 | " \n", 283 | " \n", 284 | " \n", 285 | " \n", 286 | " \n", 287 | " \n", 288 | " \n", 289 | " \n", 290 | " \n", 291 | " \n", 292 | " \n", 293 | " \n", 294 | " \n", 295 | " \n", 296 | " \n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | " \n", 422 | " \n", 423 | " \n", 424 | " \n", 425 | " \n", 426 | " \n", 427 | " \n", 428 | " \n", 429 | " \n", 430 | " \n", 431 | " \n", 432 | " \n", 433 | " \n", 434 | " \n", 435 | " \n", 436 | " \n", 437 | " \n", 438 | " \n", 439 | " \n", 440 | " \n", 441 | " \n", 442 | " \n", 443 | " \n", 444 | " \n", 445 | " \n", 446 | " \n", 447 | " \n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | "
Unnamed: 0mean_rmean_gmean_bstddev_rstddev_gstddev_bcontrastcorrelationinverse_difference_momentsentropy
0092.509664123.772174115.99488133.99588230.67494037.516841141.2458260.9266680.20689911.680282
1082.47544188.82020798.83242537.66114334.03577546.192337223.6792410.9121550.14200512.679627
20114.306123126.90642198.87677729.47180223.91805137.84922654.6783670.9578590.34237010.758493
30125.301169134.151762124.03617851.00806844.35418859.2836711158.1884280.7311480.06164514.094453
40111.720339115.258361111.06383255.79441547.88842864.473558506.0243590.9034270.13041813.272624
50106.409224108.721954130.98161824.46358218.14303138.716076108.7351260.8755950.19607811.287765
6093.097803107.912752100.01747443.90277239.76193152.662111254.0711020.9253550.12813412.951365
70104.429062111.851273109.93169356.93025450.56410464.346819704.1169730.8745790.12924813.605420
80129.404691138.095249121.77290849.04238742.70468858.295191499.1040080.8778110.11165712.977689
90109.457106108.060377111.98697136.08844527.60686352.47770943.9030450.9768200.35322310.693878
100100.748657115.644518124.91117135.53320330.74304152.06072290.0006630.9598360.23885111.431990
11096.753229114.15972399.59828647.27256442.76287057.401277626.5945930.8420390.12869013.410290
120107.108624110.356870115.63669226.17908320.27384639.60832332.7153670.9646670.4159459.924318
130104.822735113.308867105.18636557.77328150.73344266.6799651124.6168290.8044760.08239514.140149
14084.59030297.10365892.93362432.91012630.71705048.049434150.1678550.9261910.16208112.136934
150117.633999126.442210120.93544835.31612827.19272647.31117269.4922110.9625140.22621911.277493
160123.295911131.071122113.59859436.30630925.85820541.131928229.0353230.8683940.10962212.468313
170111.600364131.313225104.65423848.57877439.88120259.459647358.6633920.8992430.14380212.775604
180101.071925108.062248118.24873830.88511328.05073744.31564063.4525900.9632560.25538111.331872
19067.04913091.19092492.90914434.33730429.05702739.90305489.9391040.9556770.23053911.076567
20091.75590999.26718592.28092125.59014217.62380530.49691080.9457890.8946860.20697011.153970
21092.549419109.466051104.97652430.23113923.13722441.728130288.8002640.7700010.10575212.438861
220102.255659108.301202115.96158425.78672122.58700941.88328688.5675530.9225930.20633011.425238
23096.17607298.39468687.58461932.60408628.69074545.748030335.8758410.8068770.12579512.562773
240134.436626148.706411120.16193341.96447137.07078553.441023463.5163190.8350290.09211913.074115
250102.454105118.18122386.75631351.57054345.05434661.346504850.0830070.8102050.09900113.566597
26094.210263107.32454194.93122845.94864838.57852556.854261293.2762620.9159090.15458712.770534
27095.552522109.78121592.73495547.50174536.28977355.222719119.3685410.9643780.18036412.189702
280122.843872134.987061117.63857643.92839233.79225356.320869424.4281940.8433240.13324812.886490
29092.47337596.071259105.47171024.39555417.52376738.49863190.3439120.8766550.17465511.153522
\n", 486 | "
" 487 | ], 488 | "text/plain": [ 489 | " Unnamed: 0 mean_r mean_g mean_b stddev_r stddev_g \\\n", 490 | "0 0 92.509664 123.772174 115.994881 33.995882 30.674940 \n", 491 | "1 0 82.475441 88.820207 98.832425 37.661143 34.035775 \n", 492 | "2 0 114.306123 126.906421 98.876777 29.471802 23.918051 \n", 493 | "3 0 125.301169 134.151762 124.036178 51.008068 44.354188 \n", 494 | "4 0 111.720339 115.258361 111.063832 55.794415 47.888428 \n", 495 | "5 0 106.409224 108.721954 130.981618 24.463582 18.143031 \n", 496 | "6 0 93.097803 107.912752 100.017474 43.902772 39.761931 \n", 497 | "7 0 104.429062 111.851273 109.931693 56.930254 50.564104 \n", 498 | "8 0 129.404691 138.095249 121.772908 49.042387 42.704688 \n", 499 | "9 0 109.457106 108.060377 111.986971 36.088445 27.606863 \n", 500 | "10 0 100.748657 115.644518 124.911171 35.533203 30.743041 \n", 501 | "11 0 96.753229 114.159723 99.598286 47.272564 42.762870 \n", 502 | "12 0 107.108624 110.356870 115.636692 26.179083 20.273846 \n", 503 | "13 0 104.822735 113.308867 105.186365 57.773281 50.733442 \n", 504 | "14 0 84.590302 97.103658 92.933624 32.910126 30.717050 \n", 505 | "15 0 117.633999 126.442210 120.935448 35.316128 27.192726 \n", 506 | "16 0 123.295911 131.071122 113.598594 36.306309 25.858205 \n", 507 | "17 0 111.600364 131.313225 104.654238 48.578774 39.881202 \n", 508 | "18 0 101.071925 108.062248 118.248738 30.885113 28.050737 \n", 509 | "19 0 67.049130 91.190924 92.909144 34.337304 29.057027 \n", 510 | "20 0 91.755909 99.267185 92.280921 25.590142 17.623805 \n", 511 | "21 0 92.549419 109.466051 104.976524 30.231139 23.137224 \n", 512 | "22 0 102.255659 108.301202 115.961584 25.786721 22.587009 \n", 513 | "23 0 96.176072 98.394686 87.584619 32.604086 28.690745 \n", 514 | "24 0 134.436626 148.706411 120.161933 41.964471 37.070785 \n", 515 | "25 0 102.454105 118.181223 86.756313 51.570543 45.054346 \n", 516 | "26 0 94.210263 107.324541 94.931228 45.948648 38.578525 \n", 517 | "27 0 95.552522 109.781215 92.734955 47.501745 36.289773 \n", 518 | "28 0 122.843872 134.987061 117.638576 43.928392 33.792253 \n", 519 | "29 0 92.473375 96.071259 105.471710 24.395554 17.523767 \n", 520 | "\n", 521 | " stddev_b contrast correlation inverse_difference_moments entropy \n", 522 | "0 37.516841 141.245826 0.926668 0.206899 11.680282 \n", 523 | "1 46.192337 223.679241 0.912155 0.142005 12.679627 \n", 524 | "2 37.849226 54.678367 0.957859 0.342370 10.758493 \n", 525 | "3 59.283671 1158.188428 0.731148 0.061645 14.094453 \n", 526 | "4 64.473558 506.024359 0.903427 0.130418 13.272624 \n", 527 | "5 38.716076 108.735126 0.875595 0.196078 11.287765 \n", 528 | "6 52.662111 254.071102 0.925355 0.128134 12.951365 \n", 529 | "7 64.346819 704.116973 0.874579 0.129248 13.605420 \n", 530 | "8 58.295191 499.104008 0.877811 0.111657 12.977689 \n", 531 | "9 52.477709 43.903045 0.976820 0.353223 10.693878 \n", 532 | "10 52.060722 90.000663 0.959836 0.238851 11.431990 \n", 533 | "11 57.401277 626.594593 0.842039 0.128690 13.410290 \n", 534 | "12 39.608323 32.715367 0.964667 0.415945 9.924318 \n", 535 | "13 66.679965 1124.616829 0.804476 0.082395 14.140149 \n", 536 | "14 48.049434 150.167855 0.926191 0.162081 12.136934 \n", 537 | "15 47.311172 69.492211 0.962514 0.226219 11.277493 \n", 538 | "16 41.131928 229.035323 0.868394 0.109622 12.468313 \n", 539 | "17 59.459647 358.663392 0.899243 0.143802 12.775604 \n", 540 | "18 44.315640 63.452590 0.963256 0.255381 11.331872 \n", 541 | "19 39.903054 89.939104 0.955677 0.230539 11.076567 \n", 542 | "20 30.496910 80.945789 0.894686 0.206970 11.153970 \n", 543 | "21 41.728130 288.800264 0.770001 0.105752 12.438861 \n", 544 | "22 41.883286 88.567553 0.922593 0.206330 11.425238 \n", 545 | "23 45.748030 335.875841 0.806877 0.125795 12.562773 \n", 546 | "24 53.441023 463.516319 0.835029 0.092119 13.074115 \n", 547 | "25 61.346504 850.083007 0.810205 0.099001 13.566597 \n", 548 | "26 56.854261 293.276262 0.915909 0.154587 12.770534 \n", 549 | "27 55.222719 119.368541 0.964378 0.180364 12.189702 \n", 550 | "28 56.320869 424.428194 0.843324 0.133248 12.886490 \n", 551 | "29 38.498631 90.343912 0.876655 0.174655 11.153522 " 552 | ] 553 | }, 554 | "execution_count": 8, 555 | "metadata": {}, 556 | "output_type": "execute_result" 557 | } 558 | ], 559 | "source": [ 560 | "dataset.head(30)" 561 | ] 562 | }, 563 | { 564 | "cell_type": "code", 565 | "execution_count": 9, 566 | "metadata": {}, 567 | "outputs": [ 568 | { 569 | "data": { 570 | "text/plain": [ 571 | "pandas.core.frame.DataFrame" 572 | ] 573 | }, 574 | "execution_count": 9, 575 | "metadata": {}, 576 | "output_type": "execute_result" 577 | } 578 | ], 579 | "source": [ 580 | "type(dataset)" 581 | ] 582 | }, 583 | { 584 | "cell_type": "code", 585 | "execution_count": 10, 586 | "metadata": {}, 587 | "outputs": [], 588 | "source": [ 589 | "maindir = r'C:\\Users\\Gujjar Boy\\Downloads\\Programs\\A Final Year Project'\n", 590 | "ds_path = maindir + \"\\\\crowdai\"\n", 591 | "img_files = os.listdir(ds_path)" 592 | ] 593 | }, 594 | { 595 | "cell_type": "code", 596 | "execution_count": 11, 597 | "metadata": {}, 598 | "outputs": [ 599 | { 600 | "data": { 601 | "text/plain": [ 602 | "'1000.jpg'" 603 | ] 604 | }, 605 | "execution_count": 11, 606 | "metadata": {}, 607 | "output_type": "execute_result" 608 | } 609 | ], 610 | "source": [ 611 | "img_files[0]" 612 | ] 613 | }, 614 | { 615 | "cell_type": "code", 616 | "execution_count": 12, 617 | "metadata": {}, 618 | "outputs": [ 619 | { 620 | "name": "stdout", 621 | "output_type": "stream", 622 | "text": [ 623 | "34\n" 624 | ] 625 | } 626 | ], 627 | "source": [ 628 | "breakpoints = [1000,1269,1270,1549,1550,1673,1674,2386,2387,2972,2973,3482,3483,3840,3841,4031,4032,4550,4551,4924,4925,5369,5370,5845,5846,6397,6398,6817,6818,6988,6989,9309,9310,9999]\n", 629 | "print(len(breakpoints))" 630 | ] 631 | }, 632 | { 633 | "cell_type": "code", 634 | "execution_count": 13, 635 | "metadata": {}, 636 | "outputs": [], 637 | "source": [ 638 | "\n", 639 | "target_list = []\n", 640 | "for file in img_files:\n", 641 | " target_num = int(file.split(\".\")[0])\n", 642 | " #print(target_num)\n", 643 | " flag = 0\n", 644 | " i = 0 \n", 645 | " for i in range(0,len(breakpoints),2):\n", 646 | " if((target_num >= breakpoints[i]) and (target_num <= breakpoints[i+1])):\n", 647 | " flag = 1\n", 648 | " break\n", 649 | " \n", 650 | " if(flag==1):\n", 651 | " target = int((i/2))\n", 652 | " target_list.append(target)" 653 | ] 654 | }, 655 | { 656 | "cell_type": "code", 657 | "execution_count": 14, 658 | "metadata": {}, 659 | "outputs": [ 660 | { 661 | "data": { 662 | "text/plain": [ 663 | "array([ 0, 0, 0, ..., 16, 16, 16])" 664 | ] 665 | }, 666 | "execution_count": 14, 667 | "metadata": {}, 668 | "output_type": "execute_result" 669 | } 670 | ], 671 | "source": [ 672 | "y = np.array(target_list)\n", 673 | "y" 674 | ] 675 | }, 676 | { 677 | "cell_type": "code", 678 | "execution_count": 15, 679 | "metadata": {}, 680 | "outputs": [], 681 | "source": [ 682 | "\n", 683 | "X = dataset.iloc[:,1:]" 684 | ] 685 | }, 686 | { 687 | "cell_type": "code", 688 | "execution_count": 16, 689 | "metadata": {}, 690 | "outputs": [ 691 | { 692 | "data": { 693 | "text/html": [ 694 | "
\n", 695 | "\n", 708 | "\n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | "
mean_rmean_gmean_bstddev_rstddev_gstddev_bcontrastcorrelationinverse_difference_momentsentropy
092.509664123.772174115.99488133.99588230.67494037.516841141.2458260.9266680.20689911.680282
182.47544188.82020798.83242537.66114334.03577546.192337223.6792410.9121550.14200512.679627
2114.306123126.90642198.87677729.47180223.91805137.84922654.6783670.9578590.34237010.758493
3125.301169134.151762124.03617851.00806844.35418859.2836711158.1884280.7311480.06164514.094453
4111.720339115.258361111.06383255.79441547.88842864.473558506.0243590.9034270.13041813.272624
\n", 792 | "
" 793 | ], 794 | "text/plain": [ 795 | " mean_r mean_g mean_b stddev_r stddev_g stddev_b \\\n", 796 | "0 92.509664 123.772174 115.994881 33.995882 30.674940 37.516841 \n", 797 | "1 82.475441 88.820207 98.832425 37.661143 34.035775 46.192337 \n", 798 | "2 114.306123 126.906421 98.876777 29.471802 23.918051 37.849226 \n", 799 | "3 125.301169 134.151762 124.036178 51.008068 44.354188 59.283671 \n", 800 | "4 111.720339 115.258361 111.063832 55.794415 47.888428 64.473558 \n", 801 | "\n", 802 | " contrast correlation inverse_difference_moments entropy \n", 803 | "0 141.245826 0.926668 0.206899 11.680282 \n", 804 | "1 223.679241 0.912155 0.142005 12.679627 \n", 805 | "2 54.678367 0.957859 0.342370 10.758493 \n", 806 | "3 1158.188428 0.731148 0.061645 14.094453 \n", 807 | "4 506.024359 0.903427 0.130418 13.272624 " 808 | ] 809 | }, 810 | "execution_count": 16, 811 | "metadata": {}, 812 | "output_type": "execute_result" 813 | } 814 | ], 815 | "source": [ 816 | "X.head(5)" 817 | ] 818 | }, 819 | { 820 | "cell_type": "code", 821 | "execution_count": 15, 822 | "metadata": {}, 823 | "outputs": [ 824 | { 825 | "data": { 826 | "text/plain": [ 827 | "array([0, 0, 0, 0, 0])" 828 | ] 829 | }, 830 | "execution_count": 15, 831 | "metadata": {}, 832 | "output_type": "execute_result" 833 | } 834 | ], 835 | "source": [ 836 | "y[0:5]" 837 | ] 838 | }, 839 | { 840 | "cell_type": "code", 841 | "execution_count": 16, 842 | "metadata": {}, 843 | "outputs": [], 844 | "source": [ 845 | "#Train test split" 846 | ] 847 | }, 848 | { 849 | "cell_type": "code", 850 | "execution_count": 17, 851 | "metadata": {}, 852 | "outputs": [], 853 | "source": [ 854 | "from sklearn.model_selection import train_test_split" 855 | ] 856 | }, 857 | { 858 | "cell_type": "code", 859 | "execution_count": 18, 860 | "metadata": {}, 861 | "outputs": [], 862 | "source": [ 863 | "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state = 142)" 864 | ] 865 | }, 866 | { 867 | "cell_type": "code", 868 | "execution_count": 19, 869 | "metadata": {}, 870 | "outputs": [ 871 | { 872 | "data": { 873 | "text/html": [ 874 | "
\n", 875 | "\n", 888 | "\n", 889 | " \n", 890 | " \n", 891 | " \n", 892 | " \n", 893 | " \n", 894 | " \n", 895 | " \n", 896 | " \n", 897 | " \n", 898 | " \n", 899 | " \n", 900 | " \n", 901 | " \n", 902 | " \n", 903 | " \n", 904 | " \n", 905 | " \n", 906 | " \n", 907 | " \n", 908 | " \n", 909 | " \n", 910 | " \n", 911 | " \n", 912 | " \n", 913 | " \n", 914 | " \n", 915 | " \n", 916 | " \n", 917 | " \n", 918 | " \n", 919 | " \n", 920 | " \n", 921 | " \n", 922 | " \n", 923 | " \n", 924 | " \n", 925 | " \n", 926 | " \n", 927 | " \n", 928 | " \n", 929 | " \n", 930 | " \n", 931 | " \n", 932 | " \n", 933 | " \n", 934 | " \n", 935 | " \n", 936 | " \n", 937 | " \n", 938 | " \n", 939 | " \n", 940 | " \n", 941 | " \n", 942 | " \n", 943 | " \n", 944 | " \n", 945 | " \n", 946 | " \n", 947 | " \n", 948 | " \n", 949 | " \n", 950 | " \n", 951 | " \n", 952 | " \n", 953 | " \n", 954 | " \n", 955 | " \n", 956 | " \n", 957 | " \n", 958 | " \n", 959 | " \n", 960 | " \n", 961 | " \n", 962 | " \n", 963 | " \n", 964 | " \n", 965 | " \n", 966 | " \n", 967 | " \n", 968 | " \n", 969 | " \n", 970 | " \n", 971 | "
mean_rmean_gmean_bstddev_rstddev_gstddev_bcontrastcorrelationinverse_difference_momentsentropy
3964110.072104159.233719131.96197227.14058624.46671227.38912695.1338170.9254000.17876111.490641
106782.56404398.890889109.42092839.29899238.46854551.228020164.4825050.9473800.15568412.454126
2401115.825688118.73773794.85772138.17935436.35317344.75859557.4678230.9787240.28997111.277982
4766104.578959118.87381890.25784068.74103352.76967468.411842566.7303540.9179080.08341413.676810
101139.361927145.180421137.46590165.47544761.57023169.279968817.5087870.8938930.13047213.343331
\n", 972 | "
" 973 | ], 974 | "text/plain": [ 975 | " mean_r mean_g mean_b stddev_r stddev_g stddev_b \\\n", 976 | "3964 110.072104 159.233719 131.961972 27.140586 24.466712 27.389126 \n", 977 | "1067 82.564043 98.890889 109.420928 39.298992 38.468545 51.228020 \n", 978 | "2401 115.825688 118.737737 94.857721 38.179354 36.353173 44.758595 \n", 979 | "4766 104.578959 118.873818 90.257840 68.741033 52.769674 68.411842 \n", 980 | "101 139.361927 145.180421 137.465901 65.475447 61.570231 69.279968 \n", 981 | "\n", 982 | " contrast correlation inverse_difference_moments entropy \n", 983 | "3964 95.133817 0.925400 0.178761 11.490641 \n", 984 | "1067 164.482505 0.947380 0.155684 12.454126 \n", 985 | "2401 57.467823 0.978724 0.289971 11.277982 \n", 986 | "4766 566.730354 0.917908 0.083414 13.676810 \n", 987 | "101 817.508787 0.893893 0.130472 13.343331 " 988 | ] 989 | }, 990 | "execution_count": 19, 991 | "metadata": {}, 992 | "output_type": "execute_result" 993 | } 994 | ], 995 | "source": [ 996 | "X_train.head(5)" 997 | ] 998 | }, 999 | { 1000 | "cell_type": "code", 1001 | "execution_count": 20, 1002 | "metadata": {}, 1003 | "outputs": [ 1004 | { 1005 | "data": { 1006 | "text/plain": [ 1007 | "(6299, 10)" 1008 | ] 1009 | }, 1010 | "execution_count": 20, 1011 | "metadata": {}, 1012 | "output_type": "execute_result" 1013 | } 1014 | ], 1015 | "source": [ 1016 | "X_train.shape" 1017 | ] 1018 | }, 1019 | { 1020 | "cell_type": "code", 1021 | "execution_count": 21, 1022 | "metadata": {}, 1023 | "outputs": [ 1024 | { 1025 | "data": { 1026 | "text/plain": [ 1027 | "array([10, 3, 5, 11, 0])" 1028 | ] 1029 | }, 1030 | "execution_count": 21, 1031 | "metadata": {}, 1032 | "output_type": "execute_result" 1033 | } 1034 | ], 1035 | "source": [ 1036 | "y_train[0:5]" 1037 | ] 1038 | }, 1039 | { 1040 | "cell_type": "code", 1041 | "execution_count": 22, 1042 | "metadata": {}, 1043 | "outputs": [], 1044 | "source": [ 1045 | "#Feature Scaling" 1046 | ] 1047 | }, 1048 | { 1049 | "cell_type": "code", 1050 | "execution_count": 23, 1051 | "metadata": {}, 1052 | "outputs": [], 1053 | "source": [ 1054 | "from sklearn.preprocessing import StandardScaler" 1055 | ] 1056 | }, 1057 | { 1058 | "cell_type": "code", 1059 | "execution_count": 24, 1060 | "metadata": {}, 1061 | "outputs": [], 1062 | "source": [ 1063 | "sc_X = StandardScaler()\n", 1064 | "X_train = sc_X.fit_transform(X_train)\n", 1065 | "X_test = sc_X.transform(X_test)" 1066 | ] 1067 | }, 1068 | { 1069 | "cell_type": "code", 1070 | "execution_count": 25, 1071 | "metadata": {}, 1072 | "outputs": [ 1073 | { 1074 | "data": { 1075 | "text/plain": [ 1076 | "array([[-0.27135619, 1.72574766, 1.297164 , -1.25987687, -1.07737475,\n", 1077 | " -1.74538858, -0.81620459, 0.21267105, -0.11418883, -0.47311907],\n", 1078 | " [-1.58551432, -1.06029926, 0.44147284, -0.37957632, 0.01614473,\n", 1079 | " 0.1912474 , -0.56039989, 0.57567253, -0.32973539, 0.25786502]])" 1080 | ] 1081 | }, 1082 | "execution_count": 25, 1083 | "metadata": {}, 1084 | "output_type": "execute_result" 1085 | } 1086 | ], 1087 | "source": [ 1088 | "X_train[0:2]" 1089 | ] 1090 | }, 1091 | { 1092 | "cell_type": "code", 1093 | "execution_count": 26, 1094 | "metadata": {}, 1095 | "outputs": [ 1096 | { 1097 | "data": { 1098 | "text/plain": [ 1099 | "array([10, 3])" 1100 | ] 1101 | }, 1102 | "execution_count": 26, 1103 | "metadata": {}, 1104 | "output_type": "execute_result" 1105 | } 1106 | ], 1107 | "source": [ 1108 | "y_train[0:2]" 1109 | ] 1110 | }, 1111 | { 1112 | "cell_type": "code", 1113 | "execution_count": 27, 1114 | "metadata": {}, 1115 | "outputs": [], 1116 | "source": [ 1117 | "#Applying SVM classifier model" 1118 | ] 1119 | }, 1120 | { 1121 | "cell_type": "code", 1122 | "execution_count": 28, 1123 | "metadata": {}, 1124 | "outputs": [], 1125 | "source": [ 1126 | "from sklearn import svm" 1127 | ] 1128 | }, 1129 | { 1130 | "cell_type": "code", 1131 | "execution_count": 29, 1132 | "metadata": {}, 1133 | "outputs": [ 1134 | { 1135 | "data": { 1136 | "text/plain": [ 1137 | "SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0,\n", 1138 | " decision_function_shape='ovr', degree=3, gamma=0.01, kernel='rbf',\n", 1139 | " max_iter=-1, probability=False, random_state=None, shrinking=True,\n", 1140 | " tol=0.001, verbose=False)" 1141 | ] 1142 | }, 1143 | "execution_count": 29, 1144 | "metadata": {}, 1145 | "output_type": "execute_result" 1146 | } 1147 | ], 1148 | "source": [ 1149 | "clf = svm.SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0,\n", 1150 | " decision_function_shape='ovr', degree=3, gamma=0.01, kernel='rbf',\n", 1151 | " max_iter=-1, probability=False, random_state=None, shrinking=True,\n", 1152 | " tol=0.001, verbose=False)\n", 1153 | "clf.fit(X_train,y_train)" 1154 | ] 1155 | }, 1156 | { 1157 | "cell_type": "code", 1158 | "execution_count": 30, 1159 | "metadata": {}, 1160 | "outputs": [], 1161 | "source": [ 1162 | "y_pred = clf.predict(X_test)" 1163 | ] 1164 | }, 1165 | { 1166 | "cell_type": "code", 1167 | "execution_count": 31, 1168 | "metadata": {}, 1169 | "outputs": [], 1170 | "source": [ 1171 | "from sklearn import metrics" 1172 | ] 1173 | }, 1174 | { 1175 | "cell_type": "code", 1176 | "execution_count": 32, 1177 | "metadata": {}, 1178 | "outputs": [ 1179 | { 1180 | "data": { 1181 | "text/plain": [ 1182 | "0.8314814814814815" 1183 | ] 1184 | }, 1185 | "execution_count": 32, 1186 | "metadata": {}, 1187 | "output_type": "execute_result" 1188 | } 1189 | ], 1190 | "source": [ 1191 | "metrics.accuracy_score(y_test, y_pred)" 1192 | ] 1193 | }, 1194 | { 1195 | "cell_type": "code", 1196 | "execution_count": 33, 1197 | "metadata": {}, 1198 | "outputs": [], 1199 | "source": [ 1200 | "from sklearn.model_selection import GridSearchCV\n" 1201 | ] 1202 | }, 1203 | { 1204 | "cell_type": "code", 1205 | "execution_count": 36, 1206 | "metadata": {}, 1207 | "outputs": [], 1208 | "source": [ 1209 | "parameters = [{'kernel': ['rbf'],\n", 1210 | " 'gamma': [1e-4, 1e-3, 0.01, 0.1, 0.2, 0.5],\n", 1211 | " 'C': [1, 10, 100, 1000]},\n", 1212 | " {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}\n", 1213 | " ]" 1214 | ] 1215 | }, 1216 | { 1217 | "cell_type": "code", 1218 | "execution_count": 37, 1219 | "metadata": {}, 1220 | "outputs": [ 1221 | { 1222 | "data": { 1223 | "text/plain": [ 1224 | "GridSearchCV(cv=5, error_score='raise',\n", 1225 | " estimator=SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,\n", 1226 | " decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf',\n", 1227 | " max_iter=-1, probability=False, random_state=None, shrinking=True,\n", 1228 | " tol=0.001, verbose=False),\n", 1229 | " fit_params=None, iid=True, n_jobs=1,\n", 1230 | " param_grid=[{'kernel': ['rbf'], 'gamma': [0.0001, 0.001, 0.01, 0.1, 0.2, 0.5], 'C': [1, 10, 100, 1000]}, {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}],\n", 1231 | " pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n", 1232 | " scoring=None, verbose=0)" 1233 | ] 1234 | }, 1235 | "execution_count": 37, 1236 | "metadata": {}, 1237 | "output_type": "execute_result" 1238 | } 1239 | ], 1240 | "source": [ 1241 | "svm_clf = GridSearchCV(svm.SVC(decision_function_shape='ovr'), parameters, cv=5)\n", 1242 | "svm_clf.fit(X_train, y_train)" 1243 | ] 1244 | }, 1245 | { 1246 | "cell_type": "code", 1247 | "execution_count": 38, 1248 | "metadata": {}, 1249 | "outputs": [ 1250 | { 1251 | "data": { 1252 | "text/plain": [ 1253 | "{'C': 100, 'gamma': 0.1, 'kernel': 'rbf'}" 1254 | ] 1255 | }, 1256 | "execution_count": 38, 1257 | "metadata": {}, 1258 | "output_type": "execute_result" 1259 | } 1260 | ], 1261 | "source": [ 1262 | "svm_clf.best_params_" 1263 | ] 1264 | }, 1265 | { 1266 | "cell_type": "code", 1267 | "execution_count": null, 1268 | "metadata": {}, 1269 | "outputs": [], 1270 | "source": [ 1271 | "print(metrics.classification_report(y_test, y_pred))" 1272 | ] 1273 | }, 1274 | { 1275 | "cell_type": "code", 1276 | "execution_count": 46, 1277 | "metadata": {}, 1278 | "outputs": [ 1279 | { 1280 | "data": { 1281 | "text/plain": [ 1282 | "3" 1283 | ] 1284 | }, 1285 | "execution_count": 46, 1286 | "metadata": {}, 1287 | "output_type": "execute_result" 1288 | } 1289 | ], 1290 | "source": [ 1291 | "int(int(clf.predict(X_train[0:1])))" 1292 | ] 1293 | }, 1294 | { 1295 | "cell_type": "code", 1296 | "execution_count": 39, 1297 | "metadata": {}, 1298 | "outputs": [ 1299 | { 1300 | "data": { 1301 | "text/plain": [ 1302 | "SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0,\n", 1303 | " decision_function_shape='ovr', degree=3, gamma=0.1, kernel='rbf',\n", 1304 | " max_iter=-1, probability=False, random_state=None, shrinking=True,\n", 1305 | " tol=0.001, verbose=False)" 1306 | ] 1307 | }, 1308 | "execution_count": 39, 1309 | "metadata": {}, 1310 | "output_type": "execute_result" 1311 | } 1312 | ], 1313 | "source": [ 1314 | "clf = svm.SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0,\n", 1315 | " decision_function_shape='ovr', degree=3, gamma=0.1, kernel='rbf',\n", 1316 | " max_iter=-1, probability=False, random_state=None, shrinking=True,\n", 1317 | " tol=0.001, verbose=False)\n", 1318 | "clf.fit(X_train,y_train)" 1319 | ] 1320 | }, 1321 | { 1322 | "cell_type": "code", 1323 | "execution_count": 40, 1324 | "metadata": {}, 1325 | "outputs": [], 1326 | "source": [ 1327 | "y_pred = clf.predict(X_test)" 1328 | ] 1329 | }, 1330 | { 1331 | "cell_type": "code", 1332 | "execution_count": 41, 1333 | "metadata": {}, 1334 | "outputs": [ 1335 | { 1336 | "data": { 1337 | "text/plain": [ 1338 | "0.8688888888888889" 1339 | ] 1340 | }, 1341 | "execution_count": 41, 1342 | "metadata": {}, 1343 | "output_type": "execute_result" 1344 | } 1345 | ], 1346 | "source": [ 1347 | "metrics.accuracy_score(y_test, y_pred)" 1348 | ] 1349 | }, 1350 | { 1351 | "cell_type": "code", 1352 | "execution_count": null, 1353 | "metadata": {}, 1354 | "outputs": [], 1355 | "source": [] 1356 | } 1357 | ], 1358 | "metadata": { 1359 | "kernelspec": { 1360 | "display_name": "Python 3", 1361 | "language": "python", 1362 | "name": "python3" 1363 | }, 1364 | "language_info": { 1365 | "codemirror_mode": { 1366 | "name": "ipython", 1367 | "version": 3 1368 | }, 1369 | "file_extension": ".py", 1370 | "mimetype": "text/x-python", 1371 | "name": "python", 1372 | "nbconvert_exporter": "python", 1373 | "pygments_lexer": "ipython3", 1374 | "version": "3.7.4" 1375 | } 1376 | }, 1377 | "nbformat": 4, 1378 | "nbformat_minor": 2 1379 | } 1380 | --------------------------------------------------------------------------------