{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceType":"competition","sourceId":4104,"databundleVersionId":46661},{"sourceType":"datasetVersion","sourceId":952401,"datasetId":517172,"databundleVersionId":980293}],"dockerImageVersionId":30588,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import time\nfrom tensorflow import lite\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nimport numpy as np\nimport pandas as pd\nimport random, os\nimport shutil\nimport matplotlib.pyplot as plt\nfrom matplotlib.image import imread\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.metrics import categorical_accuracy\nfrom sklearn.model_selection import train_test_split","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-06T08:44:07.38117Z","iopub.execute_input":"2026-05-06T08:44:07.381694Z","iopub.status.idle":"2026-05-06T08:44:07.387804Z","shell.execute_reply.started":"2026-05-06T08:44:07.381656Z","shell.execute_reply":"2026-05-06T08:44:07.386681Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df = pd.read_csv(r'../input/diabetic-retinopathy-224x224-gaussian-filtered/train.csv')\n\ndiagnosis_dict_binary = {\n    0: 'No_DR',\n    1: 'DR',\n    2: 'DR',\n    3: 'DR',\n    4: 'DR'\n}\n\ndiagnosis_dict = {\n    0: 'No_DR',\n    1: 'Mild',\n    2: 'Moderate',\n    3: 'Severe',\n    4: 'Proliferate_DR',\n}\n\n\ndf['binary_type'] =  df['diagnosis'].map(diagnosis_dict_binary.get)\ndf['type'] = df['diagnosis'].map(diagnosis_dict.get)\ndf.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-06T08:44:18.211861Z","iopub.execute_input":"2026-05-06T08:44:18.212559Z","iopub.status.idle":"2026-05-06T08:44:18.230478Z","shell.execute_reply.started":"2026-05-06T08:44:18.212529Z","shell.execute_reply":"2026-05-06T08:44:18.229478Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df['type'].value_counts().plot(kind='barh')","metadata":{"execution":{"iopub.status.busy":"2026-05-06T08:44:23.245252Z","iopub.execute_input":"2026-05-06T08:44:23.245892Z","iopub.status.idle":"2026-05-06T08:44:23.421848Z","shell.execute_reply.started":"2026-05-06T08:44:23.245864Z","shell.execute_reply":"2026-05-06T08:44:23.420837Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_intermediate, val = train_test_split(df, test_size = 0.15, stratify = df['type'])\ntrain, test = train_test_split(train_intermediate, test_size = 0.15 / (1 - 0.15), stratify = train_intermediate['type'])\n\nprint(\"For Training Dataset :\")\nprint(train['type'].value_counts(), '\\n')\nprint(\"For Testing Dataset :\")\nprint(test['type'].value_counts(), '\\n')\nprint(\"For Validation Dataset :\")\nprint(val['type'].value_counts(), '\\n')","metadata":{"execution":{"iopub.status.busy":"2026-05-06T08:44:28.987897Z","iopub.execute_input":"2026-05-06T08:44:28.988333Z","iopub.status.idle":"2026-05-06T08:44:29.007805Z","shell.execute_reply.started":"2026-05-06T08:44:28.988305Z","shell.execute_reply":"2026-05-06T08:44:29.006837Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_dir = ''\n\ntrain_dir = os.path.join(base_dir, 'train')\nval_dir = os.path.join(base_dir, 'val')\ntest_dir = os.path.join(base_dir, 'test')\n\nif os.path.exists(base_dir):\n    shutil.rmtree(base_dir)\n\nif os.path.exists(train_dir):\n    shutil.rmtree(train_dir)\nos.makedirs(train_dir)\n\nif os.path.exists(val_dir):\n    shutil.rmtree(val_dir)\nos.makedirs(val_dir)\n\nif os.path.exists(test_dir):\n    shutil.rmtree(test_dir)\nos.makedirs(test_dir)","metadata":{"execution":{"iopub.status.busy":"2026-05-06T08:44:38.922397Z","iopub.execute_input":"2026-05-06T08:44:38.923102Z","iopub.status.idle":"2026-05-06T08:44:38.928788Z","shell.execute_reply.started":"2026-05-06T08:44:38.923073Z","shell.execute_reply":"2026-05-06T08:44:38.928002Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"src_dir = r'../input/diabetic-retinopathy-224x224-gaussian-filtered/gaussian_filtered_images/gaussian_filtered_images'\nfor index, row in train.iterrows():\n    diagnosis = row['type']\n    binary_diagnosis = row['binary_type']\n    id_code = row['id_code'] + \".png\"\n    srcfile = os.path.join(src_dir, diagnosis, id_code)\n    dstfile = os.path.join(train_dir, binary_diagnosis)\n    os.makedirs(dstfile, exist_ok = True)\n    shutil.copy(srcfile, dstfile)\n\nfor index, row in val.iterrows():\n    diagnosis = row['type']\n    binary_diagnosis = row['binary_type']\n    id_code = row['id_code'] + \".png\"\n    srcfile = os.path.join(src_dir, diagnosis, id_code)\n    dstfile = os.path.join(val_dir, binary_diagnosis)\n    os.makedirs(dstfile, exist_ok = True)\n    shutil.copy(srcfile, dstfile)\n \nfor index, row in test.iterrows():\n    diagnosis = row['type']\n    binary_diagnosis = row['binary_type']\n    id_code = row['id_code'] + \".png\"\n    srcfile = os.path.join(src_dir, diagnosis, id_code)\n    dstfile = os.path.join(test_dir, binary_diagnosis)\n    os.makedirs(dstfile, exist_ok = True)\n    shutil.copy(srcfile, dstfile)","metadata":{"execution":{"iopub.status.busy":"2026-05-06T08:44:46.782593Z","iopub.execute_input":"2026-05-06T08:44:46.78336Z","iopub.status.idle":"2026-05-06T08:44:51.769585Z","shell.execute_reply.started":"2026-05-06T08:44:46.78333Z","shell.execute_reply":"2026-05-06T08:44:51.768467Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_path = 'train'\nval_path = 'val'\ntest_path = 'test'\n\ntrain_batches = ImageDataGenerator(rescale = 1./255).flow_from_directory(train_path, target_size=(224,224), shuffle = True)\nval_batches = ImageDataGenerator(rescale = 1./255).flow_from_directory(val_path, target_size=(224,224), shuffle = True)\ntest_batches = ImageDataGenerator(rescale = 1./255).flow_from_directory(test_path, target_size=(224,224), shuffle = False)","metadata":{"execution":{"iopub.status.busy":"2026-05-06T08:44:58.238426Z","iopub.execute_input":"2026-05-06T08:44:58.239139Z","iopub.status.idle":"2026-05-06T08:44:58.375632Z","shell.execute_reply.started":"2026-05-06T08:44:58.239107Z","shell.execute_reply":"2026-05-06T08:44:58.374835Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import time\nimport numpy as np\nimport tensorflow as tf\nfrom tensorflow.keras import layers\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\n\n# Start timer\nstart_time = time.time()\n\n# CNN Model\nmodel = tf.keras.Sequential([\n    layers.Conv2D(8, (3,3), padding=\"valid\", input_shape=(224,224,3), activation='relu'),\n    layers.MaxPooling2D(pool_size=(2,2)),\n    layers.BatchNormalization(),\n\n    layers.Conv2D(16, (3,3), padding=\"valid\", activation='relu'),\n    layers.MaxPooling2D(pool_size=(2,2)),\n    layers.BatchNormalization(),\n\n    layers.Conv2D(32, (4,4), padding=\"valid\", activation='relu'),\n    layers.MaxPooling2D(pool_size=(2,2)),\n    layers.BatchNormalization(),\n\n    layers.Conv2D(64, (4,4), padding=\"valid\", activation='relu'),\n    layers.MaxPooling2D(pool_size=(2,2)),\n    layers.BatchNormalization(),\n\n    layers.Flatten(),\n    layers.Dense(64, activation='relu'),\n    layers.Dropout(0.15),\n    layers.Dense(2, activation='softmax')\n])\n\n# Compile model\nmodel.compile(\n    optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5),\n    loss='categorical_crossentropy',\n    metrics=['accuracy']\n)\n\n# Train model\nhistory = model.fit(\n    train_batches,\n    epochs=15,\n    validation_data=val_batches,\n    verbose=1\n)\n\n# End timer\nend_time = time.time()\ntraining_time = end_time - start_time\ntime_per_epoch = training_time / 15\n\n# Predictions\ny_pred_probs = model.predict(val_batches, verbose=0)\ny_pred = np.argmax(y_pred_probs, axis=1)\n\n# True labels\ny_true = val_batches.classes\n\n# Metrics calculation\naccuracy = accuracy_score(y_true, y_pred)\nprecision = precision_score(y_true, y_pred, average='binary')\nrecall = recall_score(y_true, y_pred, average='binary')\nf1 = f1_score(y_true, y_pred, average='binary')\n\n# Print results\nprint(\"\\n========== MODEL PERFORMANCE ==========\")\nprint(f\"Accuracy      : {accuracy:.4f}\")\nprint(f\"Precision     : {precision:.4f}\")\nprint(f\"Recall        : {recall:.4f}\")\nprint(f\"F1 Score      : {f1:.4f}\")\nprint(f\"Training Time : {training_time:.2f} seconds\")\nprint(f\"Time/Epoch    : {time_per_epoch:.2f} seconds\")\nprint(\"======================================\")","metadata":{"execution":{"iopub.status.busy":"2026-05-06T09:14:40.98238Z","iopub.execute_input":"2026-05-06T09:14:40.983313Z","iopub.status.idle":"2026-05-06T09:16:43.749869Z","shell.execute_reply.started":"2026-05-06T09:14:40.983282Z","shell.execute_reply":"2026-05-06T09:16:43.748999Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Standard Dropout","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras import layers\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score\nimport numpy as np\nimport time\n\n# ================= MODEL =================\nmodel = tf.keras.Sequential([\n    layers.Conv2D(8, (3,3), padding=\"valid\", input_shape=(224,224,3), activation='relu'),\n    layers.MaxPooling2D(pool_size=(2,2)),\n    layers.BatchNormalization(),\n    layers.Dropout(0.25),\n\n    layers.Conv2D(16, (3,3), padding=\"valid\", activation='relu'),\n    layers.MaxPooling2D(pool_size=(2,2)),\n    layers.BatchNormalization(),\n    layers.Dropout(0.25),\n\n    layers.Conv2D(32, (4,4), padding=\"valid\", activation='relu'),\n    layers.MaxPooling2D(pool_size=(2,2)),\n    layers.BatchNormalization(),\n    layers.Dropout(0.30),\n\n    layers.Conv2D(64, (4,4), padding=\"valid\", activation='relu'),\n    layers.MaxPooling2D(pool_size=(2,2)),\n    layers.BatchNormalization(),\n    layers.Dropout(0.30),\n\n    layers.Flatten(),\n    layers.Dense(64, activation='relu'),\n    layers.Dropout(0.50),\n    layers.Dense(2, activation='softmax')\n])\n\n# Use categorical_crossentropy for 2-class softmax\nmodel.compile(\n    optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5),\n    loss='categorical_crossentropy',\n    metrics=['accuracy', tf.keras.metrics.AUC(name='auc')]\n)\n\n# ================= TRAINING =================\nstart_time = time.time()\n\nhistory = model.fit(\n    train_batches,\n    epochs=15,\n    validation_data=val_batches,\n    verbose=1\n)\n\nend_time = time.time()\n\ntraining_time = end_time - start_time\ntime_per_epoch = training_time / 15\n\n# ================= PREDICTION =================\nval_batches.reset()\n\ny_pred_probs = model.predict(val_batches)\ny_pred = np.argmax(y_pred_probs, axis=1)\n\n# True labels\ny_true = val_batches.classes\n\n# For AUC (probability of positive class)\ny_pred_auc = y_pred_probs[:, 1]\n\n# ================= METRICS =================\naccuracy = accuracy_score(y_true, y_pred)\nprecision = precision_score(y_true, y_pred, average='binary')\nrecall = recall_score(y_true, y_pred, average='binary')\nf1 = f1_score(y_true, y_pred, average='binary')\nauc = roc_auc_score(y_true, y_pred_auc)\n\n# ================= RESULTS =================\nprint(\"\\n========== MODEL PERFORMANCE ==========\")\nprint(f\"Accuracy      : {accuracy:.4f}\")\nprint(f\"Precision     : {precision:.4f}\")\nprint(f\"Recall        : {recall:.4f}\")\nprint(f\"F1 Score      : {f1:.4f}\")\nprint(f\"AUC Score     : {auc:.4f}\")\nprint(f\"Training Time : {training_time:.2f} seconds\")\nprint(f\"Time/Epoch    : {time_per_epoch:.2f} seconds\")\nprint(\"=======================================\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-06T09:18:35.864101Z","iopub.execute_input":"2026-05-06T09:18:35.864433Z","iopub.status.idle":"2026-05-06T09:20:38.797806Z","shell.execute_reply.started":"2026-05-06T09:18:35.864409Z","shell.execute_reply":"2026-05-06T09:20:38.796803Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Spatial Dropout","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras import layers\nfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score\nimport numpy as np\nimport time\n\n# ================= MODEL =================\nmodel = tf.keras.Sequential([\n    layers.Conv2D(8, (3,3), padding=\"valid\", input_shape=(224,224,3), activation='relu'),\n    layers.MaxPooling2D(pool_size=(2,2)),\n    layers.BatchNormalization(),\n    layers.SpatialDropout2D(0.2),\n\n    layers.Conv2D(16, (3,3), padding=\"valid\", activation='relu'),\n    layers.MaxPooling2D(pool_size=(2,2)),\n    layers.BatchNormalization(),\n    layers.SpatialDropout2D(0.2),\n\n    layers.Conv2D(32, (4,4), padding=\"valid\", activation='relu'),\n    layers.MaxPooling2D(pool_size=(2,2)),\n    layers.BatchNormalization(),\n    layers.SpatialDropout2D(0.3),\n\n    layers.Conv2D(64, (4,4), padding=\"valid\", activation='relu'),\n    layers.MaxPooling2D(pool_size=(2,2)),\n    layers.BatchNormalization(),\n    layers.SpatialDropout2D(0.3),\n\n    layers.Flatten(),\n    layers.Dense(64, activation='relu'),\n    layers.Dropout(0.5),\n    layers.Dense(2, activation='softmax')\n])\n\n# Compile model\nmodel.compile(\n    optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5),\n    loss='categorical_crossentropy',\n    metrics=['accuracy', tf.keras.metrics.AUC(name='auc')]\n)\n\n# ================= TRAINING =================\nepochs = 15\n\nstart_time = time.time()\n\nhistory = model.fit(\n    train_batches,\n    epochs=epochs,\n    validation_data=val_batches,\n    verbose=1\n)\n\nend_time = time.time()\n\ntraining_time = end_time - start_time\ntime_per_epoch = training_time / epochs\n\n# ================= PREDICTIONS =================\nval_batches.reset()\n\ny_pred_probs = model.predict(val_batches)\ny_pred = np.argmax(y_pred_probs, axis=1)\n\n# True labels\ny_true = val_batches.classes\n\n# Positive class probability for AUC\ny_pred_auc = y_pred_probs[:, 1]\n\n# ================= METRICS =================\naccuracy = accuracy_score(y_true, y_pred)\nprecision = precision_score(y_true, y_pred, average='binary')\nrecall = recall_score(y_true, y_pred, average='binary')\nf1 = f1_score(y_true, y_pred, average='binary')\nauc = roc_auc_score(y_true, y_pred_auc)\n\n# ================= RESULTS =================\nprint(\"\\n========== MODEL PERFORMANCE ==========\")\nprint(f\"Accuracy      : {accuracy:.4f}\")\nprint(f\"Precision     : {precision:.4f}\")\nprint(f\"Recall        : {recall:.4f}\")\nprint(f\"F1 Score      : {f1:.4f}\")\nprint(f\"AUC Score     : {auc:.4f}\")\nprint(f\"Training Time : {training_time:.2f} seconds\")\nprint(f\"Time/Epoch    : {time_per_epoch:.2f} seconds\")\nprint(\"=======================================\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-06T09:23:46.936868Z","iopub.execute_input":"2026-05-06T09:23:46.937733Z","iopub.status.idle":"2026-05-06T09:25:51.767692Z","shell.execute_reply.started":"2026-05-06T09:23:46.937699Z","shell.execute_reply":"2026-05-06T09:25:51.766848Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.save('64x3-CNN.model')\n","metadata":{"execution":{"iopub.status.busy":"2026-05-06T07:03:23.256239Z","iopub.execute_input":"2026-05-06T07:03:23.257022Z","iopub.status.idle":"2026-05-06T07:03:26.187703Z","shell.execute_reply.started":"2026-05-06T07:03:23.256964Z","shell.execute_reply":"2026-05-06T07:03:26.186385Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.save('standard_dropout_CNN.model')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-06T07:06:28.400147Z","iopub.execute_input":"2026-05-06T07:06:28.400618Z","iopub.status.idle":"2026-05-06T07:06:30.682436Z","shell.execute_reply.started":"2026-05-06T07:06:28.400588Z","shell.execute_reply":"2026-05-06T07:06:30.681468Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"loss, acc = model.evaluate_generator(test_batches, verbose=1)\nprint(\"Loss: \", loss)\nprint(\"Accuracy: \", acc)","metadata":{"execution":{"iopub.status.busy":"2026-05-06T07:06:39.822793Z","iopub.execute_input":"2026-05-06T07:06:39.823658Z","iopub.status.idle":"2026-05-06T07:06:41.60939Z","shell.execute_reply.started":"2026-05-06T07:06:39.823619Z","shell.execute_reply":"2026-05-06T07:06:41.60841Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nimport cv2\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n\ndef predict_class(path):\n    img = cv2.imread(path)\n\n    RGBImg = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)\n    RGBImg= cv2.resize(RGBImg,(224,224))\n    plt.imshow(RGBImg)\n    image = np.array(RGBImg) / 255.0\n    new_model = tf.keras.models.load_model(\"64x3-CNN.model\")\n    predict=new_model.predict(np.array([image]))\n    per=np.argmax(predict,axis=1)\n    if per==1:\n        print('Diabetic Retinopathy Not Detected')\n    else:\n        print('Diabetic Retinopathy Detected')","metadata":{"execution":{"iopub.status.busy":"2026-05-06T07:03:40.271867Z","iopub.execute_input":"2026-05-06T07:03:40.272324Z","iopub.status.idle":"2026-05-06T07:03:40.657381Z","shell.execute_reply.started":"2026-05-06T07:03:40.272294Z","shell.execute_reply":"2026-05-06T07:03:40.656024Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"predict_class('/kaggle/input/diabetic-retinopathy-224x224-gaussian-filtered/gaussian_filtered_images/gaussian_filtered_images/Severe/1b495ac025b7.png')","metadata":{"execution":{"iopub.status.busy":"2026-05-06T07:03:44.231799Z","iopub.execute_input":"2026-05-06T07:03:44.232593Z","iopub.status.idle":"2026-05-06T07:03:45.898463Z","shell.execute_reply.started":"2026-05-06T07:03:44.232557Z","shell.execute_reply":"2026-05-06T07:03:45.897478Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}