{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.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":112899,"databundleVersionId":13449579,"sourceType":"competition"},{"sourceId":265995251,"sourceType":"kernelVersion"}],"dockerImageVersionId":31154,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms\nfrom PIL import Image\nimport os\nimport timm","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-10-09T05:45:01.595764Z","iopub.execute_input":"2025-10-09T05:45:01.596024Z","iopub.status.idle":"2025-10-09T05:45:15.472819Z","shell.execute_reply.started":"2025-10-09T05:45:01.595998Z","shell.execute_reply":"2025-10-09T05:45:15.47227Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# --- 1. Configuration ---\n# Paths for the test data and saved model\nTEST_DIR = '/kaggle/input/grand-xray-slam-division-a/test1'\nMODEL_PATH = '//kaggle/input/grand-x-ray-slam-division-a/best_model.pth' \nSUBMISSION_PATH = '/kaggle/working/submission.csv'\n\n# Model settings \nMODEL_NAME = 'efficientnet_b0'\nIMAGE_SIZE = 256\nBATCH_SIZE = 64 # Can be larger for inference\nLABELS = [\n    'Atelectasis', 'Cardiomegaly', 'Consolidation', 'Edema',\n    'Enlarged Cardiomediastinum', 'Fracture', 'Lung Lesion',\n    'Lung Opacity', 'Pleural Effusion', 'Pleural Other',\n    'Pneumonia', 'Pneumothorax', 'Support Devices', 'No Finding'\n]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T05:59:13.320492Z","iopub.execute_input":"2025-10-09T05:59:13.321096Z","iopub.status.idle":"2025-10-09T05:59:13.32544Z","shell.execute_reply.started":"2025-10-09T05:59:13.32107Z","shell.execute_reply":"2025-10-09T05:59:13.324687Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# --- 2. Load the Model ---\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\n# Re-create the model architecture\nmodel = timm.create_model(MODEL_NAME, pretrained=False, num_classes=len(LABELS))\n\n# Load trained weights\nmodel.load_state_dict(torch.load(MODEL_PATH))\nmodel.to(device)\nmodel.eval() # Set model to evaluation mode","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T05:59:16.346366Z","iopub.execute_input":"2025-10-09T05:59:16.346634Z","iopub.status.idle":"2025-10-09T05:59:16.538665Z","shell.execute_reply.started":"2025-10-09T05:59:16.346605Z","shell.execute_reply":"2025-10-09T05:59:16.537976Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# --- 3. Create Test Dataset and DataLoader ---\n# Simpler dataset class for test images (no labels)\nclass TestXRayDataset(Dataset):\n    def __init__(self, image_dir, transform=None):\n        self.image_paths = [os.path.join(image_dir, f) for f in os.listdir(image_dir)]\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.image_paths)\n\n    def __getitem__(self, idx):\n        image_path = self.image_paths[idx]\n        image = Image.open(image_path).convert(\"RGB\")\n        if self.transform:\n            image = self.transform(image)\n        return image, os.path.basename(image_path)\n\n# Use the same transforms as validation set\ntest_transform = transforms.Compose([\n    transforms.Resize((IMAGE_SIZE, IMAGE_SIZE)),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n])\n\ntest_dataset = TestXRayDataset(TEST_DIR, transform=test_transform)\ntest_loader = DataLoader(test_dataset, batch_size=BATCH_SIZE, shuffle=False)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T05:59:25.984423Z","iopub.execute_input":"2025-10-09T05:59:25.984712Z","iopub.status.idle":"2025-10-09T05:59:26.626485Z","shell.execute_reply.started":"2025-10-09T05:59:25.98469Z","shell.execute_reply":"2025-10-09T05:59:26.625658Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# --- 4. Generate Predictions ---\nall_preds = []\nall_img_names = []\n\nwith torch.no_grad():\n    for images, img_names in test_loader:\n        images = images.to(device)\n        outputs = model(images)\n        # Use sigmoid to get probabilities between 0 and 1\n        preds = torch.sigmoid(outputs)\n        \n        all_preds.append(preds.cpu().numpy())\n        all_img_names.extend(img_names)\n\nall_preds = np.vstack(all_preds)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T05:59:29.945427Z","iopub.execute_input":"2025-10-09T05:59:29.945693Z","iopub.status.idle":"2025-10-09T07:01:09.079538Z","shell.execute_reply.started":"2025-10-09T05:59:29.945673Z","shell.execute_reply":"2025-10-09T07:01:09.078971Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# --- 5. Create submission.csv File ---\nsubmission_df = pd.DataFrame(all_preds, columns=LABELS)\nsubmission_df.insert(0, 'Image_name', all_img_names) # Use the correct image ID column name\n\n# Save the submission file\nsubmission_df.to_csv(SUBMISSION_PATH, index=False)\n\nprint(f\"Submission file created at: {SUBMISSION_PATH}\")\nprint(submission_df.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T07:01:10.434133Z","iopub.execute_input":"2025-10-09T07:01:10.434337Z","iopub.status.idle":"2025-10-09T07:01:11.074727Z","shell.execute_reply.started":"2025-10-09T07:01:10.434321Z","shell.execute_reply":"2025-10-09T07:01:11.074114Z"}},"outputs":[],"execution_count":null}]}