{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "6321e0f7-5837-47ba-ace6-03151250238f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dataset Categories: ['cataract', 'diabetic_retinopathy', 'glaucoma', 'normal', 'test', 'train', 'val']\n"
     ]
    }
   ],
   "source": [
    "import os\n",
    "\n",
    "dataset_dir = \"E:/Downloads/New folder/dataset\"  \n",
    "\n",
    "# List all folders inside the dataset directory\n",
    "categories = os.listdir(dataset_dir)\n",
    "print(\"Dataset Categories:\", categories)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5b275cc7-f1fa-4a6a-81ec-20f34defa99d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train, validation, and test directories created successfully.\n"
     ]
    }
   ],
   "source": [
    "# Create Train, Validation, and Test Directories\n",
    "import os\n",
    "\n",
    "# Define base directory\n",
    "base_dir = r\"E:\\Downloads\\New folder\\dataset\"  \n",
    "\n",
    "# Define train, validation, and test directories\n",
    "train_dir = os.path.join(base_dir, \"train\")\n",
    "val_dir = os.path.join(base_dir, \"val\")\n",
    "test_dir = os.path.join(base_dir, \"test\")\n",
    "\n",
    "# Create directories if they don’t exist\n",
    "os.makedirs(train_dir, exist_ok=True)\n",
    "os.makedirs(val_dir, exist_ok=True)\n",
    "os.makedirs(test_dir, exist_ok=True)\n",
    "\n",
    "print(\"Train, validation, and test directories created successfully.\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "dfd01e01-d6bf-450b-bcdc-1983d6d1d6b8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Successfully split data for 'cataract':\n",
      "  -> Train: 830 images\n",
      "  -> Validation: 103 images\n",
      "  -> Test: 105 images\n",
      "\n",
      "Successfully split data for 'diabetic_retinopathy':\n",
      "  -> Train: 878 images\n",
      "  -> Validation: 109 images\n",
      "  -> Test: 111 images\n",
      "\n",
      "Successfully split data for 'glaucoma':\n",
      "  -> Train: 805 images\n",
      "  -> Validation: 100 images\n",
      "  -> Test: 102 images\n",
      "\n",
      "Successfully split data for 'normal':\n",
      "  -> Train: 859 images\n",
      "  -> Validation: 107 images\n",
      "  -> Test: 108 images\n",
      "\n",
      " Dataset successfully split into train, validation, and test sets.\n"
     ]
    }
   ],
   "source": [
    "# Split Data into Train, Validation, and Test Sets\n",
    "import random\n",
    "import shutil\n",
    "\n",
    "def split_data(source_dir, train_dest, val_dest, test_dest, train_size=0.8, val_size=0.1, test_size=0.1):\n",
    "    if not os.path.exists(source_dir):\n",
    "        print(f\"Error: Source directory '{source_dir}' not found.\")\n",
    "        return\n",
    "    \n",
    "    # List all image files in the category\n",
    "    files = [f for f in os.listdir(source_dir) if os.path.isfile(os.path.join(source_dir, f))]\n",
    "    random.shuffle(files)\n",
    "\n",
    "    # Compute split sizes\n",
    "    train_count = int(len(files) * train_size)\n",
    "    val_count = int(len(files) * val_size)\n",
    "\n",
    "    train_files = files[:train_count]\n",
    "    val_files = files[train_count:train_count + val_count]\n",
    "    test_files = files[train_count + val_count:]\n",
    "\n",
    "    # Create category-specific directories\n",
    "    os.makedirs(train_dest, exist_ok=True)\n",
    "    os.makedirs(val_dest, exist_ok=True)\n",
    "    os.makedirs(test_dest, exist_ok=True)\n",
    "\n",
    "    # Move files to respective directories\n",
    "    for f in train_files:\n",
    "        shutil.copy(os.path.join(source_dir, f), os.path.join(train_dest, f))\n",
    "    for f in val_files:\n",
    "        shutil.copy(os.path.join(source_dir, f), os.path.join(val_dest, f))\n",
    "    for f in test_files:\n",
    "        shutil.copy(os.path.join(source_dir, f), os.path.join(test_dest, f))\n",
    "\n",
    "    print(f\"Successfully split data for '{os.path.basename(source_dir)}':\")\n",
    "    print(f\"  -> Train: {len(train_files)} images\")\n",
    "    print(f\"  -> Validation: {len(val_files)} images\")\n",
    "    print(f\"  -> Test: {len(test_files)} images\\n\")\n",
    "\n",
    "# Apply function to all categories\n",
    "for category in [\"cataract\", \"diabetic_retinopathy\", \"glaucoma\", \"normal\"]:\n",
    "    split_data(\n",
    "        os.path.join(base_dir, category),\n",
    "        os.path.join(train_dir, category),\n",
    "        os.path.join(val_dir, category),\n",
    "        os.path.join(test_dir, category),\n",
    "    )\n",
    "\n",
    "print(\" Dataset successfully split into train, validation, and test sets.\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "dd456118-6ede-4c1a-a26c-521292479571",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: tensorflow in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (2.18.0)\n",
      "Requirement already satisfied: tensorflow-intel==2.18.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow) (2.18.0)\n",
      "Requirement already satisfied: absl-py>=1.0.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (2.1.0)\n",
      "Requirement already satisfied: astunparse>=1.6.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (1.6.3)\n",
      "Requirement already satisfied: flatbuffers>=24.3.25 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (25.2.10)\n",
      "Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (0.6.0)\n",
      "Requirement already satisfied: google-pasta>=0.1.1 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (0.2.0)\n",
      "Requirement already satisfied: libclang>=13.0.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (18.1.1)\n",
      "Requirement already satisfied: opt-einsum>=2.3.2 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (3.4.0)\n",
      "Requirement already satisfied: packaging in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (24.2)\n",
      "Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<6.0.0dev,>=3.20.3 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (5.29.3)\n",
      "Requirement already satisfied: requests<3,>=2.21.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (2.32.3)\n",
      "Requirement already satisfied: setuptools in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (75.8.0)\n",
      "Requirement already satisfied: six>=1.12.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (1.16.0)\n",
      "Requirement already satisfied: termcolor>=1.1.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (2.5.0)\n",
      "Requirement already satisfied: typing-extensions>=3.6.6 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (4.12.2)\n",
      "Requirement already satisfied: wrapt>=1.11.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (1.17.2)\n",
      "Requirement already satisfied: grpcio<2.0,>=1.24.3 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (1.71.0)\n",
      "Requirement already satisfied: tensorboard<2.19,>=2.18 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (2.18.0)\n",
      "Requirement already satisfied: keras>=3.5.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (3.9.0)\n",
      "Requirement already satisfied: numpy<2.1.0,>=1.26.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (2.0.2)\n",
      "Requirement already satisfied: h5py>=3.11.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (3.13.0)\n",
      "Requirement already satisfied: ml-dtypes<0.5.0,>=0.4.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorflow-intel==2.18.0->tensorflow) (0.4.1)\n",
      "Requirement already satisfied: wheel<1.0,>=0.23.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from astunparse>=1.6.0->tensorflow-intel==2.18.0->tensorflow) (0.45.1)\n",
      "Requirement already satisfied: rich in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from keras>=3.5.0->tensorflow-intel==2.18.0->tensorflow) (13.9.4)\n",
      "Requirement already satisfied: namex in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from keras>=3.5.0->tensorflow-intel==2.18.0->tensorflow) (0.0.8)\n",
      "Requirement already satisfied: optree in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from keras>=3.5.0->tensorflow-intel==2.18.0->tensorflow) (0.14.1)\n",
      "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow-intel==2.18.0->tensorflow) (3.3.2)\n",
      "Requirement already satisfied: idna<4,>=2.5 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow-intel==2.18.0->tensorflow) (3.10)\n",
      "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow-intel==2.18.0->tensorflow) (2.3.0)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow-intel==2.18.0->tensorflow) (2025.1.31)\n",
      "Requirement already satisfied: markdown>=2.6.8 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorboard<2.19,>=2.18->tensorflow-intel==2.18.0->tensorflow) (3.7)\n",
      "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorboard<2.19,>=2.18->tensorflow-intel==2.18.0->tensorflow) (0.7.2)\n",
      "Requirement already satisfied: werkzeug>=1.0.1 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from tensorboard<2.19,>=2.18->tensorflow-intel==2.18.0->tensorflow) (3.1.3)\n",
      "Requirement already satisfied: MarkupSafe>=2.1.1 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from werkzeug>=1.0.1->tensorboard<2.19,>=2.18->tensorflow-intel==2.18.0->tensorflow) (3.0.2)\n",
      "Requirement already satisfied: markdown-it-py>=2.2.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from rich->keras>=3.5.0->tensorflow-intel==2.18.0->tensorflow) (3.0.0)\n",
      "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from rich->keras>=3.5.0->tensorflow-intel==2.18.0->tensorflow) (2.15.1)\n",
      "Requirement already satisfied: mdurl~=0.1 in c:\\users\\moham\\anaconda3\\envs\\eye-disease-env\\lib\\site-packages (from markdown-it-py>=2.2.0->rich->keras>=3.5.0->tensorflow-intel==2.18.0->tensorflow) (0.1.2)\n",
      "Found 3372 images belonging to 4 classes.\n",
      "Found 419 images belonging to 4 classes.\n"
     ]
    }
   ],
   "source": [
    "# data Data Augmentation\n",
    "!pip install tensorflow\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
    "\n",
    "# Define augmentation transformations\n",
    "train_datagen = ImageDataGenerator(\n",
    "    rescale=1.0/255,\n",
    "    rotation_range=20,\n",
    "    width_shift_range=0.2,\n",
    "    height_shift_range=0.2,\n",
    "    shear_range=0.2,\n",
    "    zoom_range=0.2,\n",
    "    horizontal_flip=True,\n",
    "    fill_mode='nearest'\n",
    ")\n",
    "\n",
    "val_datagen = ImageDataGenerator(rescale=1.0/255)  \n",
    "\n",
    "# Load images\n",
    "train_generator = train_datagen.flow_from_directory(\n",
    "    train_dir,\n",
    "    target_size=(224, 224),\n",
    "    batch_size=32,\n",
    "    class_mode='binary'\n",
    ")\n",
    "\n",
    "val_generator = val_datagen.flow_from_directory(\n",
    "    val_dir,\n",
    "    target_size=(224, 224),\n",
    "    batch_size=32,\n",
    "    class_mode='binary'\n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "f1f84584-3621-498c-aebc-2a4449ff65a0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 3372 images belonging to 4 classes.\n",
      "Found 419 images belonging to 4 classes.\n",
      "Epoch 1/10\n",
      "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m109s\u001b[0m 1s/step - accuracy: 0.4691 - loss: 1.3723 - val_accuracy: 0.7017 - val_loss: 0.7033\n",
      "Epoch 2/10\n",
      "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m107s\u001b[0m 1s/step - accuracy: 0.7437 - loss: 0.6553 - val_accuracy: 0.7232 - val_loss: 0.5884\n",
      "Epoch 3/10\n",
      "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m107s\u001b[0m 1s/step - accuracy: 0.7620 - loss: 0.5803 - val_accuracy: 0.7661 - val_loss: 0.5604\n",
      "Epoch 4/10\n",
      "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m107s\u001b[0m 1s/step - accuracy: 0.7865 - loss: 0.4931 - val_accuracy: 0.7637 - val_loss: 0.5553\n",
      "Epoch 5/10\n",
      "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m107s\u001b[0m 1s/step - accuracy: 0.8034 - loss: 0.4721 - val_accuracy: 0.7828 - val_loss: 0.5165\n",
      "Epoch 6/10\n",
      "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m108s\u001b[0m 1s/step - accuracy: 0.8417 - loss: 0.3966 - val_accuracy: 0.7900 - val_loss: 0.4857\n",
      "Epoch 7/10\n",
      "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m108s\u001b[0m 1s/step - accuracy: 0.8381 - loss: 0.4007 - val_accuracy: 0.7780 - val_loss: 0.5388\n",
      "Epoch 8/10\n",
      "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m107s\u001b[0m 1s/step - accuracy: 0.8327 - loss: 0.4085 - val_accuracy: 0.8234 - val_loss: 0.4660\n",
      "Epoch 9/10\n",
      "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m107s\u001b[0m 1s/step - accuracy: 0.8488 - loss: 0.3615 - val_accuracy: 0.8019 - val_loss: 0.4650\n",
      "Epoch 10/10\n",
      "\u001b[1m106/106\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m107s\u001b[0m 1s/step - accuracy: 0.8621 - loss: 0.3621 - val_accuracy: 0.8258 - val_loss: 0.4431\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model training complete.\n"
     ]
    }
   ],
   "source": [
    "# cnn model\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
    "from tensorflow.keras import layers, models\n",
    "\n",
    "# Define ImageDataGenerator\n",
    "train_datagen = ImageDataGenerator(rescale=1./255)\n",
    "val_datagen = ImageDataGenerator(rescale=1./255)\n",
    "\n",
    "train_generator = train_datagen.flow_from_directory(\n",
    "    train_dir, target_size=(224, 224), batch_size=32, class_mode='categorical')\n",
    "\n",
    "val_generator = val_datagen.flow_from_directory(\n",
    "    val_dir, target_size=(224, 224), batch_size=32, class_mode='categorical')\n",
    "\n",
    "# Define CNN Model\n",
    "model = models.Sequential([\n",
    "    layers.Conv2D(32, (3,3), activation='relu', input_shape=(224, 224, 3)),\n",
    "    layers.MaxPooling2D(2,2),\n",
    "    layers.Conv2D(64, (3,3), activation='relu'),\n",
    "    layers.MaxPooling2D(2,2),\n",
    "    layers.Conv2D(128, (3,3), activation='relu'),\n",
    "    layers.MaxPooling2D(2,2),\n",
    "    layers.Flatten(),\n",
    "    layers.Dense(512, activation='relu'),\n",
    "    layers.Dense(4, activation='softmax')  # 4 classes: cataract, diabetic_retinopathy, glaucoma, normal\n",
    "])\n",
    "\n",
    "# Compile Model\n",
    "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n",
    "\n",
    "# Train Model\n",
    "model.fit(train_generator, validation_data=val_generator, epochs=10)\n",
    "\n",
    "\n",
    "# Save the model\n",
    "model.save(\"glaucoma_classification_model.h5\")\n",
    "\n",
    "print(\"Model training complete.\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "5653bef4-2319-46b0-a5ff-edb7ca9267bf",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`. \n",
      "WARNING:absl:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 139ms/step\n",
      "Predicted Class: Glaucoma\n"
     ]
    }
   ],
   "source": [
    "# save and test model\n",
    "# Save Model\n",
    "model.save(\"eye_disease_classifier.h5\")\n",
    "\n",
    "# Load and test model\n",
    "from tensorflow.keras.models import load_model\n",
    "import numpy as np\n",
    "\n",
    "model = load_model(\"eye_disease_classifier.h5\")\n",
    "\n",
    "def predict_image(image_path):\n",
    "    img = tf.keras.preprocessing.image.load_img(image_path, target_size=(224, 224))\n",
    "    img_array = tf.keras.preprocessing.image.img_to_array(img) / 255.0\n",
    "    img_array = np.expand_dims(img_array, axis=0)\n",
    "    prediction = model.predict(img_array)\n",
    "    class_names = ['Cataract', 'Diabetic Retinopathy', 'Glaucoma', 'Normal']\n",
    "    return class_names[np.argmax(prediction)]\n",
    "\n",
    "# Test on an image\n",
    "test_image = os.path.join(test_dir, \"glaucoma\", os.listdir(os.path.join(test_dir, \"glaucoma\"))[0])\n",
    "print(\"Predicted Class:\", predict_image(test_image))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "46d695f4-30b6-4980-bd5f-f09c96db811f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "04278542-f328-474e-973e-3c497e0564e3",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "30f3038b-3dd2-4b53-bea6-dcb3fe01552d",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.12.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
