{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":4833108,"sourceType":"datasetVersion","datasetId":2800595},{"sourceId":952401,"sourceType":"datasetVersion","datasetId":517172}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nfrom tqdm import tqdm\n\ndata = []\n\nbase_path = '/kaggle/input/diabetic-retinopathy-224x224-gaussian-filtered/gaussian_filtered_images/gaussian_filtered_images'\nfor i in os.listdir(base_path):\n    if i=='export.pkl':\n        continue\n    folder = base_path + '/' + i\n    for j in tqdm(os.listdir(folder)):\n#     img = cv2.imread(folder + '/' + j)\n#     img = w2d(img, 'rbio1.1',3)\n#     cv2.imwrite(new+'/'+j, img)\n        data.append([folder + '/' + j,i])\n\nimport pandas as pd\ndf = pd.DataFrame(data, columns=['image', 'label'])\ndf.to_csv('train_data.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-21T05:26:42.177134Z","iopub.execute_input":"2024-10-21T05:26:42.177898Z","iopub.status.idle":"2024-10-21T05:26:42.746678Z","shell.execute_reply.started":"2024-10-21T05:26:42.177861Z","shell.execute_reply":"2024-10-21T05:26:42.745768Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"categories = list(pd.read_csv('train_data.csv')['label'].unique())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-21T05:30:24.757117Z","iopub.execute_input":"2024-10-21T05:30:24.757975Z","iopub.status.idle":"2024-10-21T05:30:24.773629Z","shell.execute_reply.started":"2024-10-21T05:30:24.757933Z","shell.execute_reply":"2024-10-21T05:30:24.772878Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import models, transforms\nfrom torch.utils.data import Dataset, DataLoader\nfrom PIL import Image\nimport pandas as pd\nfrom tqdm import tqdm\n\n# Define the dataset class\n# categories = pd.read_csv('train_data.csv')['label'].unique()\nclass DiabeticRetinopathyDataset(Dataset):\n    def __init__(self, csv_file, transform=None):\n        self.data = pd.read_csv(csv_file)\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        img_name = self.data.iloc[idx, 1]\n        image = Image.open(img_name).convert(\"RGB\")\n        if self.transform:\n            image = self.transform(image)\n        label_str = self.data.iloc[idx, 2]\n        label = categories.index(label_str)\n        return image, torch.tensor(label)\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-21T05:29:19.19182Z","iopub.execute_input":"2024-10-21T05:29:19.192556Z","iopub.status.idle":"2024-10-21T05:29:19.210703Z","shell.execute_reply.started":"2024-10-21T05:29:19.192513Z","shell.execute_reply":"2024-10-21T05:29:19.209805Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Define transformations (resizing and normalization as per ImageNet pre-training)\ntransform = transforms.Compose([\n    transforms.Resize((224, 224)),  # ResNet models expect 224x224 input\n    transforms.ToTensor(),  # Convert PIL image to tensor\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # Normalize with ImageNet stats\n])\n\n# Load your train and validation datasets\ntrain_dataset = DiabeticRetinopathyDataset(csv_file='train_data.csv', transform=transform)\nval_dataset = DiabeticRetinopathyDataset(csv_file='train_data.csv', transform=transform)\n\n# DataLoader\ntrain_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)\nval_loader = DataLoader(val_dataset, batch_size=128, shuffle=False)\n\n# Load a pre-trained ResNet model\nmodel = models.resnet50(pretrained=True)  # You can swap to resnet101 or resnet152\n\n# Modify the fully connected layer for 5 classes (Diabetic Retinopathy stages)\nnum_ftrs = model.fc.in_features  # Get the number of input features to the final layer\nmodel.fc = nn.Linear(num_ftrs, len(categories))  # Modify the classifier to output 5 classes\n\n# Move the model to GPU (if available)\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nmodel = model.to(device)\n\n# Define the loss function and optimizer\ncriterion = nn.CrossEntropyLoss()  # Since it's a classification task\noptimizer = optim.Adam(model.parameters(), lr=1e-4)  # Fine-tuning the entire model","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-21T05:29:43.127369Z","iopub.execute_input":"2024-10-21T05:29:43.128113Z","iopub.status.idle":"2024-10-21T05:29:43.66585Z","shell.execute_reply.started":"2024-10-21T05:29:43.128074Z","shell.execute_reply":"2024-10-21T05:29:43.665017Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Training and validation loop\nnum_epochs = 10\n\nfor epoch in range(num_epochs):\n    model.train()  # Set the model to training mode\n    running_loss = 0.0\n    pbar = tqdm(train_loader, desc=f\"Epoch {epoch+1}/{num_epochs}, Loss: 0.0000\")\n\n    for images, labels in pbar:\n        images = images.to(device)\n        labels = labels.to(device)\n        \n        optimizer.zero_grad()\n        \n        outputs = model(images)  # Forward pass\n        loss = criterion(outputs, labels)  # Compute loss\n        loss.backward()  # Backward pass\n        optimizer.step()  # Update weights\n        \n        running_loss += loss.item()\n        pbar.set_description(f\"Epoch {epoch+1}/{num_epochs}, Loss: {running_loss/len(train_loader):.4f}\")\n\n    # After each epoch, print the loss\n    print(f\"Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(train_loader):.4f}\")\n\n    # Optional: Validate on the validation set (similar to the training loop)\n    model.eval()  # Set the model to evaluation mode\n    val_loss = 0.0\n    correct = 0\n    total = 0\n    with torch.no_grad():  # No gradient computation during validation\n        for images, labels in val_loader:\n            images = images.to(device)\n            labels = labels.to(device)\n            \n            outputs = model(images)\n            loss = criterion(outputs, labels)\n            val_loss += loss.item()\n            \n            _, predicted = torch.max(outputs, 1)\n            total += labels.size(0)\n            correct += (predicted == labels).sum().item()\n    \n    print(f\"Validation Loss: {val_loss/len(val_loader):.4f}, Accuracy: {100 * correct / total:.2f}%\")\n\n    # After training is complete\n    torch.save(model.state_dict(), 'resnet_model.pth')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-10-21T05:30:29.896965Z","iopub.execute_input":"2024-10-21T05:30:29.897859Z","iopub.status.idle":"2024-10-21T05:39:23.334731Z","shell.execute_reply.started":"2024-10-21T05:30:29.897816Z","shell.execute_reply":"2024-10-21T05:39:23.333899Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}