Commit 79f827fb authored by RR Nimesha Manchalee's avatar RR Nimesha Manchalee

Disease classifier added

parent dc889df1
{
"cells": [
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"data_path = 'data/images/'\n",
"model_weights = 'weights/disease_classification.h5'\n",
"\n",
"batch_size = 32\n",
"valid_size = 16\n",
"color_mode = 'rgb'\n",
"\n",
"width = 299\n",
"height = 299\n",
"\n",
"target_size = (width, height)\n",
"input_shape = (width, height, 3)\n",
"\n",
"zoom_range = 0.3\n",
"shear_range = 0.3\n",
"shift_range = 0.3\n",
"rotation_range = 30\n",
"\n",
"val_split = 0.2\n",
"\n",
"dense_1 = 512\n",
"dense_2 = 256\n",
"dense_3 = 64\n",
"num_classes = 5\n",
"\n",
"epochs = 50\n",
"rate = 0.2\n",
"\n",
"verbose = 1"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'\n",
"\n",
"import cv2 as cv\n",
"import numpy as np\n",
"import pandas as pd\n",
"import tensorflow as tf\n",
"\n",
"from tensorflow.keras.activations import relu\n",
"from tensorflow.keras.models import Model, load_model\n",
"from tensorflow.keras.layers import Dense, BatchNormalization, Dropout\n",
"############################################################################################\n",
"\n",
"\n",
"#set model to train on GPU\n",
"# physical_devices = tf.config.experimental.list_physical_devices('GPU')\n",
"# tf.config.experimental.set_memory_growth(physical_devices[0], True)\n",
"\n",
"def preprocessing_function(img):\n",
" img = tf.keras.applications.xception.preprocess_input(img)\n",
" return img\n",
"\n",
"def image_data_generator():\n",
" train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(\n",
" rotation_range = rotation_range,\n",
" shear_range = shear_range,\n",
" zoom_range = zoom_range,\n",
" width_shift_range=shift_range,\n",
" height_shift_range=shift_range,\n",
" horizontal_flip = True,\n",
" validation_split= val_split,\n",
" preprocessing_function=preprocessing_function\n",
" )\n",
"\n",
" train_generator = train_datagen.flow_from_directory(\n",
" data_path,\n",
" target_size = target_size,\n",
" color_mode = color_mode,\n",
" batch_size = batch_size,\n",
" class_mode = 'categorical',\n",
" subset = 'training',\n",
" shuffle = True\n",
" )\n",
"\n",
" validation_generator = train_datagen.flow_from_directory(\n",
" data_path,\n",
" target_size = target_size,\n",
" color_mode = color_mode,\n",
" batch_size = valid_size,\n",
" class_mode = 'categorical',\n",
" subset = 'validation',\n",
" shuffle = False\n",
" )\n",
"\n",
" return train_generator, validation_generator"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found 4031 images belonging to 5 classes.\n",
"Found 1005 images belonging to 5 classes.\n"
]
}
],
"source": [
"train_generator, validation_generator = image_data_generator()"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{0: 'CCI_Caterpillars',\n",
" 1: 'CCI_Leaflets',\n",
" 2: 'WCLWD_DryingofLeaflets',\n",
" 3: 'WCLWD_Flaccidity',\n",
" 4: 'WCLWD_Yellowing'}"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"class_dict = train_generator.class_indices\n",
"class_dict_rev = {v: k for k, v in class_dict.items()}\n",
"class_dict_rev"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"class DiseaseClassification(object):\n",
" def __init__(self):\n",
" self.train_generator = train_generator\n",
" self.validation_generator = validation_generator\n",
" self.train_step = self.train_generator.samples // batch_size\n",
" self.validation_step = self.validation_generator.samples // valid_size\n",
"\n",
" self.accuracy = tf.keras.metrics.CategoricalAccuracy()\n",
" self.recall = tf.keras.metrics.Recall()\n",
" self.precision = tf.keras.metrics.Precision()\n",
" self.auc = tf.keras.metrics.AUC()\n",
"\n",
" self.id2disease = {v:k for k, v in self.train_generator.class_indices.items()}\n",
"\n",
" def classifier(self, x):\n",
" if not self.trainable:\n",
" x = Dense(dense_1, activation='relu')(x)\n",
" x = Dense(dense_1)(x)\n",
" x = BatchNormalization()(x)\n",
" x = relu(x)\n",
" x = Dropout(rate)(x)\n",
"\n",
" x = Dense(dense_2, activation='relu')(x)\n",
" x = Dense(dense_2)(x)\n",
" x = BatchNormalization()(x)\n",
" x = relu(x)\n",
" x = Dropout(rate)(x)\n",
"\n",
" x = Dense(dense_3, activation='relu')(x)\n",
" x = Dense(dense_3)(x)\n",
" x = BatchNormalization()(x)\n",
" x = relu(x)\n",
" x = Dropout(rate)(x)\n",
" return x\n",
"\n",
" def model_conversion(self, trainable):\n",
" functional_model = tf.keras.applications.Xception(weights=\"imagenet\")\n",
" functional_model.trainable = trainable\n",
"\n",
" self.trainable = trainable\n",
"\n",
" inputs = functional_model.input\n",
"\n",
" x = functional_model.layers[-2].output\n",
" x = self.classifier(x)\n",
" outputs = Dense(num_classes, activation='softmax')(x)\n",
"\n",
" model = Model(\n",
" inputs=inputs,\n",
" outputs=outputs\n",
" )\n",
" \n",
" self.model = model\n",
" # self.model.summary()\n",
"\n",
" def train(self):\n",
" callback = tf.keras.callbacks.EarlyStopping(\n",
" monitor='val_loss', \n",
" patience=5\n",
" )\n",
"\n",
" self.model.compile(\n",
" optimizer='Adam',\n",
" loss='categorical_crossentropy',\n",
" metrics=[\n",
" self.accuracy,\n",
" self.recall,\n",
" self.precision,\n",
" self.auc\n",
" ]\n",
" )\n",
" self.model.fit(\n",
" self.train_generator,\n",
" steps_per_epoch= self.train_step,\n",
" validation_data= self.validation_generator,\n",
" validation_steps = self.validation_step,\n",
" epochs=epochs,\n",
" verbose=verbose,\n",
" callbacks=[callback]\n",
" )\n",
"\n",
" def save_model(self):\n",
" self.model.save(model_weights)\n",
"\n",
" def load_model(self):\n",
" self.model = load_model(model_weights)\n",
" self.model.compile(\n",
" optimizer='Adam',\n",
" loss='categorical_crossentropy',\n",
" metrics=[\n",
" self.accuracy,\n",
" self.recall,\n",
" self.precision\n",
" ]\n",
" )\n",
"\n",
" def predict(self, x):\n",
" x = preprocessing_function(x)\n",
" x = np.expand_dims(x, axis=0)\n",
" P = self.model.predict(x)\n",
" disease_id = np.argmax(P)\n",
" disease = self.id2disease[disease_id]\n",
" return disease\n",
" \n",
" def process(self):\n",
" if not os.path.exists(model_weights):\n",
" self.model_conversion(False)\n",
" self.train()\n",
" self.save_model()\n",
" else:\n",
" self.load_model()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/50\n",
"125/125 [==============================] - 148s 1s/step - loss: 0.5661 - categorical_accuracy: 0.7944 - recall: 0.7097 - precision: 0.8789 - auc: 0.9607 - val_loss: 0.5780 - val_categorical_accuracy: 0.7984 - val_recall: 0.7117 - val_precision: 0.8803 - val_auc: 0.9592\n",
"Epoch 2/50\n",
"125/125 [==============================] - 160s 1s/step - loss: 0.2862 - categorical_accuracy: 0.9030 - recall: 0.8837 - precision: 0.9201 - auc: 0.9889 - val_loss: 0.3297 - val_categorical_accuracy: 0.8690 - val_recall: 0.8508 - val_precision: 0.8819 - val_auc: 0.9858\n",
"Epoch 3/50\n",
"125/125 [==============================] - 142s 1s/step - loss: 0.2331 - categorical_accuracy: 0.9200 - recall: 0.9092 - precision: 0.9294 - auc: 0.9917 - val_loss: 0.5819 - val_categorical_accuracy: 0.8246 - val_recall: 0.8216 - val_precision: 0.8257 - val_auc: 0.9713\n",
"Epoch 4/50\n",
"125/125 [==============================] - 137s 1s/step - loss: 0.2084 - categorical_accuracy: 0.9207 - recall: 0.9157 - precision: 0.9294 - auc: 0.9937 - val_loss: 0.1323 - val_categorical_accuracy: 0.9506 - val_recall: 0.9486 - val_precision: 0.9515 - val_auc: 0.9976\n",
"Epoch 5/50\n",
"125/125 [==============================] - 139s 1s/step - loss: 0.1792 - categorical_accuracy: 0.9352 - recall: 0.9280 - precision: 0.9431 - auc: 0.9952 - val_loss: 0.1164 - val_categorical_accuracy: 0.9526 - val_recall: 0.9506 - val_precision: 0.9564 - val_auc: 0.9982\n",
"Epoch 6/50\n",
"125/125 [==============================] - 141s 1s/step - loss: 0.1762 - categorical_accuracy: 0.9397 - recall: 0.9335 - precision: 0.9465 - auc: 0.9952 - val_loss: 0.3771 - val_categorical_accuracy: 0.8659 - val_recall: 0.8629 - val_precision: 0.8708 - val_auc: 0.9849\n",
"Epoch 7/50\n",
"125/125 [==============================] - 136s 1s/step - loss: 0.1890 - categorical_accuracy: 0.9335 - recall: 0.9282 - precision: 0.9407 - auc: 0.9945 - val_loss: 0.1592 - val_categorical_accuracy: 0.9395 - val_recall: 0.9355 - val_precision: 0.9450 - val_auc: 0.9964\n",
"Epoch 8/50\n",
"125/125 [==============================] - 140s 1s/step - loss: 0.1607 - categorical_accuracy: 0.9437 - recall: 0.9375 - precision: 0.9520 - auc: 0.9963 - val_loss: 0.4861 - val_categorical_accuracy: 0.8478 - val_recall: 0.8448 - val_precision: 0.8508 - val_auc: 0.9775\n",
"Epoch 9/50\n",
"125/125 [==============================] - 137s 1s/step - loss: 0.1472 - categorical_accuracy: 0.9510 - recall: 0.9452 - precision: 0.9541 - auc: 0.9966 - val_loss: 0.1752 - val_categorical_accuracy: 0.9405 - val_recall: 0.9375 - val_precision: 0.9432 - val_auc: 0.9953\n",
"Epoch 10/50\n",
"125/125 [==============================] - 139s 1s/step - loss: 0.1374 - categorical_accuracy: 0.9537 - recall: 0.9475 - precision: 0.9592 - auc: 0.9970 - val_loss: 0.1875 - val_categorical_accuracy: 0.9345 - val_recall: 0.9304 - val_precision: 0.9352 - val_auc: 0.9942\n"
]
}
],
"source": [
"model = DiseaseClassification()\n",
"model.process()"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Evaluation"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.metrics import classification_report, confusion_matrix "
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"63/63 [==============================] - 28s 454ms/step\n"
]
}
],
"source": [
"Y = validation_generator.classes\n",
"Y_pred = model.model.predict(validation_generator)\n",
"Y_pred = np.argmax(Y_pred, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" precision recall f1-score support\n",
"\n",
" CCI_Caterpillars 1.00 1.00 1.00 198\n",
" CCI_Leaflets 1.00 0.99 1.00 159\n",
"WCLWD_DryingofLeaflets 0.88 0.98 0.93 217\n",
" WCLWD_Flaccidity 0.93 0.88 0.91 215\n",
" WCLWD_Yellowing 0.93 0.88 0.90 216\n",
"\n",
" accuracy 0.94 1005\n",
" macro avg 0.95 0.95 0.95 1005\n",
" weighted avg 0.95 0.94 0.94 1005\n",
"\n"
]
}
],
"source": [
"# Classification Report\n",
"print(classification_report(Y, Y_pred, target_names=class_dict_rev.values()))"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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f7rIvg7YFt/froXn7To2bvhds2Z8ql07tys5OVnvvj9FUW3amo4F3TyrVHXo0OFfRwx5eXnlu0XFrl27tHTpUv3++++67bbbJEkffPCBOnbsqLffflvlypW7rhzGezhCQkJ0+vTlH4QqVqyYuyFgQkKCrFaryWhOY+mSH/X2+LGK7tdf877+RjVr1lLf6F46deqU6WgooOKe7tp1NFUjv9mZ7zUrdyer2ajluccLc7bkaf+k121yd7fo8am/6b731mj30XOa1quJSpfytHN62APf366F5+1aLl68oBo1aypmOAvowJy4uDgFBwerZs2a6tu3b57/36xbt07+/v65xYYktW3bVm5uboqPj7/uzzBecERFRem7776TJPXs2VODBg3SXXfdpYceekj333+/4XTO4YtZM9T1ge7qcn83Va1WTa+OGCVvb28tXrTQdDQU0KrdJzVx6V4t234832sysnJ08lxG7pF6MSu3LcDHQ2FlSujjFQe059g5HTp5QRN+3CMfz2KqEVKqKL4E2Bjf366F5+1aWt0ZrgEDBymq7V2mo8CJpKenKzU1Nc+Rnp5+Q/dq3769Pv/8cy1fvlzjxo3TypUr1aFDh9yNt5OSkhQcHJznPcWKFVNgYKCSkpKu+3OMD6maNm2acnJyJEn9+/dXUFCQ1q5dq86dOys6OtpwOseXmZGhXTt3qFfv//5dubm5qVmzFtq2dbPBZLCXplUDFT8ySikXMrVu32lNXPqnzl7IlCSduZCp/SfO6/4m5bXjr1RlZOXo4WYVdfJcurYfYU6Us+H727XwvAHH4chDqsaOHatRo0blOTdixAiNHDmywPd6+OGHc/9cv359NWjQQFWrVlVcXJzatGlT2Ki5jBccbm5ucnP7b0fLww8/nOeLxz87c/aMsrOzFRQUlOd8UFCQEhIOGEoFe1m156R+/uO4Dp++oIpBPhrSsaY+feY2PfjBOuX8/xGIT378uz56qrG2vnGXcqxWnTqfoac/2ZCnJwTOge9v18LzBnA9YmJiNHjw4DznvLy8bHLvKlWqqHTp0tq3b5/atGmjkJAQnThxIs81WVlZOn36dL7zPq7F+JAqSfr111/12GOPqXnz5vrrr78kSV988YVWr179r++1ZbcS4Oj+b8sxLd95Qn8mndcvO06o96cb1LCiv5pW/e8PKCPvr6NT59P18Ifr1W3SOv2y47imPd1EZUrZ5n9GAADAHC8vL/n6+uY5bFVwHDlyRKdOnVJoaKgkqXnz5jp79qw2btyYe82KFSuUk5Ojpk2bXvd9jRccCxcu1N13363ixYtr8+bNucVCSkqKxowZ86/vHzt2rPz8/PIcE8aNtXdshxHgHyB3d/erJhSeOnVKpUuXNpQKReXw6Ys6fT5DlUr7SJKaVwtSZJ1gvTB7qzYdPKsdf6VqxKKdupSZra63lTecFgXF97dr4XkDjsNicdyjIM6fP68tW7Zoy5Ytki4vyrRlyxYlJibq/Pnzeumll7R+/XodPHhQy5cv13333adq1arp7rvvliTVrl1b7du3V+/evfXbb79pzZo1GjBggB5++OHrXqFKcoCC44033tDUqVP1ySefyMPDI/d8y5Ytr2uX8ZiYGKWkpOQ5XhoaY8/IDsXD01O169RV/Pp1uedycnIUH79ODRo2MpgMRSHEz1v+Ph5KTr1cqBf3dJck5fzPCm85VqvcHHc4KvLB97dr4XkDsLUNGzaoUaNGatTo8v9DBg8erEaNGun111+Xu7u7tm3bps6dO6tGjRrq1auXmjRpol9//TVPj8mcOXNUq1YttWnTRh07dlSrVq00bdq0AuUwPodjz549at269VXn/fz8dPbs2X99v5eX11XdSJdcbKj640/21GuvDFXduvVUr34Dzf5ili5evKgu93c1HQ0F5OPpnttbIUkVAn1Uu1wpnb2QqZQLmXquXTX9tO24ks+lq2KQj4beW1OHTl3Qr3tOSpI2HzyjlIuZGv9wA01etk+XMrP1ULMKuiXQR7G7kk19WSgEvr9dC8/btVy4kKbExMTc13/9dUS7d++Sn5+fQkOv/7fHQH4iIiL+cZuJn3766V/vERgYqLlz5xYqh/GCIyQkRPv27VPlypXznF+9erWqVKliJpSTad+ho86cPq0PJ0/SyZPJqlmrtj78eLqC6IJ3OvUr+GlO3/+OiRx+X21J0sLfj+j1hTtUK7SUut5WXqW8PXQi9ZJW/3l5Gd2M7MsrvZ25kKmnP/ldL3aooS+evUMe7m7am3ROz87cqN3Hzhn5mlA4fH+7Fp63a9mxfbt6P/1E7ut3xl8eEt7pvvv1nzffMhULcuxVqpyRxWp4d72xY8dq9uzZ+uyzz3TXXXfpxx9/1KFDhzRo0CC99tpreu655wp8T1fr4XB19YYtMR0BRWj7W/+8YyoA58V+v66luMe/X2NKo1ErTEfI1+YRUaYjFJjxHo5hw4YpJydHbdq00YULF9S6dWt5eXlpyJAhN1RsAAAAAHAcxgsOi8Wi4cOH66WXXtK+fft0/vx51alTR97e3jp69GiBZsADAAAAhcWIKtsyXnD8zdPTU3Xq1Ml9vXXrVjVu3Dh3a3UAAAAAzsf4srgAAAAAbl4O08MBAAAAOAJWqbItejgAAAAA2I2xHo5t27b9Y/uePXuKKAkAAAAAezFWcNx6662yWCzX3P3w7/N0ZwEAAKCo8SOobRkrOBISEkx9NAAAAIAiYqzgqFSpUoGu79evn0aPHq3SpUvbKREAAAAAW3OaSeOzZ89Wamqq6RgAAAC4yVksFoc9nJHTFBzXmusBAAAAwLE5TcEBAAAAwPmw8R8AAABwBScdueSw6OEAAAAAYDcUHAAAAADsxmkKjscee0y+vr6mYwAAAAAoAGNzOLZt23Zd1zVo0ECS9NFHH9kzDgAAACBJTrv8rKMyVnDceuutslgs11zu9u/zFotF2dnZBtIBAAAAsAVjBUdCQoKpjwYAAABQRIwVHJUqVTL10QAAAEC+GFFlW8Ymje/du1c9evRQamrqVW0pKSl65JFHdODAAQPJAAAAANiKsYJjwoQJqlChwjVXnvLz81OFChU0YcIEA8kAAAAA2IqxIVUrV67U7Nmz823v3r27HnnkkSJMBAAAALBKla0Z6+FITExUcHBwvu2lS5fW4cOHizARAAAAAFszVnD4+flp//79+bbv27ePjf4AAAAAJ2es4GjdurU++OCDfNsnTZqkO++8swgTAQAAAJdXqXLUwxkZKzhiYmK0ZMkSPfDAA/rtt9+UkpKilJQUxcfHq1u3bvrpp58UExNjKh4AAAAAGzA2abxRo0ZasGCBnn76aX3zzTd52oKCgjR//nw1btzYUDoAAAAAtmCs4JCke++9V4cOHdLSpUu1b98+Wa1W1ahRQ+3atZOPj4/JaAAAAHBRrFJlW8YKjhUrVmjAgAFav3697r///jxtKSkpqlu3rqZOnco8DgAAAMCJGZvD8d5776l37975bvwXHR2td99910AyAAAAALZirODYunWr2rdvn297u3bttHHjxiJMBAAAAJhfiYpVqmzk+PHj8vDwyLe9WLFiSk5OLsJEAAAAAGzNWMFRvnx5bd++Pd/2bdu2KTQ0tAgTAQAAALA1YwVHx44d9dprr+nSpUtXtV28eFEjRozQvffeayAZAAAAXJnFYnHYwxkZW6Xq1Vdf1aJFi1SjRg0NGDBANWvWlCTt3r1bU6ZMUXZ2toYPH24qHgAAAAAbMFZwlC1bVmvXrlXfvn0VExMjq9Uq6XJFeffdd2vKlCkqW7asqXgAAAAAbMDoxn+VKlXSjz/+qDNnzuRu/Fe9enUFBASYjAUAAAAX5qxDlxyV0YLjbwEBAbr99ttNxwAAAABgY8YmjQMAAAC4+TlEDwcAAADgKBhRZVv0cAAAAACwGwoOAAAAAHbDkCoAAADgCqxSZVv0cAAAAACwGwoOAAAAAHbDkCoAAADgCoyosi16OAAAAADYDQUHAAAAALthSBUAAABwBVapsi16OAAAAADYDQUHAAAAALthSBUAAABwBUZU2RY9HAAAAADshoIDAAAAgN0wpAoAAAC4ghtjqmyKHg4AAAAAdkPBAQAAAMBuGFIFAAAAXIERVbZFDwcAAAAAu6HgAAAAAGA3DKkCAAAArmBhTJVNOVwPR3Z2trZs2aIzZ86YjgIAAACgkIwXHC+88II+/fRTSZeLjfDwcDVu3FgVKlRQXFyc2XAAAAAACsV4wbFgwQI1bNhQkvT9998rISFBu3fv1qBBgzR8+HDD6QAAAOBq3CyOezgj4wXHyZMnFRISIkn68ccf9eCDD6pGjRp6+umn9ccffxhOBwAAAKAwjBccZcuW1c6dO5Wdna2lS5fqrrvukiRduHBB7u7uhtMBAAAAKAzjq1T17NlT3bt3V2hoqCwWi9q2bStJio+PV61atQynAwAAgKthlSrbMl5wjBw5UvXq1dPhw4f14IMPysvLS5Lk7u6uYcOGGU4HAAAAoDCMFxyff/65HnroodxC4289evTQvHnzDKUCAAAAYAvG53D07NlTKSkpV50/d+6cevbsaSARAAAAXJnF4riHMzLew2G1Wq85Tu7IkSPy8/MzkAjOZvtbHUxHQBEKuH2A6QgoQmd+n2w6AopQjtVqOgKKlJP+9IwCM1ZwNGrUSBaLRRaLRW3atFGxYv+Nkp2drYSEBLVv395UPAAAAAA2YKzg6NKliyRpy5Ytuvvuu1WyZMncNk9PT1WuXFndunUzlA4AAACuykLvi00ZKzhGjBghSapcubIeeugheXt7m4oCAAAAwE6MTxp/8skndenSJU2fPl0xMTE6ffq0JGnTpk3666+/DKcDAAAAUBjGJ41v27ZNbdu2lZ+fnw4ePKjevXsrMDBQixYtUmJioj7//HPTEQEAAOBC3BhRZVPGezgGDRqkp556Snv37s0zrKpjx45atWqVwWQAAACA81q1apU6deqkcuXKyWKxaPHixbltmZmZGjp0qOrXr68SJUqoXLlyeuKJJ3T06NE896hcuXLuQk9/H2+99VaBchgvODZs2KDo6OirzpcvX15JSUkGEgEAAADOLy0tTQ0bNtSUKVOuartw4YI2bdqk1157TZs2bdKiRYu0Z88ede7c+aprR48erWPHjuUezz33XIFyGB9S5eXlpdTU1KvO//nnnypTpoyBRAAAAHBl19ojzhl16NBBHTpce78yPz8/LVu2LM+5yZMn64477lBiYqIqVqyYe75UqVIKCQm54RzGezg6d+6s0aNHKzMzU9LlB5yYmKihQ4eyLC4AAABwhfT0dKWmpuY50tPTbXLvlJQUWSwW+fv75zn/1ltvKSgoSI0aNdKECROUlZVVoPsaLzjeeecdnT9/XsHBwbp48aLCw8NVrVo1lSpVSm+++abpeAAAAIDDGDt2rPz8/PIcY8eOLfR9L126pKFDh6pHjx7y9fXNPT9w4EDNmzdPsbGxio6O1pgxY/Tyyy8X6N4Wq9VqLXRCG1i9erW2bdum8+fPq3Hjxmrbtu0N3+tSwYouAE4k4PYBpiOgCJ35fbLpCChC2TkO8SMJikgJT8cdttRl+gbTEfL11eP1r+rR8PLykpeX1z++z2Kx6JtvvsndfPtKmZmZ6tatm44cOaK4uLg8Bcf/+uyzzxQdHa3z58//62f+zfgcjr+1atVKrVq1Mh0DAAAAcFjXU1wURGZmprp3765Dhw5pxYoV/1hsSFLTpk2VlZWlgwcPqmbNmtf1GUYKjkmTJl33tQMHDrRjEgAAAMA1/V1s7N27V7GxsQoKCvrX92zZskVubm4KDg6+7s8xUnBMnDjxuq6zWCwUHAAAAChSbjfJKlXnz5/Xvn37cl8nJCRoy5YtCgwMVGhoqB544AFt2rRJP/zwg7Kzs3O3pAgMDJSnp6fWrVun+Ph4RUZGqlSpUlq3bp0GDRqkxx57TAEBAdedw0jBsWXLFvn5+Zn4aAAAAMAlbNiwQZGRkbmvBw8eLEl68sknNXLkSH333XeSpFtvvTXP+2JjYxURESEvLy/NmzdPI0eOVHp6usLCwjRo0KDc+1wvIwVHYGCgkpKSVKZMGUVFRWnRokVXLb8FAAAA4MZFRETon9aH+re1oxo3bqz169cXOoeRgqNkyZI6efKkypQpo7i4uNw9OAAAAADTbpIRVQ7DSMHRtm1bRUZGqnbt2pKk+++/X56ente8dsWKFUUZDQAAAIANGSk4Zs+erVmzZmn//v1auXKl6tatKx8fHxNRAAAAANiRkYKjePHievbZZyVdnswybtw45nAAAADAIVgYU2VTxjf+i42NNR0BAAAAgJ0YLzgk6ciRI/ruu++UmJiojIyMPG3vvvuuoVQAAAAACst4wbF8+XJ17txZVapU0e7du1WvXj0dPHhQVqtVjRs3Nh0PAAAALoYRVbblZjpATEyMhgwZoj/++EPe3t5auHChDh8+rPDwcD344IOm4wEAAAAoBOMFx65du/TEE09IkooVK6aLFy+qZMmSGj16tMaNG2c4HQAAAIDCMD6kqkSJErnzNkJDQ7V//37VrVtXknTy5EmT0QAAAOCC3BhTZVPGC45mzZpp9erVql27tjp27KgXX3xRf/zxhxYtWqRmzZqZjgcAAACgEIwXHO+++67Onz8vSRo1apTOnz+vr776StWrV2eFKgAAAMDJGS84qlSpkvvnEiVKaOrUqQbTAAAAwNUxoMq2jE8al6SzZ89q+vTpiomJ0enTpyVJmzZt0l9//WU4GQAAAIDCMN7DsW3bNrVt21Z+fn46ePCgevfurcDAQC1atEiJiYn6/PPPTUcEAAAAcIOM93AMHjxYTz31lPbu3Stvb+/c8x07dtSqVasMJgMAAIArslgsDns4I+MFx++//67o6OirzpcvX15JSUkGEgEAAACwFeMFh5eXl1JTU686/+eff6pMmTIGEgEAAACwFeMFR+fOnTV69GhlZmZKutyFlZiYqKFDh6pbt26G0wEAAMDVuFkc93BGxguOd955R+fPn1dwcLAuXryo8PBwVatWTSVLltSbb75pOh4AAACAQjC+SpWfn5+WLVumNWvWaOvWrTp//rwaN26stm3bmo4GAAAAoJCMFxx/a9mypVq2bJn7evfu3ercubP+/PNPg6kAAADgapx1NShHZXxIVX7S09O1f/9+0zEAAAAAFILDFhwAAAAAnJ/D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AAAA4Piuu+Do1KmTVq1apXvuuUfvvfee2rdvL3d3d02dOrVQAUaMGFGo9wMAAABwXNddcCxZskQDBw5U3759Vb16dZsFsFqt2rhxow4ePCiLxaKwsDA1atSI1QEAAABgBD+G2tZ1TxpfvXq1zp07pyZNmqhp06aaPHmyTp48WagPj42NVdWqVdW0aVN1795dDz74oG6//XZVr179hnYtBwAAAHDZqlWr1KlTJ5UrV04Wi0WLFy/O0261WvX6668rNDRUxYsXV9u2bbV3794815w+fVqPPvqofH195e/vr169eun8+fMFynHdBUezZs30ySef6NixY4qOjta8efNUrlw55eTkaNmyZTp37lyBPnjfvn269957VblyZS1atEi7du3Szp079fXXX+uWW25Rx44ddeDAgQLdEwAAAMBlaWlpatiwYb4LO40fP16TJk3S1KlTFR8frxIlSujuu+/WpUuXcq959NFHtWPHDi1btkw//PCDVq1apT59+hQoh8VqtVpv9IvYs2ePPv30U33xxRc6e/as7rrrLn333XfX9d4BAwZo165dWr58+VVtVqtVbdu2VZ06dfTBBx8UONelrAK/BYCTCLh9gOkIKEJnfp9sOgKKUHbODf9IAidUwtNxxy0N+/FP0xHy9VbHGjf0PovFom+++SZ3wSar1apy5crpxRdf1JAhQyRJKSkpKlu2rGbOnKmHH35Yu3btUp06dfT777/rtttukyQtXbpUHTt21JEjR1SuXLnr+uwb2ofjbzVr1tT48eN15MgRffnllwV6b1xcnF544YVrtlksFr3wwguKjY0tTDwAAADgppKenq7U1NQ8R3p6eoHvk5CQoKSkJLVt2zb3nJ+fn5o2bap169ZJktatWyd/f//cYkOS2rZtKzc3N8XHx1/3ZxWq4Pibu7u7unTpct29G5KUmJio+vXr59ter149HTp0yBbxAAAAgJvC2LFj5efnl+cYO3Zsge+TlJQkSSpbtmye82XLls1tS0pKUnBwcJ72YsWKKTAwMPea63HDG/8V1vnz5+Xj45Nvu4+Pjy5cuFCEiQAAAAAb/UbeTmJiYjR48OA857y8vAyluT7GCg5J2rlzZ77VUWFXwAIAAABuNl5eXjYpMEJCQiRJx48fV2hoaO7548eP69Zbb8295sSJE3nel5WVpdOnT+e+/3oYLTjatGmja81Z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iRMlXe7hmDp1ap7hU56enqpcubKmTp1qKh4AAAAAGzBWcCQkJEiSIiMjtWjRIgUEBJiKAgAAAORyY5UqmzI+hyM2NtZ0BAAAAAB2YqTgGDx4sP7zn/+oRIkSGjx48D9e++677xZRKgAAAAC2ZqTg2Lx5szIzM3P/nB82XQEAAEBR4ydQ2zJScFw5jIohVQAAAIDtVa5cWYcOHbrqfL9+/TRlyhRFRERo5cqVedqio6NtvnCT8TkcAAAAAGzv999/V3Z2du7r7du366677tKDDz6Ye653794aPXp07msfHx+b5zBScHTt2vW6r120aJEdkwAAAAB53Syj+suUKZPn9VtvvaWqVasqPDw895yPj49CQkLsmsPNrnfPh5+fX+7h6+ur5cuXa8OGDbntGzdu1PLly+Xn52ciHgAAAHBTycjI0OzZs/X000/nmSc9Z84clS5dWvXq1VNMTIwuXLhg88820sMxY8aM3D8PHTpU3bt3z7P5X3Z2tvr16ydfX18T8QAAAACHlJ6ervT09DznvLy85OXl9Y/vW7x4sc6ePaunnnoq99wjjzyiSpUqqVy5ctq2bZuGDh2qPXv22HyEkcVqtVptescCKlOmjFavXq2aNWvmOb9nzx61aNFCp06dKvA9L2XZKh0AR5NyIdN0BBShyo9+YjoCitCx+dGmI6AI+Rd3Nx0hX19u/st0hHzt+fYTjRo1Ks+5ESNGaOTIkf/4vrvvvluenp76/vvv871mxYoVatOmjfbt26eqVavaIq4kB5g0npWVpd27d19VcOzevVs5OTmGUgEAAACOJyYm5qp97P6td+PQoUP65Zdf/rXnomnTppJ08xUcPXv2VK9evbR//37dcccdkqT4+Hi99dZb6tmzp+F0AAAAgOO4nuFT/2vGjBkKDg7WPffc84/XbdmyRZIUGhp6o/GuyXjB8fbbbyskJETvvPOOjh07JunyF/nSSy/pxRdfNJwOAAAArsbIqkp2kpOToxkzZujJJ59UsWL//dF///79mjt3rjp27KigoCBt27ZNgwYNUuvWrdWgQQObZjBecLi5uenll1/Wyy+/rNTUVElisjgAAABgA7/88osSExP19NNP5znv6empX375Re+9957S0tJUoUIFdevWTa+++qrNMxgvOK5EoQEAAADYTrt27XStNaIqVKhw1S7j9mKk4GjcuLGWL1+u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",
"text/plain": [
"<Figure size 1000x1000 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Confusion Matrix\n",
"cm = confusion_matrix(Y, Y_pred)\n",
"class_names = class_dict_rev.values()\n",
"df_cm = pd.DataFrame(\n",
" cm, \n",
" index=class_names, \n",
" columns=class_names\n",
" ).astype(int)\n",
"\n",
"plt.figure(figsize=(10, 10))\n",
"sns.heatmap(df_cm, annot=True, fmt='d', cmap='Blues')\n",
"plt.xlabel(\"Predicted\")\n",
"plt.ylabel(\"Actual\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import tensorflow as tf "
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"loaded_model = tf.keras.models.load_model(model_weights)\n",
"loaded_model.compile(\n",
" optimizer='Adam',\n",
" loss='categorical_crossentropy',\n",
" metrics=[\n",
" tf.keras.metrics.CategoricalAccuracy(),\n",
" tf.keras.metrics.Recall(),\n",
" tf.keras.metrics.Precision()\n",
" ]\n",
" )\n",
"\n",
"class_dict = {\n",
" 0: 'CCI_Caterpillars',\n",
" 1: 'CCI_Leaflets',\n",
" 2: 'WCLWD_DryingofLeaflets',\n",
" 3: 'WCLWD_Flaccidity',\n",
" 4: 'WCLWD_Yellowing'}\n",
"\n",
"class_dict_rev = {v: k for k, v in class_dict.items()}"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [],
"source": [
"def retrieve_treatments(\n",
" disease_name,\n",
" path = 'data/treatments.xlsx'\n",
" ):\n",
" treatments = pd.read_excel(path)\n",
" # fill nan in Disease name with previous value\n",
" treatments['ClassName'] = treatments['ClassName'].fillna(method='ffill')\n",
" treatments['Disease name'] = treatments['Disease name'].fillna(method='ffill')\n",
" treatments = treatments[treatments['ClassName'] == disease_name]\n",
" del treatments['ClassName']\n",
" return treatments.to_dict('records')\n",
"\n",
"def retrieve_diseases(\n",
" disease_name,\n",
" path = 'data/Diseases.xlsx'\n",
" ): \n",
" diseases = pd.read_excel(path)\n",
" diseases = diseases[diseases['ClassName'] == disease_name]\n",
" del diseases['ClassName']\n",
"\n",
" return diseases.to_dict('records')\n",
"\n",
"def retrieve_disease_data(img_path):\n",
" img = cv.imread(img_path)\n",
" img = cv.resize(img, target_size)\n",
" img = preprocessing_function(img)\n",
" img = np.expand_dims(img, axis=0)\n",
" P = loaded_model.predict(img)\n",
" disease_id = np.argmax(P)\n",
" disease = class_dict[disease_id]\n",
" \n",
" treatments = retrieve_treatments(disease)\n",
" disease_data = retrieve_diseases(disease)\n",
"\n",
" return {\n",
" 'disease': disease,\n",
" 'treatments': treatments,\n",
" 'disease_data': disease_data\n",
" }"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1/1 [==============================] - 0s 35ms/step\n"
]
},
{
"data": {
"text/plain": [
"{'disease': 'CCI_Caterpillars',\n",
" 'treatments': [{'Disease name': 'Caterpillar infestation',\n",
" 'Treatment recommendation': 'Chemical bio catepillar and webworm control',\n",
" 'Treatment description': 'Biological Caterpillar and Webworm Control is an Easy-to-Mix Liquid concentrate. The active ingredient is Bacillus thuringiensis subsp. kurstaki (BTK), a species specific biological larvicide that kills only leaf eating caterpillar pests (Lepidoptera).',\n",
" 'Image URL': 'https://wholesalegrowersdirect.com/wp-content/uploads/2019/04/HGBCWC_1.jpg',\n",
" 'Available on': 'Biological Caterpillar & Webworm Control - Summit® Responsible Solutions (summitchemical.com)'},\n",
" {'Disease name': 'Caterpillar infestation',\n",
" 'Treatment recommendation': 'Bactur catepillar killer',\n",
" 'Treatment description': \"Grosafe's Bactur Caterpillar Killer controls caterpillars on vegetables, fruit and ornamentals using a naturally occurring bacteria, Bacillus thuringiensis. Apply when caterpillars are young before plant damage occurs.\\xa0\",\n",
" 'Image URL': 'https://plantdoctor.co.nz/assets/uploads/2016/05/Kiwicare-Organic-Caterpillar-Control.jpg',\n",
" 'Available on': 'Grosafe Bactur Caterpillar Killer 10g – GardenBarn'},\n",
" {'Disease name': 'Caterpillar infestation',\n",
" 'Treatment recommendation': 'Safer caterpillar killer',\n",
" 'Treatment description': 'Safer Brand Caterpillar Killer Concentrate uses a naturally occurring bacterium to kill and control caterpillars and other leaf-eating worms. The caterpillars and worms that are damaging your plants will stop feeding immediately after ingesting the bacterium, which is known scientifically as Bacillus Thuringiensis var. Kurstak. when Caterpillar Killer is used as directed, it has no effect on birds, earthworms, or beneficial insects such as honeybees and ladybugs',\n",
" 'Image URL': 'https://th.bing.com/th/id/OIP.AnFfBaKtSl8vHIa6s3nIXAHaHa?pid=ImgDet&w=600&h=600&rs=1',\n",
" 'Available on': 'Safer® Brand Caterpillar Killer II Concentrate -16 oz (saferbrand.com)'},\n",
" {'Disease name': 'Caterpillar infestation',\n",
" 'Treatment recommendation': 'Monocrotophos',\n",
" 'Treatment description': 'Monocrotophos is an organophosphate insecticide which is injected into the trunk of the tree to kill the leaf eating caterpillar, Opisina arenosella.',\n",
" 'Image URL': 'https://th.bing.com/th/id/R.191c69ca014d3dabd15538b89feed7ab?rik=S2NXZj%2fMeHWK0Q&pid=ImgRaw&r=0',\n",
" 'Available on': 'Monocrotophos 36 Sl Online | Buy Insecticide Online | Insecticide (agribegri.com)'}],\n",
" 'disease_data': [{'Disease Name ': 'Caterpillar infestation',\n",
" 'Image': 'https://th.bing.com/th/id/OIP.vqfwYctyk-apjCgn5sFqhwHaFj?pid=ImgDet&rs=1',\n",
" 'Disease description': 'Coconut caterpillar infestation is a condition where the black headed caterpillar,\\xa0Opisina arenosella\\xa0 feed on the leaves of trees, it is a serious pest causing significant damage and yield loss.',\n",
" 'Symptoms ': '1. Irregular holes in tree leaves: Infested leaves often exhibit irregularly shaped holes caused by the feeding activity of the caterpillars.\\n2. Skeletonization of leaves: The caterpillars consume the tender tissues of the leaves, leaving behind only the veins or a skeletal structure.\\n3. Defoliation: Severe infestations can result in significant leaf loss, leading to partial or complete defoliation of the tree.\\n4. Stunted growth: As the caterpillars continuously feed on the leaves, the overall growth and development of the tree may be stunted.\\n5. Presence of caterpillars: During the infestation, caterpillars can be observed on the tree leaves. They are usually light-colored or green, with distinct body segments and head capsules.\\n6. Silk threads or webs: In some cases, the caterpillars may leave behind silk threads or webs on the tree leaves as they move or feed.\\n7. Frass or droppings: The caterpillars excrete droppings called frass, which can be found on the leaves, ground, or surrounding areas. The presence of frass can be an indicator of an infestation.'}]}"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"img_path = 'data/images/CCI_Caterpillars/CCI_1_26_jpg.rf.d14b2b0861f0b77adfb4947c8259f87a.jpg'\n",
"retrieve_disease_data(img_path)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.8.13 ('tf26')",
"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.8.13"
},
"orig_nbformat": 4,
"vscode": {
"interpreter": {
"hash": "d4b521e29a846470c96e928a1c4aafac58a12234cdaa98f9ca60bc431873fee6"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment