{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","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":77456,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":59212,"modelId":81853},{"sourceId":100756,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":84515,"modelId":81853},{"sourceId":100790,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":84515,"modelId":81853}],"dockerImageVersionId":30733,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nfrom PIL import Image\nfrom tqdm import tqdm\nimport torch\nfrom torch import nn\nfrom torch.utils.data import DataLoader, Dataset\nfrom torchvision import transforms\nimport timm\nfrom multiprocessing import Pool\nimport cv2","metadata":{"execution":{"iopub.status.busy":"2024-08-25T01:53:25.081976Z","iopub.execute_input":"2024-08-25T01:53:25.082311Z","iopub.status.idle":"2024-08-25T01:53:25.087771Z","shell.execute_reply.started":"2024-08-25T01:53:25.082288Z","shell.execute_reply":"2024-08-25T01:53:25.086670Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class BlindnessDataset(Dataset):\n    def __init__(self, csv_file, root_dir, transform=None, test=False):\n        self.annotations = pd.read_csv(csv_file)\n        self.root_dir = root_dir\n        self.transform = transform\n        self.test = test\n    \n    def __len__(self):\n        return len(self.annotations)\n    \n    def __getitem__(self, idx):\n        img_name = os.path.join(self.root_dir, self.annotations.iloc[idx, 0] + '.png')\n        image = Image.open(img_name)\n        \n        if self.transform:\n            image = self.transform(image)\n        \n        if self.test:\n            return image\n        else:\n            label = int(self.annotations.iloc[idx, 1])\n            return image, label","metadata":{"execution":{"iopub.status.busy":"2024-08-25T01:53:25.316886Z","iopub.execute_input":"2024-08-25T01:53:25.318037Z","iopub.status.idle":"2024-08-25T01:53:25.327301Z","shell.execute_reply.started":"2024-08-25T01:53:25.317993Z","shell.execute_reply":"2024-08-25T01:53:25.326202Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n])","metadata":{"execution":{"iopub.status.busy":"2024-08-25T01:53:25.602237Z","iopub.execute_input":"2024-08-25T01:53:25.603199Z","iopub.status.idle":"2024-08-25T01:53:25.609603Z","shell.execute_reply.started":"2024-08-25T01:53:25.603163Z","shell.execute_reply":"2024-08-25T01:53:25.608622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_csv_file = '/kaggle/input/aptos2019-blindness-detection/test.csv'\ntest_root_dir = '/kaggle/input/aptos2019-blindness-detection/test_images'\ntest_dataset = BlindnessDataset(test_csv_file, test_root_dir, transform=transform, test=True)\ntest_loader = DataLoader(test_dataset, batch_size=16, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2024-08-25T01:53:25.964631Z","iopub.execute_input":"2024-08-25T01:53:25.965020Z","iopub.status.idle":"2024-08-25T01:53:25.975855Z","shell.execute_reply.started":"2024-08-25T01:53:25.964988Z","shell.execute_reply":"2024-08-25T01:53:25.974968Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nmodel_paths = {\n    #'resnet18': \"/kaggle/input/aptos_ensamble-models/pytorch/ensamble_v2/2/resnet18(WD_1e-3)_aptos.pth\",\n    #'efficientnet_b0': \"/kaggle/input/aptos_ensamble-models/pytorch/ensamble_v2/2/efficentNet_b0.pth\",\n    'efficientnet_b1': \"/kaggle/input/aptos_ensamble-models/pytorch/ensamble_v2/2/efficentNet_b1.pth\",\n    'efficientnet_b2': \"/kaggle/input/aptos_ensamble-models/pytorch/ensamble_v2/2/efficentNet_b2.pth\",\n    'efficientnet_b3': \"/kaggle/input/aptos_ensamble-models/pytorch/ensamble_v2/2/efficentNet_b3.pth\",\n    #'efficientnet_b4': \"/kaggle/input/aptos_ensamble-models/pytorch/ensamble_v2/2/efficentNet_b4.pth\",\n    #'efficientnet_b5': \"/kaggle/input/aptos_ensamble-models/pytorch/ensamble_v2/2/efficentNet_b5.pth\",\n    #'inception_resnet_v2': \"/kaggle/input/aptos_ensamble-models/pytorch/ensamble_v2/2/inception_resnet_v2.pth\",\n    #'inception_v4': \"/kaggle/input/aptos_ensamble-models/pytorch/ensamble_v2/2/inception_v4.pth\",\n    'seresnext50_32x4d': \"/kaggle/input/aptos_ensamble-models/pytorch/ensamble_v2/2/seresnext50_32x4d.pth\",\n    #'seresnext101_32x4d': \"/kaggle/input/aptos_ensamble-models/pytorch/ensamble_v2/2/seresnext101_32x4d.pth\"\n\n}\n\n\n\nmodel_names = {\n    'resnet18': 'resnet18',\n    'efficientnet_b0':'efficientnet_b0',\n    'efficientnet_b1':'efficientnet_b1',\n    'efficientnet_b2':'efficientnet_b2',\n    'efficientnet_b3':'efficientnet_b3',\n    'efficientnet_b4':'efficientnet_b4',\n    'efficientnet_b5': 'efficientnet_b5',\n    'inception_resnet_v2': 'inception_resnet_v2',\n    'inception_v4': 'inception_v4',\n    'seresnext50_32x4d': 'seresnext50_32x4d',\n    'seresnext101_32x4d': 'seresnext101_32x4d'\n}\n","metadata":{"execution":{"iopub.status.busy":"2024-08-25T01:53:26.597644Z","iopub.execute_input":"2024-08-25T01:53:26.598010Z","iopub.status.idle":"2024-08-25T01:53:26.604750Z","shell.execute_reply.started":"2024-08-25T01:53:26.597981Z","shell.execute_reply":"2024-08-25T01:53:26.603870Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nmodels_list = []\n\n# Initialize and load weights for each model using timm\nfor model_key, path in model_paths.items():\n    model_name = model_names[model_key]\n    model = timm.create_model(model_name, pretrained=False, num_classes=5)\n    model.load_state_dict(torch.load(path))\n    model.to(device)\n    model.eval()\n    models_list.append(model)","metadata":{"execution":{"iopub.status.busy":"2024-08-25T01:53:27.254802Z","iopub.execute_input":"2024-08-25T01:53:27.255442Z","iopub.status.idle":"2024-08-25T01:53:40.887253Z","shell.execute_reply.started":"2024-08-25T01:53:27.255408Z","shell.execute_reply":"2024-08-25T01:53:40.886416Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"validation_scores = {\n    'resnet18': 0.887, #0.879,\n    'efficientnet_b0': 0.8922,\n    'efficientnet_b1': 0.894,\n    'efficientnet_b2': 0.898,\n    'efficientnet_b3': 0.9127,\n    'efficientnet_b4': 0.893,\n    'efficientnet_b5': 0.870,\n    'inception_resnet_v2': 0.896,\n    'inception_v4': 0.8875, # 0.888,\n    'seresnext50_32x4d': 0.8652, #0.709,\n    'seresnext101_32x4d': 0.9083 #0.951\n}","metadata":{"execution":{"iopub.status.busy":"2024-08-25T01:53:40.889213Z","iopub.execute_input":"2024-08-25T01:53:40.890055Z","iopub.status.idle":"2024-08-25T01:53:40.895831Z","shell.execute_reply.started":"2024-08-25T01:53:40.890018Z","shell.execute_reply":"2024-08-25T01:53:40.894814Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"total_score = sum(validation_scores.values())\nweights = {k: v / total_score for k, v in validation_scores.items()}","metadata":{"execution":{"iopub.status.busy":"2024-08-25T01:53:40.897028Z","iopub.execute_input":"2024-08-25T01:53:40.897442Z","iopub.status.idle":"2024-08-25T01:53:40.907746Z","shell.execute_reply.started":"2024-08-25T01:53:40.897411Z","shell.execute_reply":"2024-08-25T01:53:40.906859Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_outputs = []\n\nwith torch.no_grad():\n    for images in tqdm(test_loader):\n        images = images.to(device)\n        outputs = [weights[model_key] * nn.functional.softmax(model(images), dim=1).unsqueeze(0) \n                   for model_key, model in zip(model_paths.keys(), models_list)]\n        outputs = torch.cat(outputs)\n        weighted_outputs = torch.sum(outputs, dim=0)\n        all_outputs.extend(weighted_outputs.cpu().numpy())\n\nall_outputs = np.array(all_outputs)\nfinal_predictions = np.argmax(all_outputs, axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-08-25T01:53:40.910178Z","iopub.execute_input":"2024-08-25T01:53:40.910625Z","iopub.status.idle":"2024-08-25T01:55:46.776804Z","shell.execute_reply.started":"2024-08-25T01:53:40.910591Z","shell.execute_reply":"2024-08-25T01:55:46.775856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df = pd.DataFrame({\n    'id_code': pd.read_csv(test_csv_file)['id_code'],\n    'diagnosis': final_predictions\n})\n\nsubmission_df.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-08-25T01:55:46.777876Z","iopub.execute_input":"2024-08-25T01:55:46.778205Z","iopub.status.idle":"2024-08-25T01:55:46.791099Z","shell.execute_reply.started":"2024-08-25T01:55:46.778181Z","shell.execute_reply":"2024-08-25T01:55:46.790216Z"},"trusted":true},"execution_count":null,"outputs":[]}]}