{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":14774,"databundleVersionId":875431,"sourceType":"competition"},{"sourceId":8830677,"sourceType":"datasetVersion","datasetId":5313325},{"sourceId":8865291,"sourceType":"datasetVersion","datasetId":5335810},{"sourceId":12310414,"sourceType":"datasetVersion","datasetId":7759455}],"dockerImageVersionId":31041,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport cv2\nimport os\n\n# Set the path to the directory containing the dataset\ndataset_dir = '/kaggle/input/retina-diabetes/resized_train_cropped'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:25:08.542715Z","iopub.execute_input":"2025-06-28T09:25:08.543196Z","iopub.status.idle":"2025-06-28T09:25:09.066693Z","shell.execute_reply.started":"2025-06-28T09:25:08.543172Z","shell.execute_reply":"2025-06-28T09:25:09.065935Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#######\nimport pandas as pd\nimport cv2\nimport os\n\n# Set the path to the directory containing the dataset\ndataset_dir = '/kaggle/input/retina-diabetes/resized_train_cropped'\n\nimport os\nfrom PIL import Image\nimport matplotlib.pyplot as plt\n\ndirectory_path = '/kaggle/input/retina-diabetes/resized_train_cropped'\n\nimage_path = os.path.join(directory_path, '/kaggle/input/retina-diabetes/resized_train_cropped/resized_train_cropped/10003_left.jpeg')\n\nif not os.path.exists(image_path):\n    print(f\"File not found: {image_path}\")\nelse:\n    image = Image.open(image_path)\n\n    plt.imshow(image)\n    plt.axis('off')  # Hide the axis\n    plt.show()\n\nfrom PIL import Image\nimport os\n\nimage_path = '/kaggle/input/retina-diabetes/resized_train_cropped/resized_train_cropped/10_left.jpeg'\n\nif not os.path.exists(image_path):\n    print(f\"File not found: {image_path}\")\nelse:\n    image = Image.open(image_path)\n    width, height = image.size\n    print(f\"Image size: {width} x {height} pixels\")\n\nimport os\nfrom PIL import Image\nimport matplotlib.pyplot as plt\n\ndirectory_path = '/kaggle/input/retina-diabetes/resized_train_cropped'\n\nimage_path = os.path.join(directory_path, '/kaggle/input/retina-diabetes/resized_train_cropped/resized_train_cropped/217_right.jpeg')\n\nif not os.path.exists(image_path):\n    print(f\"File not found: {image_path}\")\nelse:\n    image = Image.open(image_path)\n\n    plt.imshow(image)\n    plt.axis('off')  # Hide the axis\n    plt.show()\nimport pandas as pd\nimport os\n\ndataset_dir = '/kaggle/input/retina-diabetes/resized_train_cropped'  # Note the double backslashes in Windows paths\n\ncsv_file = os.path.join(dataset_dir, '/kaggle/input/retina-diabetes/trainLabels.csv')\ndf = pd.read_csv(csv_file)\nprint(df.columns)\n\nlen_df = len(df)\nprint(f\"There are {len_df} images\")\ndf['level'].hist(figsize = (10, 5))\n\ndef load_image(image_path):\n\n    image = cv2.imread(image_path)\n    \n    if image is None:\n        print(f\"Error loading image: {image_path}\")\n        return None\n    \n    image = cv2.resize(image, (224, 224))\n    \n    # Normalize pixel values to range [0, 1]\n    image = image.astype(np.float32) / 255.0\n\n    return image\n\nfrom PIL import Image\nimport pandas as pd\nimport os\n\nimage_dir = '/kaggle/input/retina-diabetes/resized_train/resized_train'\n\nimage_files = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith(('png', 'jpg', 'jpeg'))]\n\nprint(f\"Number of image files found: {len(image_files)}\")\n\ndf = pd.DataFrame(image_files, columns=['image_path'])\n\nprint(df)\n\nif not df.empty and len(df) > 1:\n    # Open the image from the DataFrame\n    im = Image.open(df['image_path'][1])\n    width, height = im.size\n    print(width, height) \n    im.show()\nelse:\n    print(\"DataFrame is empty or does not have enough images.\")\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:25:20.279737Z","iopub.execute_input":"2025-06-28T09:25:20.280328Z","iopub.status.idle":"2025-06-28T09:25:21.820245Z","shell.execute_reply.started":"2025-06-28T09:25:20.280307Z","shell.execute_reply":"2025-06-28T09:25:21.819397Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom PIL import Image\nimport matplotlib.pyplot as plt\n\ndirectory_path = '/kaggle/input/retina-diabetes/resized_train_cropped'\n\nimage_path = os.path.join(directory_path, '/kaggle/input/retina-diabetes/resized_train_cropped/resized_train_cropped/10003_left.jpeg')\n\nif not os.path.exists(image_path):\n    print(f\"File not found: {image_path}\")\nelse:\n    image = Image.open(image_path)\n\n    plt.imshow(image)\n    plt.axis('off')  # Hide the axis\n    plt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:25:42.776343Z","iopub.execute_input":"2025-06-28T09:25:42.776655Z","iopub.status.idle":"2025-06-28T09:25:42.995258Z","shell.execute_reply.started":"2025-06-28T09:25:42.776632Z","shell.execute_reply":"2025-06-28T09:25:42.994618Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport os\n\nimage_path = '/kaggle/input/retina-diabetes/resized_train_cropped/resized_train_cropped/10_left.jpeg'\n\nif not os.path.exists(image_path):\n    print(f\"File not found: {image_path}\")\nelse:\n    image = Image.open(image_path)\n    width, height = image.size\n    print(f\"Image size: {width} x {height} pixels\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:25:57.93562Z","iopub.execute_input":"2025-06-28T09:25:57.935895Z","iopub.status.idle":"2025-06-28T09:25:57.942812Z","shell.execute_reply.started":"2025-06-28T09:25:57.935876Z","shell.execute_reply":"2025-06-28T09:25:57.942039Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom PIL import Image\nimport matplotlib.pyplot as plt\n\ndirectory_path = '/kaggle/input/retina-diabetes/resized_train_cropped'\n\nimage_path = os.path.join(directory_path, '/kaggle/input/retina-diabetes/resized_train_cropped/resized_train_cropped/217_right.jpeg')\n\nif not os.path.exists(image_path):\n    print(f\"File not found: {image_path}\")\nelse:\n    image = Image.open(image_path)\n\n    plt.imshow(image)\n    plt.axis('off')  # Hide the axis\n    plt.show() ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:26:48.097997Z","iopub.execute_input":"2025-06-28T09:26:48.098575Z","iopub.status.idle":"2025-06-28T09:26:48.32178Z","shell.execute_reply.started":"2025-06-28T09:26:48.098553Z","shell.execute_reply":"2025-06-28T09:26:48.321117Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport os\n\ndataset_dir = '/kaggle/input/retina-diabetes/resized_train_cropped'  # Note the double backslashes in Windows paths\n\ncsv_file = os.path.join(dataset_dir, '/kaggle/input/retina-diabetes/trainLabels.csv')\ndf = pd.read_csv(csv_file)\nprint(df.columns)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:27:11.865678Z","iopub.execute_input":"2025-06-28T09:27:11.866237Z","iopub.status.idle":"2025-06-28T09:27:11.889472Z","shell.execute_reply.started":"2025-06-28T09:27:11.866215Z","shell.execute_reply":"2025-06-28T09:27:11.888887Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len_df = len(df)\nprint(f\"There are {len_df} images\")\ndf['level'].hist(figsize = (10, 5))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:27:27.991066Z","iopub.execute_input":"2025-06-28T09:27:27.991624Z","iopub.status.idle":"2025-06-28T09:27:28.152582Z","shell.execute_reply.started":"2025-06-28T09:27:27.991603Z","shell.execute_reply":"2025-06-28T09:27:28.151767Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def load_image(image_path):\n\n    image = cv2.imread(image_path)\n    \n    if image is None:\n        print(f\"Error loading image: {image_path}\")\n        return None\n    \n    image = cv2.resize(image, (224, 224))\n    \n    # Normalize pixel values to range [0, 1]\n    image = image.astype(np.float32) / 255.0\n\n    return image","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:27:44.672208Z","iopub.execute_input":"2025-06-28T09:27:44.672485Z","iopub.status.idle":"2025-06-28T09:27:44.676811Z","shell.execute_reply.started":"2025-06-28T09:27:44.672467Z","shell.execute_reply":"2025-06-28T09:27:44.676127Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#for index, row in df.iterrows():\n    #image_path = os.path.join(dataset_dir, row['image'] + '.png')\n    #image = load_image(image_path)\n    \n    # Check if image is loaded successfully\n    #if image is not None:\n        #images.append(image)\n        #labels.append(row['level'])  # Assuming 'level' is the label column","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:27:58.610043Z","iopub.execute_input":"2025-06-28T09:27:58.610612Z","iopub.status.idle":"2025-06-28T09:27:58.614151Z","shell.execute_reply.started":"2025-06-28T09:27:58.610588Z","shell.execute_reply":"2025-06-28T09:27:58.613466Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"len_df = len(df)\nprint(f\"There are {len_df} images\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:28:10.100056Z","iopub.execute_input":"2025-06-28T09:28:10.100579Z","iopub.status.idle":"2025-06-28T09:28:10.104214Z","shell.execute_reply.started":"2025-06-28T09:28:10.100559Z","shell.execute_reply":"2025-06-28T09:28:10.103539Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport pandas as pd\nimport os\n\nimage_dir = '/kaggle/input/retina-diabetes/resized_train/resized_train'\n\nimage_files = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith(('png', 'jpg', 'jpeg'))]\n\nprint(f\"Number of image files found: {len(image_files)}\")\n\ndf = pd.DataFrame(image_files, columns=['image_path'])\n\nprint(df)\n\nif not df.empty and len(df) > 1:\n    # Open the image from the DataFrame\n    im = Image.open(df['image_path'][1])\n    width, height = im.size\n    print(width, height) \n    im.show()\nelse:\n    print(\"DataFrame is empty or does not have enough images.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:28:33.326565Z","iopub.execute_input":"2025-06-28T09:28:33.326817Z","iopub.status.idle":"2025-06-28T09:28:33.533651Z","shell.execute_reply.started":"2025-06-28T09:28:33.326798Z","shell.execute_reply":"2025-06-28T09:28:33.532634Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"bs = 64 #smaller batch size is better for training, but may take longer\nsz=224","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:28:48.848767Z","iopub.execute_input":"2025-06-28T09:28:48.84922Z","iopub.status.idle":"2025-06-28T09:28:48.85254Z","shell.execute_reply.started":"2025-06-28T09:28:48.849199Z","shell.execute_reply":"2025-06-28T09:28:48.85178Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport os\nfrom PIL import Image\nimport numpy as np\nimport albumentations as A\nfrom matplotlib import pyplot as plt\n\nimage_dir = '/kaggle/input/retina-diabetes/resized_train_cropped/resized_train_cropped'\n\nimage_files = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith(('png', 'jpg', 'jpeg'))]\n\nif not image_files:\n    raise ValueError(\"No image files found in the specified directory.\")\n\ndf = pd.DataFrame(image_files, columns=['path'])\ndf['diagnosis'] = [0] * len(df)  # Replace this with actual diagnosis labels\n\nprint(df)\n\nif df.empty or len(df) < 2:\n    raise ValueError(\"DataFrame is empty or does not have enough images.\")\n\ntransform = A.Compose([\n    A.HorizontalFlip(p=0.5),\n    A.VerticalFlip(p=0.5),\n    A.Rotate(limit=360, p=0.5),\n    A.RandomResizedCrop(height=224, width=224, scale=(0.8, 1.0), p=1.0),\n    A.RandomBrightnessContrast(p=0.5),\n])\n\ndef load_image(image_path):\n    image = Image.open(image_path)\n    return np.array(image)\n\ndef apply_transform(image, transform):\n    augmented = transform(image=image)\n    return augmented['image']\n\n# Test the transformation on a single image\nimage_path = df['path'][1]\nimage = load_image(image_path)\ntransformed_image = apply_transform(image, transform)\n\n# Convert back to PIL image for visualization\ntransformed_image_pil = Image.fromarray(transformed_image)\n\nplt.figure(figsize=(12, 6))\nplt.subplot(1, 2, 1)\nplt.title(\"Original Image\")\nplt.imshow(image)\n\nplt.subplot(1, 2, 2)\nplt.title(\"Transformed Image\")\nplt.imshow(transformed_image_pil)\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:29:21.676715Z","iopub.execute_input":"2025-06-28T09:29:21.676979Z","iopub.status.idle":"2025-06-28T09:29:27.896928Z","shell.execute_reply.started":"2025-06-28T09:29:21.676961Z","shell.execute_reply":"2025-06-28T09:29:27.895971Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.model_selection import train_test_split\n\n# Split into train and temp sets\ntrain_df, temp_df = train_test_split(df, test_size=0.3, random_state=42)\n\n# Further split temp_df into validation and test sets\nval_df, test_df = train_test_split(temp_df, test_size=0.67, random_state=42)\n\nprint(f\"Training set: {len(train_df)} samples\")\nprint(f\"Validation set: {len(val_df)} samples\")\nprint(f\"Testing set: {len(test_df)} samples\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:31:57.107763Z","iopub.execute_input":"2025-06-28T09:31:57.108241Z","iopub.status.idle":"2025-06-28T09:31:57.514475Z","shell.execute_reply.started":"2025-06-28T09:31:57.10822Z","shell.execute_reply":"2025-06-28T09:31:57.51365Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# import torch\n# from torchvision import models\n\n# model = models.resnet50(pretrained=True)\n# torch.save(model.state_dict(), \"/kaggle/working/my_models/full_resnet50.pth\")\n# # torch.save(model.state_dict(), \"resnet50.pth\")\nimport torch\nfrom torchvision import models\n\nmodel = models.resnet50(pretrained=True)\n\n# Create a target directory if it doesn't exist\nsave_path = \"/kaggle/working/my_models\"\nos.makedirs(save_path, exist_ok=True)\n\n# Define full file path\nfile_path = os.path.join(save_path, \"resnet50.pth\")\n\n# Save the model weights\ntorch.save(model.state_dict(), file_path)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:32:15.247355Z","iopub.execute_input":"2025-06-28T09:32:15.248128Z","iopub.status.idle":"2025-06-28T09:32:19.599567Z","shell.execute_reply.started":"2025-06-28T09:32:15.248104Z","shell.execute_reply":"2025-06-28T09:32:19.598964Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import models\nimport os\n\nfor dirname, _, filenames in os.walk('/kaggle/working/my_models'):\n    for filename in filenames:\n        if not filename.lower().endswith('.jpeg'):\n            print(os.path.join(dirname, filename))\n\n\nmodel = models.resnet50(pretrained=False)\nmodel.load_state_dict(torch.load('/kaggle/working/my_models/resnet50.pth', map_location='cpu'))\nnum_ftrs = model.fc.in_features\nmodel.fc = nn.Linear(num_ftrs, 1)\nmodel.eval()\n\n# print(model)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:32:38.87408Z","iopub.execute_input":"2025-06-28T09:32:38.874918Z","iopub.status.idle":"2025-06-28T09:32:39.326392Z","shell.execute_reply.started":"2025-06-28T09:32:38.874895Z","shell.execute_reply":"2025-06-28T09:32:39.325768Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport os\nfrom sklearn.model_selection import train_test_split\nfrom torchvision import transforms\nfrom torch.utils.data import Dataset, DataLoader\nfrom PIL import Image\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import models ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:32:59.616013Z","iopub.execute_input":"2025-06-28T09:32:59.616614Z","iopub.status.idle":"2025-06-28T09:32:59.620585Z","shell.execute_reply.started":"2025-06-28T09:32:59.616594Z","shell.execute_reply":"2025-06-28T09:32:59.619814Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"image_dir = '/kaggle/input/retina-diabetes/resized_train_cropped'\nlabel_file = '/kaggle/input/retina-diabetes/trainLabels_cropped.csv'\nresnet_model_path = '/kaggle/input/resnett/resnet50.pth'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:33:10.599734Z","iopub.execute_input":"2025-06-28T09:33:10.600404Z","iopub.status.idle":"2025-06-28T09:33:10.603674Z","shell.execute_reply.started":"2025-06-28T09:33:10.600381Z","shell.execute_reply":"2025-06-28T09:33:10.602926Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"labels_df = pd.read_csv(label_file)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:33:20.040521Z","iopub.execute_input":"2025-06-28T09:33:20.040786Z","iopub.status.idle":"2025-06-28T09:33:20.091577Z","shell.execute_reply.started":"2025-06-28T09:33:20.040768Z","shell.execute_reply":"2025-06-28T09:33:20.090819Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"labels_df['path'] = labels_df['image'].apply(lambda x: os.path.join(image_dir, f'{x}.jpeg')) ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:33:31.812029Z","iopub.execute_input":"2025-06-28T09:33:31.812583Z","iopub.status.idle":"2025-06-28T09:33:31.850336Z","shell.execute_reply.started":"2025-06-28T09:33:31.812563Z","shell.execute_reply":"2025-06-28T09:33:31.849672Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"labels_df = labels_df[labels_df['path'].apply(os.path.exists)]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:33:51.208078Z","iopub.execute_input":"2025-06-28T09:33:51.208581Z","iopub.status.idle":"2025-06-28T09:34:10.038224Z","shell.execute_reply.started":"2025-06-28T09:33:51.208553Z","shell.execute_reply":"2025-06-28T09:34:10.037407Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nimage_dir = '/kaggle/input/retina-diabetes/resized_train_cropped'\n\nfiles = os.listdir(image_dir)\nprint(files[:10])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:34:34.815894Z","iopub.execute_input":"2025-06-28T09:34:34.816704Z","iopub.status.idle":"2025-06-28T09:34:34.824155Z","shell.execute_reply.started":"2025-06-28T09:34:34.816673Z","shell.execute_reply":"2025-06-28T09:34:34.823597Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport os\nfrom sklearn.model_selection import train_test_split\n\nimage_dir = '/kaggle/input/retina-diabetes/resized_train_cropped/resized_train_cropped'\nlabel_file = '/kaggle/input/retina-diabetes/trainLabels_cropped.csv'\n\nlabels_df = pd.read_csv(label_file)\n\nfile_extension = '.jpeg'\n\nlabels_df['path'] = labels_df['image'].apply(lambda x: os.path.join(image_dir, f'{x}{file_extension}'))\n\nlabels_df['exists'] = labels_df['path'].apply(os.path.exists)\n\nprint(labels_df.head())\n\nlabels_df = labels_df[labels_df['exists']]\n\nlabels_df = labels_df.drop(columns=['exists'])\n\nprint(f\"Total samples after filtering: {len(labels_df)}\")\n\n# Split the data into train (70%) and temp (30%)\ntrain_df, temp_df = train_test_split(labels_df, test_size=0.3, random_state=42, stratify=labels_df['level'])\n\n# Split the temp_df into validation (10%) and test (20%)\nval_df, test_df = train_test_split(temp_df, test_size=2/3, random_state=42, stratify=temp_df['level'])\n\nprint(f\"Training set: {len(train_df)} samples\")\nprint(f\"Validation set: {len(val_df)} samples\")\nprint(f\"Testing set: {len(test_df)} samples\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:37:16.072088Z","iopub.execute_input":"2025-06-28T09:37:16.07266Z","iopub.status.idle":"2025-06-28T09:39:35.114583Z","shell.execute_reply.started":"2025-06-28T09:37:16.07264Z","shell.execute_reply":"2025-06-28T09:39:35.113934Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class RetinaDataset(Dataset):\n    def __init__(self, dataframe, transform=None):\n        self.dataframe = dataframe\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.dataframe)\n\n    def __getitem__(self, idx):\n        img_path = self.dataframe.iloc[idx]['path']\n        image = Image.open(img_path).convert('RGB')\n        label = self.dataframe.iloc[idx]['level']\n        \n        if self.transform:\n            image = self.transform(image)\n        \n        return image, label","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:40:05.209728Z","iopub.execute_input":"2025-06-28T09:40:05.209993Z","iopub.status.idle":"2025-06-28T09:40:05.214968Z","shell.execute_reply.started":"2025-06-28T09:40:05.209975Z","shell.execute_reply":"2025-06-28T09:40:05.214184Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"transform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.RandomHorizontalFlip(),\n    transforms.RandomVerticalFlip(),\n    transforms.RandomRotation(360),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:40:22.686726Z","iopub.execute_input":"2025-06-28T09:40:22.687391Z","iopub.status.idle":"2025-06-28T09:40:22.691338Z","shell.execute_reply.started":"2025-06-28T09:40:22.687369Z","shell.execute_reply":"2025-06-28T09:40:22.690704Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset = RetinaDataset(train_df, transform=transform)\nval_dataset = RetinaDataset(val_df, transform=transform)\ntest_dataset = RetinaDataset(test_df, transform=transform)\n\n# Create data loaders\ntrain_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)\nval_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=4)\ntest_loader = DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:40:44.324387Z","iopub.execute_input":"2025-06-28T09:40:44.325075Z","iopub.status.idle":"2025-06-28T09:40:44.32956Z","shell.execute_reply.started":"2025-06-28T09:40:44.325054Z","shell.execute_reply":"2025-06-28T09:40:44.328807Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel = models.resnet50(pretrained=False)\nmodel.load_state_dict(torch.load(\"/kaggle/working/my_models/resnet50.pth\"))\n\nnum_features = model.fc.in_features\nmodel.fc = nn.Linear(num_features, 5)  \nmodel = model.to(device)\n\n# Loss function and optimizer\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.001)\n\ndef train_model(model, train_loader, val_loader, criterion, optimizer, num_epochs=5):\n    best_acc = 0.0\n    \n    for epoch in range(num_epochs):\n        model.train()\n        train_loss = 0.0\n        train_corrects = 0\n        \n        for inputs, labels in train_loader:\n            inputs = inputs.to(device)\n            labels = labels.to(device)\n            \n            optimizer.zero_grad()\n            \n            outputs = model(inputs)\n            loss = criterion(outputs, labels)\n            _, preds = torch.max(outputs, 1)\n            \n            loss.backward()\n            optimizer.step()\n            \n            train_loss += loss.item() * inputs.size(0)\n            train_corrects += torch.sum(preds == labels.data)\n        \n        train_loss /= len(train_loader.dataset)\n        train_acc = train_corrects.double() / len(train_loader.dataset)\n        \n        model.eval()\n        val_loss = 0.0\n        val_corrects = 0\n        \n        with torch.no_grad():\n            for inputs, labels in val_loader:\n                inputs = inputs.to(device)\n                labels = labels.to(device)\n                \n                outputs = model(inputs)\n                loss = criterion(outputs, labels)\n                _, preds = torch.max(outputs, 1)\n                \n                val_loss += loss.item() * inputs.size(0)\n                val_corrects += torch.sum(preds == labels.data)\n        \n        val_loss /= len(val_loader.dataset)\n        val_acc = val_corrects.double() / len(val_loader.dataset)\n        \n        print(f'Epoch {epoch+1}/{num_epochs}')\n        print(f'Train loss: {train_loss:.4f}, Train accuracy: {train_acc:.4f}')\n        print(f'Validation loss: {val_loss:.4f}, Validation accuracy: {val_acc:.4f}')\n        \n        if val_acc > best_acc:\n            best_acc = val_acc\n            torch.save(model.state_dict(), 'best_model.pth')\n    \n    print(f'Best validation accuracy: {best_acc:.4f}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:41:32.875079Z","iopub.execute_input":"2025-06-28T09:41:32.875632Z","iopub.status.idle":"2025-06-28T09:41:33.582959Z","shell.execute_reply.started":"2025-06-28T09:41:32.875613Z","shell.execute_reply":"2025-06-28T09:41:33.582405Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_model(model, train_loader, val_loader, criterion, optimizer, num_epochs=20)\n\ndef evaluate_model(model, test_loader):\n    model.eval()\n    test_corrects = 0\n    \n    with torch.no_grad():\n        for inputs, labels in test_loader:\n            inputs = inputs.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(inputs)\n            _, preds = torch.max(outputs, 1)\n            \n            test_corrects += torch.sum(preds == labels.data)\n    \n    test_acc = test_corrects.double() / len(test_loader.dataset)\n    print(f'Test accuracy: {test_acc:.4f}')\n\nmodel.load_state_dict(torch.load('best_model.pth'))\nevaluate_model(model, test_loader)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T09:42:16.697635Z","iopub.execute_input":"2025-06-28T09:42:16.698375Z","iopub.status.idle":"2025-06-28T10:44:04.579843Z","shell.execute_reply.started":"2025-06-28T09:42:16.698348Z","shell.execute_reply":"2025-06-28T10:44:04.578655Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install torch torchvision torchaudio","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T10:45:26.569068Z","iopub.execute_input":"2025-06-28T10:45:26.569761Z","iopub.status.idle":"2025-06-28T10:46:35.332755Z","shell.execute_reply.started":"2025-06-28T10:45:26.569719Z","shell.execute_reply":"2025-06-28T10:46:35.33169Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import datasets, models, transforms\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(f'Using device: {device}')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T10:46:41.769701Z","iopub.execute_input":"2025-06-28T10:46:41.770509Z","iopub.status.idle":"2025-06-28T10:46:41.775648Z","shell.execute_reply.started":"2025-06-28T10:46:41.770462Z","shell.execute_reply":"2025-06-28T10:46:41.77485Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_model(model, train_loader, val_loader, criterion, optimizer, num_epochs=5)\n\ntorch.save(model.state_dict(), '/kaggle/working/ressnet/trained_model.pth')\n\ndef evaluate_model(model, test_loader):\n    model.eval()\n    test_corrects = 0\n    \n    with torch.no_grad():\n        for inputs, labels in test_loader:\n            inputs = inputs.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(inputs)\n            _, preds = torch.max(outputs, 1)\n            \n            test_corrects += torch.sum(preds == labels.data)\n    \n    test_acc = test_corrects.double() / len(test_loader.dataset)\n    print(f'Test accuracy: {test_acc:.4f}')\n\nmodel.load_state_dict(torch.load(), '/kaggle/working/ressnet/trained_model.pth')\nevaluate_model(model, test_loader)\n\ntorch.save(model.state_dict(), '/kaggle/working/ressnet/trained_model.pth')\nprint(\"Model saved successfully at /kaggle/working/ressnet/trained_model.pth\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T10:47:26.422562Z","iopub.execute_input":"2025-06-28T10:47:26.422834Z","iopub.status.idle":"2025-06-28T11:02:31.658607Z","shell.execute_reply.started":"2025-06-28T10:47:26.422815Z","shell.execute_reply":"2025-06-28T11:02:31.65753Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torchvision.transforms as transforms\nfrom PIL import Image\n\nfrom torchvision.models import resnet50\n\nmodel = resnet50(pretrained=False, num_classes=5)  # Assuming 5 output classes\nmodel.load_state_dict(torch.load('/kaggle/working/best_model.pth'))\nmodel.eval()  # Set the model to evaluation mode\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel = model.to(device)\n\ndef preprocess_image(image_path):\n    transform = transforms.Compose([\n        transforms.Resize((224, 224)),  # Resize to the input size expected by the model\n        transforms.ToTensor(),\n        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n    ])\n    \n    image = Image.open(image_path).convert('RGB')\n    \n    image = transform(image)\n    \n    image = image.unsqueeze(0)\n    \n    return image\n\nimage_path = '/kaggle/input/retina-diabetes/resized_train_cropped/resized_train_cropped/10007_left.jpeg'\ninput_image = preprocess_image(image_path)\ninput_image = input_image.to(device)\n\nwith torch.no_grad():\n    output = model(input_image)\n    _, predicted = torch.max(output, 1)\n\nlabel_mapping = {\n    0: 'No DR',\n    1: 'Mild',\n    2: 'Moderate',\n    3: 'Severe',\n    4: 'Proliferative DR'\n}\n\npredicted_label = label_mapping[predicted.item()]\nprint(f'Predicted label: {predicted_label}')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T11:02:46.693075Z","iopub.execute_input":"2025-06-28T11:02:46.693885Z","iopub.status.idle":"2025-06-28T11:02:47.300025Z","shell.execute_reply.started":"2025-06-28T11:02:46.693852Z","shell.execute_reply":"2025-06-28T11:02:47.299177Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torchvision.transforms as transforms\nfrom PIL import Image\nimport os\n\nfrom torchvision.models import resnet50\n\nmodel = resnet50(pretrained=False, num_classes=5)  # Assuming 5 output classes\nmodel.load_state_dict(torch.load('/kaggle/working/best_model.pth'))\nmodel.eval()  # Set the model to evaluation mode\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel = model.to(device)\n\ndef preprocess_image(image_path):\n    transform = transforms.Compose([\n        transforms.Resize((224, 224)),  # Resize to the input size expected by the model\n        transforms.ToTensor(),\n        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n    ])\n    \n    image = Image.open(image_path).convert('RGB')\n    \n    image = transform(image)\n    \n    image = image.unsqueeze(0)\n    \n    return image\n\nimage_paths = [\n    '/kaggle/input/testing/mild.JPG',\n    '/kaggle/input/testing/moderate.JPG',\n    '/kaggle/input/testing/normal.JPG',\n    '/kaggle/input/testing/proliferate.JPG',\n    '/kaggle/input/testing/severe.JPG'\n]\n\nfor image_path in image_paths:\n    input_image = preprocess_image(image_path)\n    input_image = input_image.to(device)\n    \n    with torch.no_grad():\n        output = model(input_image)\n        _, predicted = torch.max(output, 1)\n    \n    label_mapping = {\n        0: 'No DR',\n        1: 'Mild',\n        2: 'Moderate',\n        3: 'Severe',\n        4: 'Proliferative DR'\n    }\n    \n    predicted_label = label_mapping[predicted.item()]\n    print(f'Image: {os.path.basename(image_path)}, Predicted label: {predicted_label}')\n\n\n  ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T11:03:02.809777Z","iopub.execute_input":"2025-06-28T11:03:02.810048Z","iopub.status.idle":"2025-06-28T11:03:03.385Z","shell.execute_reply.started":"2025-06-28T11:03:02.810028Z","shell.execute_reply":"2025-06-28T11:03:03.38438Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import models\n\n# Define ResNet model\nmodel = models.resnet18(pretrained=True)  # Load pre-trained ResNet-18\n\n# Modify the last layer for binary classification (assuming 1 output neuron for binary classification)\nnum_ftrs = model.fc.in_features\nmodel.fc = nn.Linear(num_ftrs, 1)  # Adjust output size for binary classification\n\n# Define loss function, optimizer, and scheduler\ncriterion = nn.BCEWithLogitsLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.001)\nscheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', patience=3, verbose=True)\n\n# Train the model\nnum_epochs = 10\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\nmodel.to(device)\n\nbest_val_loss = float('inf')\n\nfor epoch in range(num_epochs):\n    # Training phase\n    model.train()\n    train_loss = 0.0\n    for images, labels in train_loader:\n        images, labels = images.to(device), labels.float().to(device)\n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs.squeeze(), labels)\n        loss.backward()\n        optimizer.step()\n        train_loss += loss.item()\n\n    # Validation phase\n    model.eval()\n    val_loss = 0.0\n    with torch.no_grad():\n        for images, labels in val_loader:\n            images, labels = images.to(device), labels.float().to(device)\n            outputs = model(images)\n            loss = criterion(outputs.squeeze(), labels)\n            val_loss += loss.item()\n\n    # Adjust learning rate\n    scheduler.step(val_loss)\n\n    # Print epoch statistics\n    print(f'Epoch [{epoch+1}/{num_epochs}], Train Loss: {train_loss/len(train_loader):.4f}, Val Loss: {val_loss/len(val_loader):.4f}')\n\n    # Save best model weights\n    if val_loss < best_val_loss:\n        best_val_loss = val_loss\n        torch.save(model.state_dict(), 'best_model.pth')\n\n# Evaluate the model on the test set\nmodel.eval()\ntest_loss = 0.0\npredictions = []\ntrue_labels = []\n\nwith torch.no_grad():\n    for images, labels in test_loader:\n        images, labels = images.to(device), labels.float().to(device)\n        outputs = model(images)\n        loss = criterion(outputs.squeeze(), labels)\n        test_loss += loss.item()\n        predictions += outputs.sigmoid().cpu().numpy().tolist()\n        true_labels += labels.cpu().numpy().tolist()\n\ntest_loss /= len(test_loader)\nprint(f'Test Loss: {test_loss:.4f}')\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T11:03:19.704695Z","iopub.execute_input":"2025-06-28T11:03:19.704936Z","iopub.status.idle":"2025-06-28T11:31:00.748901Z","shell.execute_reply.started":"2025-06-28T11:03:19.704921Z","shell.execute_reply":"2025-06-28T11:31:00.747958Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport torch\n\n# Your trained model\n# Example: model = resnet50(...)\n# Make sure it's fully trained before saving\n\n# Create a directory if not exists\nsave_dir = '/kaggle/working/retinopathy_model'\nos.makedirs(save_dir, exist_ok=True)\n\n# Define the full path\nmodel_save_path = os.path.join(save_dir, 'trained_model.pth')\n\n# Save the model weights\ntorch.save(model.state_dict(), model_save_path)\n\nprint(f\"✅ Model saved successfully at: {model_save_path}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T11:33:24.993405Z","iopub.execute_input":"2025-06-28T11:33:24.994279Z","iopub.status.idle":"2025-06-28T11:33:25.075297Z","shell.execute_reply.started":"2025-06-28T11:33:24.994239Z","shell.execute_reply":"2025-06-28T11:33:25.074683Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# model.save(\"my_model.h5\")  # HDF5 format","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T11:33:48.14194Z","iopub.execute_input":"2025-06-28T11:33:48.142653Z","iopub.status.idle":"2025-06-28T11:33:48.145694Z","shell.execute_reply.started":"2025-06-28T11:33:48.142629Z","shell.execute_reply":"2025-06-28T11:33:48.145059Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom torchvision.models import resnet50\nimport torchvision.transforms as transforms\nfrom PIL import Image\nimport os\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\n# Step 1: Load model with default structure\nmodel = resnet50(pretrained=False)\n\n# Step 2: Load state_dict FIRST (from the saved checkpoint)\nmodel.load_state_dict(torch.load('/kaggle/working/my_models/resnet50.pth', map_location=device))\n\n# Step 3: Replace the final FC layer (after loading weights)\nmodel.fc = torch.nn.Linear(model.fc.in_features, 5)\n\nmodel = model.to(device)\nmodel.eval()\n\n# Label mapping\nlabel_mapping = {\n    0: 'No DR',\n    1: 'Mild',\n    2: 'Moderate',\n    3: 'Severe',\n    4: 'Proliferative DR'\n}\n\n# Image preprocessing\ndef preprocess_image(image_path):\n    transform = transforms.Compose([\n        transforms.Resize((224, 224)),\n        transforms.ToTensor(),\n        transforms.Normalize(mean=[0.485, 0.456, 0.406],\n                             std=[0.229, 0.224, 0.225])\n    ])\n    image = Image.open(image_path).convert('RGB')\n    image = transform(image).unsqueeze(0)\n    return image.to(device)\n\n# Get user input\nimage_path = input(\"Enter full path to retina image (e.g., /kaggle/input/unlabeled-image.jpeg): \").strip()\n\nif not os.path.exists(image_path):\n    print(f\"❌ File not found: {image_path}\")\nelse:\n    input_image = preprocess_image(image_path)\n\n    with torch.no_grad():\n        output = model(input_image)\n        _, predicted = torch.max(output, 1)\n        severity_level = predicted.item()\n        predicted_label = label_mapping[severity_level]\n\n    print(f\"✅ Predicted Severity Level: {severity_level} ({predicted_label})\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T11:36:47.840626Z","iopub.execute_input":"2025-06-28T11:36:47.841154Z","iopub.status.idle":"2025-06-28T11:37:08.07658Z","shell.execute_reply.started":"2025-06-28T11:36:47.841135Z","shell.execute_reply":"2025-06-28T11:37:08.075656Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport torch\nimport zipfile\n\n# Your trained model (example)\n# model = resnet50(pretrained=False)\n# model.load_state_dict(...)  # if needed\n\n# 1. Define paths\nsave_dir = '/kaggle/working/retinopathy_model'\nos.makedirs(save_dir, exist_ok=True)\n\nmodel_path = os.path.join(save_dir, 'full_model.pt')\n\n# 2. Save the full model (architecture + weights)\ntorch.save(model, model_path)\n\n# 3. Zip the saved model\nzip_path = os.path.join('/kaggle/working', 'retinopathy_model.zip')\n\nwith zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:\n    zipf.write(model_path, arcname='full_model.pt')\n\nprint(f\"✅ Full model saved and zipped successfully at: {zip_path}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-28T11:40:08.324363Z","iopub.execute_input":"2025-06-28T11:40:08.325098Z","iopub.status.idle":"2025-06-28T11:40:13.125024Z","shell.execute_reply.started":"2025-06-28T11:40:08.325077Z","shell.execute_reply":"2025-06-28T11:40:13.12436Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}