{"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":"none","dataSources":[{"sourceId":14774,"databundleVersionId":875431,"sourceType":"competition"},{"sourceId":174745,"sourceType":"modelInstanceVersion","modelInstanceId":146848,"modelId":169374}],"dockerImageVersionId":30787,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport timm\nimport numpy as np\nimport cv2\nfrom albumentations import Compose, Normalize, Resize\nfrom albumentations.pytorch import ToTensorV2\nfrom collections import Counter\nimport random\n\n# Set seed for reproducibility\ndef set_seed(seed=42):\n    random.seed(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    if torch.cuda.is_available():\n        torch.cuda.manual_seed_all(seed)\n        torch.backends.cudnn.deterministic = True\n        torch.backends.cudnn.benchmark = False\n\nset_seed(42)\n\nclass EfficientNetModel(nn.Module):\n    def __init__(self, num_classes=5):\n        super().__init__()\n        self.model = timm.create_model('efficientnet_b0', pretrained=False)\n        in_features = self.model.classifier.in_features\n        # Update the classifier to match the trained model\n        self.model.classifier = nn.Sequential(\n            nn.Linear(in_features, 1024),  # First layer\n            nn.ReLU(),\n            nn.Dropout(0.3),              # Dropout for regularization\n            nn.Linear(1024, 512),         # Intermediate layer\n            nn.ReLU(),\n            nn.Dropout(0.3),\n            nn.Linear(512, 256),          # Another intermediate layer\n            nn.ReLU(),\n            nn.Dropout(0.2),\n            nn.Linear(256, num_classes)   # Final output layer\n        )\n\n    def forward(self, x):\n        return self.model(x)\n\n\n# Load Pretrained Model\ndef load_model(model_path, num_classes, device):\n    model = EfficientNetModel(num_classes=num_classes).to(device)\n    state_dict = torch.load(model_path, map_location=device)\n    model.load_state_dict(state_dict)\n    model.eval()  # Evaluation mode for inference\n    return model\n\n# Preprocess Input Image\ndef preprocess_image(image_path, image_size=384):\n    img = cv2.imread(image_path)\n    if img is None:\n        raise ValueError(f\"Image not found at {image_path}\")\n    \n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    transforms = Compose([\n        Resize(image_size, image_size),\n        Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),\n        ToTensorV2(),\n    ])\n    transformed = transforms(image=img)\n    return transformed['image'].unsqueeze(0)  # Add batch dimension\n\n# Predict Function\ndef predict(model, image_tensor, device):\n    image_tensor = image_tensor.to(device)\n    with torch.no_grad():\n        outputs = model(image_tensor)\n        probabilities = torch.softmax(outputs, dim=1)\n        predicted_class = probabilities.argmax(dim=1).item()\n        confidence = probabilities.max(dim=1).values.item()\n    return predicted_class, confidence\n\n# Main Function\ndef main():\n    # Paths to models and test images\n    model_path = '/kaggle/input/blindness_efficentnetb0/pytorch/default/3/best_model_fold_3 (1).pth'  # Update with your trained model path\n    test_images = [\n        '/kaggle/input/aptos2019-blindness-detection/train_images/0104b032c141.png',\n        '/kaggle/input/aptos2019-blindness-detection/train_images/00f6c1be5a33.png',\n    ]  # Update with test image paths\n    \n    class_labels = {\n        0: \"No DR\",\n        1: \"Mild\",\n        2: \"Moderate\",\n        3: \"Severe\",\n        4: \"Proliferative DR\"\n    }\n    \n    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n    model = load_model(model_path, num_classes=len(class_labels), device=device)\n\n    for image_path in test_images:\n        try:\n            image_tensor = preprocess_image(image_path)\n            predicted_class, confidence = predict(model, image_tensor, device)\n            print(f\"Image: {image_path}\")\n            print(f\"Predicted Class: {predicted_class} ({class_labels[predicted_class]}), Confidence: {confidence:.2f}\")\n        except Exception as e:\n            print(f\"Error processing image {image_path}: {str(e)}\")\n\nif __name__ == \"__main__\":\n    main()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-25T10:15:09.988112Z","iopub.execute_input":"2024-11-25T10:15:09.988673Z","iopub.status.idle":"2024-11-25T10:15:20.465432Z","shell.execute_reply.started":"2024-11-25T10:15:09.988618Z","shell.execute_reply":"2024-11-25T10:15:20.463681Z"}},"outputs":[],"execution_count":null}]}