{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":28755,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\n\nimport glob\n\nBASE = \"/kaggle/input/competitions/rsna-knee-abnormality-detection\"\n\ntrain = pd.read_csv(f\"{BASE}/train.csv\")\ntest = pd.read_csv(f\"{BASE}/test.csv\")\ntrain_series = pd.read_csv(f\"{BASE}/train_series.csv\")\ntest_series = pd.read_csv(f\"{BASE}/test_series.csv\")\n\nprint(\"Train Shape:\", train.shape)\nprint(\"Test Shape:\", test.shape)\nprint(\"Train Series Shape:\", train_series.shape)\nprint(\"Test Series Shape:\", test_series.shape)\n\nprint(\"\\nTrain Data:\")\ndisplay(train.head())\n\nprint(\"\\nTrain Series:\")\ndisplay(train_series.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:45:40.286246Z","iopub.execute_input":"2026-08-07T10:45:40.287059Z","iopub.status.idle":"2026-08-07T10:45:40.454523Z","shell.execute_reply.started":"2026-08-07T10:45:40.287027Z","shell.execute_reply":"2026-08-07T10:45:40.453932Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q pydicom","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:25:41.19384Z","iopub.execute_input":"2026-08-07T09:25:41.194268Z","iopub.status.idle":"2026-08-07T09:25:45.128228Z","shell.execute_reply.started":"2026-08-07T09:25:41.194216Z","shell.execute_reply":"2026-08-07T09:25:45.127198Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pydicom\nimport matplotlib.pyplot as plt\n\nBASE = \"/kaggle/input/competitions/rsna-knee-abnormality-detection\"\n\n# Find the first DICOM image\ndicom_file = None\n\nfor root, dirs, files in os.walk(f\"{BASE}/train_series\"):\n    for file in files:\n        if file.endswith(\".dcm\"):\n            dicom_file = os.path.join(root, file)\n            break\n    if dicom_file:\n        break\n\nprint(\"DICOM File:\", dicom_file)\n\nds = pydicom.dcmread(dicom_file)\n\nplt.figure(figsize=(6,6))\nplt.imshow(ds.pixel_array, cmap=\"gray\")\nplt.axis(\"off\")\nplt.title(\"First MRI Image\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:26:12.974337Z","iopub.execute_input":"2026-08-07T09:26:12.974801Z","iopub.status.idle":"2026-08-07T09:26:16.023777Z","shell.execute_reply.started":"2026-08-07T09:26:12.974756Z","shell.execute_reply":"2026-08-07T09:26:16.022876Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nstudy = train_series.iloc[0][\"StudyInstanceUID\"]\nseries = train_series.iloc[0][\"SeriesInstanceUID\"]\n\nfolder = f\"/kaggle/input/competitions/rsna-knee-abnormality-detection/train_series/{study}/{series}\"\n\nfiles = sorted([f for f in os.listdir(folder) if f.endswith(\".dcm\")])\n\nprint(\"Number of MRI slices:\", len(files))\n\nprint(files[:10])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:28:14.288087Z","iopub.execute_input":"2026-08-07T09:28:14.288517Z","iopub.status.idle":"2026-08-07T09:28:14.304207Z","shell.execute_reply.started":"2026-08-07T09:28:14.288484Z","shell.execute_reply":"2026-08-07T09:28:14.303205Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport pydicom\n\nfig, axes = plt.subplots(2, 5, figsize=(15, 6))\n\nfor ax, file in zip(axes.ravel(), files[:10]):\n    ds = pydicom.dcmread(os.path.join(folder, file))\n    ax.imshow(ds.pixel_array, cmap=\"gray\")\n    ax.set_title(file[:4])\n    ax.axis(\"off\")\n\nplt.tight_layout()\nplt.show()\n\n!pip install -q timm","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:31:10.948747Z","iopub.execute_input":"2026-08-07T09:31:10.94921Z","iopub.status.idle":"2026-08-07T09:31:16.050051Z","shell.execute_reply.started":"2026-08-07T09:31:10.949171Z","shell.execute_reply":"2026-08-07T09:31:16.048886Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms\nimport timm\n\nprint(\"Torch Version:\", torch.__version__)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:31:47.595255Z","iopub.execute_input":"2026-08-07T09:31:47.595771Z","iopub.status.idle":"2026-08-07T09:32:01.693237Z","shell.execute_reply.started":"2026-08-07T09:31:47.595721Z","shell.execute_reply":"2026-08-07T09:32:01.692174Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\n\nprint(\"CUDA Available:\", torch.cuda.is_available())\n\nif torch.cuda.is_available():\n    print(\"GPU:\", torch.cuda.get_device_name(0))\nelse:\n    print(\"Running on CPU\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:35:54.350732Z","iopub.execute_input":"2026-08-07T09:35:54.351191Z","iopub.status.idle":"2026-08-07T09:35:59.456682Z","shell.execute_reply.started":"2026-08-07T09:35:54.351167Z","shell.execute_reply":"2026-08-07T09:35:59.45575Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\nBASE = \"/kaggle/input/competitions/rsna-knee-abnormality-detection\"\n\ntrain = pd.read_csv(f\"{BASE}/train.csv\")\ntest = pd.read_csv(f\"{BASE}/test.csv\")\ntrain_series = pd.read_csv(f\"{BASE}/train_series.csv\")\ntest_series = pd.read_csv(f\"{BASE}/test_series.csv\")\n\nprint(\"Dataset Loaded Successfully!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:38:05.268807Z","iopub.execute_input":"2026-08-07T09:38:05.269747Z","iopub.status.idle":"2026-08-07T09:38:05.768008Z","shell.execute_reply.started":"2026-08-07T09:38:05.269717Z","shell.execute_reply":"2026-08-07T09:38:05.767271Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"=\" * 50)\nprint(\"Columns\")\nprint(\"=\" * 50)\nprint(train.columns)\n\nprint(\"\\n\" + \"=\" * 50)\nprint(\"Info\")\nprint(\"=\" * 50)\ntrain.info()\n\nprint(\"\\n\" + \"=\" * 50)\nprint(\"Missing Values\")\nprint(\"=\" * 50)\nprint(train.isna().sum())\n\nprint(\"\\n\" + \"=\" * 50)\nprint(\"First 5 Rows\")\nprint(\"=\" * 50)\ndisplay(train.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:38:36.928658Z","iopub.execute_input":"2026-08-07T09:38:36.929278Z","iopub.status.idle":"2026-08-07T09:38:36.978855Z","shell.execute_reply.started":"2026-08-07T09:38:36.929244Z","shell.execute_reply":"2026-08-07T09:38:36.978227Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"label_cols = [\n    \"ACL\", \"MCL\", \"Medial Meniscus\", \"Lateral Meniscus\",\n    \"Medial OA\", \"Lateral OA\", \"PF OA\",\n    \"Effusion\", \"Synovitis\", \"Baker's\",\n    \"Contusion\", \"Fracture\"\n]\n\ntrain_labeled = train.dropna(subset=label_cols)\n\nprint(\"Total studies:\", len(train))\nprint(\"Labeled studies:\", len(train_labeled))\n\ndisplay(train_labeled.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:40:59.390891Z","iopub.execute_input":"2026-08-07T09:40:59.391699Z","iopub.status.idle":"2026-08-07T09:40:59.413747Z","shell.execute_reply.started":"2026-08-07T09:40:59.391665Z","shell.execute_reply":"2026-08-07T09:40:59.413132Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"study_uid = train_labeled.iloc[0][\"StudyInstanceUID\"]\n\nprint(\"Study UID:\")\nprint(study_uid)\n\ndisplay(\n    train_series[\n        train_series[\"StudyInstanceUID\"] == study_uid\n    ]\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:41:31.091034Z","iopub.execute_input":"2026-08-07T09:41:31.091888Z","iopub.status.idle":"2026-08-07T09:41:31.104088Z","shell.execute_reply.started":"2026-08-07T09:41:31.091841Z","shell.execute_reply":"2026-08-07T09:41:31.10334Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nseries = train_series[\n    train_series[\"StudyInstanceUID\"] == study_uid\n]\n\nprint(\"Number of MRI Series:\", len(series))\n\nfor _, row in series.iterrows():\n    folder = f\"/kaggle/input/competitions/rsna-knee-abnormality-detection/train_series/{row['StudyInstanceUID']}/{row['SeriesInstanceUID']}\"\n    print(folder)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:42:04.660746Z","iopub.execute_input":"2026-08-07T09:42:04.661311Z","iopub.status.idle":"2026-08-07T09:42:04.670056Z","shell.execute_reply.started":"2026-08-07T09:42:04.661281Z","shell.execute_reply":"2026-08-07T09:42:04.669218Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for _, row in series.iterrows():\n\n    folder = f\"/kaggle/input/competitions/rsna-knee-abnormality-detection/train_series/{row['StudyInstanceUID']}/{row['SeriesInstanceUID']}\"\n\n    if os.path.exists(folder):\n\n        n = len([f for f in os.listdir(folder) if f.endswith(\".dcm\")])\n\n        print(row[\"Anatomical_Plane\"], \":\", n, \"slices\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:42:35.671752Z","iopub.execute_input":"2026-08-07T09:42:35.672202Z","iopub.status.idle":"2026-08-07T09:42:35.71667Z","shell.execute_reply.started":"2026-08-07T09:42:35.67217Z","shell.execute_reply":"2026-08-07T09:42:35.716111Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import cv2\nimport torch\nimport numpy as np\nimport pydicom\nfrom torch.utils.data import Dataset\n\nclass KneeDataset(Dataset):\n\n    def __init__(self, train_labeled, train_series):\n        self.train = train_labeled.reset_index(drop=True)\n        self.series = train_series\n\n    def __len__(self):\n        return len(self.train)\n\n    def __getitem__(self, idx):\n\n        study_uid = self.train.iloc[idx][\"StudyInstanceUID\"]\n\n        series = self.series[\n            self.series[\"StudyInstanceUID\"] == study_uid\n        ]\n\n        first_series = series.iloc[0][\"SeriesInstanceUID\"]\n\n        folder = f\"/kaggle/input/competitions/rsna-knee-abnormality-detection/train_series/{study_uid}/{first_series}\"\n\n        files = sorted(\n            [f for f in os.listdir(folder) if f.endswith(\".dcm\")]\n        )\n\n        ds = pydicom.dcmread(os.path.join(folder, files[0]))\n\n        image = ds.pixel_array.astype(np.float32)\n\n        image = cv2.resize(image, (224,224))\n\n        image = (image-image.min())/(image.max()-image.min()+1e-8)\n\n        image = np.stack([image,image,image])\n\n        image = torch.tensor(image,dtype=torch.float32)\n\n        labels = torch.tensor(\n            self.train.iloc[idx][label_cols].values.astype(np.float32)\n        )\n\n        return image, labels","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:44:06.40207Z","iopub.execute_input":"2026-08-07T09:44:06.402411Z","iopub.status.idle":"2026-08-07T09:44:06.409638Z","shell.execute_reply.started":"2026-08-07T09:44:06.402384Z","shell.execute_reply":"2026-08-07T09:44:06.409039Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataset = KneeDataset(train_labeled, train_series)\n\nprint(\"Dataset Size:\", len(dataset))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:44:25.869414Z","iopub.execute_input":"2026-08-07T09:44:25.870126Z","iopub.status.idle":"2026-08-07T09:44:25.87466Z","shell.execute_reply.started":"2026-08-07T09:44:25.870094Z","shell.execute_reply":"2026-08-07T09:44:25.874031Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"image, label = dataset[0]\n\nprint(image.shape)\nprint(label)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:44:50.699523Z","iopub.execute_input":"2026-08-07T09:44:50.700223Z","iopub.status.idle":"2026-08-07T09:44:50.869637Z","shell.execute_reply.started":"2026-08-07T09:44:50.700193Z","shell.execute_reply":"2026-08-07T09:44:50.868912Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import DataLoader\n\ntrain_loader = DataLoader(\n    dataset,\n    batch_size=4,\n    shuffle=True\n)\n\nprint(\"DataLoader Created Successfully!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:45:33.523988Z","iopub.execute_input":"2026-08-07T09:45:33.524667Z","iopub.status.idle":"2026-08-07T09:45:33.52956Z","shell.execute_reply.started":"2026-08-07T09:45:33.524639Z","shell.execute_reply":"2026-08-07T09:45:33.528903Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images, labels = next(iter(train_loader))\n\nprint(\"Images Shape:\", images.shape)\nprint(\"Labels Shape:\", labels.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:45:54.671631Z","iopub.execute_input":"2026-08-07T09:45:54.672352Z","iopub.status.idle":"2026-08-07T09:45:54.803893Z","shell.execute_reply.started":"2026-08-07T09:45:54.672322Z","shell.execute_reply":"2026-08-07T09:45:54.802938Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import timm\nimport torch.nn as nn\n\nmodel = timm.create_model(\n    \"resnet18\",\n    pretrained=True,\n    num_classes=12\n)\n\ndevice = torch.device(\"cuda\")\n\nmodel = model.to(device)\n\nprint(model)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:46:18.986078Z","iopub.execute_input":"2026-08-07T09:46:18.986714Z","iopub.status.idle":"2026-08-07T09:46:29.485325Z","shell.execute_reply.started":"2026-08-07T09:46:18.986669Z","shell.execute_reply":"2026-08-07T09:46:29.484589Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch.nn as nn\nimport torch.optim as optim\n\ncriterion = nn.BCEWithLogitsLoss()\n\noptimizer = optim.Adam(\n    model.parameters(),\n    lr=1e-4\n)\n\nprint(\"Loss and Optimizer Ready!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:47:49.77777Z","iopub.execute_input":"2026-08-07T09:47:49.77883Z","iopub.status.idle":"2026-08-07T09:47:49.784095Z","shell.execute_reply.started":"2026-08-07T09:47:49.778789Z","shell.execute_reply":"2026-08-07T09:47:49.783337Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.train()\n\nfor epoch in range(2):\n\n    running_loss = 0.0\n\n    for images, labels in train_loader:\n\n        images = images.to(device)\n        labels = labels.to(device)\n\n        optimizer.zero_grad()\n\n        outputs = model(images)\n\n        loss = criterion(outputs, labels)\n\n        loss.backward()\n\n        optimizer.step()\n\n        running_loss += loss.item()\n\n    print(f\"Epoch {epoch+1} Loss: {running_loss/len(train_loader):.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:48:19.850524Z","iopub.execute_input":"2026-08-07T09:48:19.851352Z","iopub.status.idle":"2026-08-07T09:48:23.730373Z","shell.execute_reply.started":"2026-08-07T09:48:19.851319Z","shell.execute_reply":"2026-08-07T09:48:23.729714Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.eval()\n\nwith torch.no_grad():\n\n    image, label = dataset[0]\n\n    image = image.unsqueeze(0).to(device)\n\n    output = model(image)\n\n    prediction = torch.sigmoid(output)\n\nprint(\"Prediction:\")\nprint(prediction.cpu())\n\nprint(\"\\nActual Label:\")\nprint(label)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:50:18.560569Z","iopub.execute_input":"2026-08-07T09:50:18.561141Z","iopub.status.idle":"2026-08-07T09:50:18.621405Z","shell.execute_reply.started":"2026-08-07T09:50:18.561108Z","shell.execute_reply":"2026-08-07T09:50:18.620461Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for disease, pred, actual in zip(label_cols, prediction.cpu()[0], label):\n\n    print(f\"{disease:20}  Prediction: {pred:.3f}    Actual: {actual.item()}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:50:50.211466Z","iopub.execute_input":"2026-08-07T09:50:50.212292Z","iopub.status.idle":"2026-08-07T09:50:50.21761Z","shell.execute_reply.started":"2026-08-07T09:50:50.212249Z","shell.execute_reply":"2026-08-07T09:50:50.216924Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"torch.save(model.state_dict(), \"resnet18_knee.pth\")\n\nprint(\"Model Saved Successfully!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:51:11.059274Z","iopub.execute_input":"2026-08-07T09:51:11.05969Z","iopub.status.idle":"2026-08-07T09:51:11.160174Z","shell.execute_reply.started":"2026-08-07T09:51:11.059659Z","shell.execute_reply":"2026-08-07T09:51:11.159196Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(os.listdir(\"/kaggle/working\"))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:51:24.03628Z","iopub.execute_input":"2026-08-07T09:51:24.037069Z","iopub.status.idle":"2026-08-07T09:51:24.04164Z","shell.execute_reply.started":"2026-08-07T09:51:24.037039Z","shell.execute_reply":"2026-08-07T09:51:24.040826Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\ntrain_df, val_df = train_test_split(\n    train_labeled,\n    test_size=0.2,\n    random_state=42\n)\n\nprint(\"Training Samples:\", len(train_df))\nprint(\"Validation Samples:\", len(val_df))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:54:14.980589Z","iopub.execute_input":"2026-08-07T09:54:14.981451Z","iopub.status.idle":"2026-08-07T09:54:15.76364Z","shell.execute_reply.started":"2026-08-07T09:54:14.981419Z","shell.execute_reply":"2026-08-07T09:54:15.762927Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset = KneeDataset(train_df, train_series)\nval_dataset = KneeDataset(val_df, train_series)\n\nprint(\"Train Dataset:\", len(train_dataset))\nprint(\"Validation Dataset:\", len(val_dataset))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:54:34.800227Z","iopub.execute_input":"2026-08-07T09:54:34.801377Z","iopub.status.idle":"2026-08-07T09:54:34.808698Z","shell.execute_reply.started":"2026-08-07T09:54:34.801336Z","shell.execute_reply":"2026-08-07T09:54:34.807996Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import DataLoader\n\ntrain_loader = DataLoader(\n    train_dataset,\n    batch_size=4,\n    shuffle=True\n)\n\nval_loader = DataLoader(\n    val_dataset,\n    batch_size=4,\n    shuffle=False\n)\n\nprint(\"Train Loader:\", len(train_loader))\nprint(\"Validation Loader:\", len(val_loader))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:55:01.01819Z","iopub.execute_input":"2026-08-07T09:55:01.018624Z","iopub.status.idle":"2026-08-07T09:55:01.024527Z","shell.execute_reply.started":"2026-08-07T09:55:01.018595Z","shell.execute_reply":"2026-08-07T09:55:01.023747Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images, labels = next(iter(train_loader))\n\nprint(\"Images Shape:\", images.shape)\nprint(\"Labels Shape:\", labels.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:55:16.262272Z","iopub.execute_input":"2026-08-07T09:55:16.263039Z","iopub.status.idle":"2026-08-07T09:55:16.307999Z","shell.execute_reply.started":"2026-08-07T09:55:16.263005Z","shell.execute_reply":"2026-08-07T09:55:16.307305Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.train()\n\nfor epoch in range(5):\n\n    running_loss = 0.0\n\n    for images, labels in train_loader:\n\n        images = images.to(device)\n        labels = labels.to(device)\n\n        optimizer.zero_grad()\n\n        outputs = model(images)\n\n        loss = criterion(outputs, labels)\n\n        loss.backward()\n\n        optimizer.step()\n\n        running_loss += loss.item()\n\n    print(f\"Epoch {epoch+1}/5  Loss: {running_loss/len(train_loader):.4f}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:55:50.146956Z","iopub.execute_input":"2026-08-07T09:55:50.147749Z","iopub.status.idle":"2026-08-07T09:55:53.280518Z","shell.execute_reply.started":"2026-08-07T09:55:50.147719Z","shell.execute_reply":"2026-08-07T09:55:53.279813Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.eval()\n\nval_loss = 0\n\nwith torch.no_grad():\n\n    for images, labels in val_loader:\n\n        images = images.to(device)\n        labels = labels.to(device)\n\n        outputs = model(images)\n\n        loss = criterion(outputs, labels)\n\n        val_loss += loss.item()\n\nprint(\"Validation Loss:\", val_loss / len(val_loader))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:56:18.607595Z","iopub.execute_input":"2026-08-07T09:56:18.608291Z","iopub.status.idle":"2026-08-07T09:56:18.747509Z","shell.execute_reply.started":"2026-08-07T09:56:18.608259Z","shell.execute_reply":"2026-08-07T09:56:18.746609Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import roc_auc_score\n\nmodel.eval()\n\nall_preds = []\nall_labels = []\n\nwith torch.no_grad():\n    for images, labels in val_loader:\n\n        images = images.to(device)\n\n        outputs = model(images)\n        outputs = torch.sigmoid(outputs)\n\n        all_preds.append(outputs.cpu())\n        all_labels.append(labels)\n\nall_preds = torch.cat(all_preds).numpy()\nall_labels = torch.cat(all_labels).numpy()\n\nprint(\"Prediction Shape:\", all_preds.shape)\nprint(\"Label Shape:\", all_labels.shape)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:02:07.15081Z","iopub.execute_input":"2026-08-07T10:02:07.151683Z","iopub.status.idle":"2026-08-07T10:02:07.288509Z","shell.execute_reply.started":"2026-08-07T10:02:07.15165Z","shell.execute_reply":"2026-08-07T10:02:07.287791Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_labeled = train.dropna(subset=label_cols)\n\nprint(\"Total Studies :\", len(train))\nprint(\"Labeled Studies :\", len(train_labeled))\nprint(\"Unlabeled Studies :\", len(train) - len(train_labeled))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:04:32.934378Z","iopub.execute_input":"2026-08-07T10:04:32.934951Z","iopub.status.idle":"2026-08-07T10:04:32.94368Z","shell.execute_reply.started":"2026-08-07T10:04:32.934916Z","shell.execute_reply":"2026-08-07T10:04:32.942789Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nimage, label = dataset[0]\n\nplt.figure(figsize=(6,6))\nplt.imshow(image.permute(1,2,0))\nplt.title(\"Sample MRI\")\nplt.axis(\"off\")\nplt.show()\n\nprint(\"Labels:\", label)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:05:42.927632Z","iopub.execute_input":"2026-08-07T10:05:42.928496Z","iopub.status.idle":"2026-08-07T10:05:43.159303Z","shell.execute_reply.started":"2026-08-07T10:05:42.928463Z","shell.execute_reply":"2026-08-07T10:05:43.158431Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"study = train_labeled.iloc[0][\"StudyInstanceUID\"]\n\nstudy_series = train_series[\n    train_series[\"StudyInstanceUID\"] == study\n]\n\ndisplay(study_series)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:06:43.217269Z","iopub.execute_input":"2026-08-07T10:06:43.2178Z","iopub.status.idle":"2026-08-07T10:06:43.230656Z","shell.execute_reply.started":"2026-08-07T10:06:43.217769Z","shell.execute_reply":"2026-08-07T10:06:43.229835Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Test Shape:\", test.shape)\ndisplay(test.head())\n\nprint(\"\\nTest Series Shape:\", test_series.shape)\ndisplay(test_series.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:09:20.361493Z","iopub.execute_input":"2026-08-07T10:09:20.362137Z","iopub.status.idle":"2026-08-07T10:09:20.377907Z","shell.execute_reply.started":"2026-08-07T10:09:20.362108Z","shell.execute_reply":"2026-08-07T10:09:20.376982Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class TestDataset(torch.utils.data.Dataset):\n\n    def __init__(self, test_df, test_series_df, transform=None):\n\n        self.test_df = test_df\n        self.test_series_df = test_series_df\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.test_df)\n\n    def __getitem__(self, idx):\n\n        study = self.test_df.iloc[idx][\"StudyInstanceUID\"]\n\n        series = self.test_series_df[\n            self.test_series_df[\"StudyInstanceUID\"] == study\n        ].iloc[0]\n\n        folder = os.path.join(\n            BASE,\n            \"test_series\",\n            study,\n            series[\"SeriesInstanceUID\"]\n        )\n\n        dicoms = sorted(glob.glob(folder + \"/*.dcm\"))\n\n        image = read_dicom(dicoms[len(dicoms)//2])\n\n        if self.transform:\n            image = self.transform(image)\n\n        return image, study","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:10:38.233759Z","iopub.execute_input":"2026-08-07T10:10:38.234388Z","iopub.status.idle":"2026-08-07T10:10:38.24059Z","shell.execute_reply.started":"2026-08-07T10:10:38.234357Z","shell.execute_reply":"2026-08-07T10:10:38.239841Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torchvision import transforms\n\ntransform = transforms.Compose([\n    transforms.ToPILImage(),\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:12:47.643516Z","iopub.execute_input":"2026-08-07T10:12:47.643774Z","iopub.status.idle":"2026-08-07T10:12:47.648119Z","shell.execute_reply.started":"2026-08-07T10:12:47.643753Z","shell.execute_reply":"2026-08-07T10:12:47.647342Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_dataset = TestDataset(\n    test,\n    test_series,\n    transform\n)\n\ntest_loader = DataLoader(\n    test_dataset,\n    batch_size=4,\n    shuffle=False\n)\n\nprint(\"Test Dataset:\", len(test_dataset))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:13:23.08589Z","iopub.execute_input":"2026-08-07T10:13:23.086506Z","iopub.status.idle":"2026-08-07T10:13:23.091597Z","shell.execute_reply.started":"2026-08-07T10:13:23.08648Z","shell.execute_reply":"2026-08-07T10:13:23.090809Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pydicom\nimport cv2\nimport numpy as np\n\ndef read_dicom(path):\n    ds = pydicom.dcmread(path)\n\n    image = ds.pixel_array.astype(np.float32)\n\n    image = (image - image.min()) / (image.max() - image.min() + 1e-8)\n\n    image = cv2.resize(image, (224, 224))\n\n    image = np.stack([image, image, image], axis=-1)\n\n    return image","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:16:12.903792Z","iopub.execute_input":"2026-08-07T10:16:12.904609Z","iopub.status.idle":"2026-08-07T10:16:12.910034Z","shell.execute_reply.started":"2026-08-07T10:16:12.904579Z","shell.execute_reply":"2026-08-07T10:16:12.909148Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"images, study_ids = next(iter(test_loader))\n\nprint(\"Images Shape:\", images.shape)\nprint(study_ids)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:16:32.698348Z","iopub.execute_input":"2026-08-07T10:16:32.69897Z","iopub.status.idle":"2026-08-07T10:16:32.790029Z","shell.execute_reply.started":"2026-08-07T10:16:32.698937Z","shell.execute_reply":"2026-08-07T10:16:32.789347Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\nmodel = model.to(device)\nmodel.eval()\n\nprint(\"Model Ready!\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:19:41.097617Z","iopub.execute_input":"2026-08-07T10:19:41.098057Z","iopub.status.idle":"2026-08-07T10:19:41.106641Z","shell.execute_reply.started":"2026-08-07T10:19:41.098028Z","shell.execute_reply":"2026-08-07T10:19:41.105689Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\npredictions = []\n\nwith torch.no_grad():\n    for images, study_ids in test_loader:\n\n        images = images.to(device)\n\n        outputs = model(images)\n\n        probs = torch.sigmoid(outputs).cpu().numpy()\n\n        for uid, prob in zip(study_ids, probs):\n            predictions.append([uid] + prob.tolist())\n\nprint(\"Total Predictions:\", len(predictions))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:19:57.479631Z","iopub.execute_input":"2026-08-07T10:19:57.480262Z","iopub.status.idle":"2026-08-07T10:19:57.529883Z","shell.execute_reply.started":"2026-08-07T10:19:57.480232Z","shell.execute_reply":"2026-08-07T10:19:57.529042Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"columns = [\n    \"StudyInstanceUID\",\n    \"ACL\",\n    \"MCL\",\n    \"Medial Meniscus\",\n    \"Lateral Meniscus\",\n    \"Medial OA\",\n    \"Lateral OA\",\n    \"PF OA\",\n    \"Effusion\",\n    \"Synovitis\",\n    \"Baker's\",\n    \"Contusion\",\n    \"Fracture\"\n]\n\nsubmission = pd.DataFrame(predictions, columns=columns)\n\nsubmission.to_csv(\"submission.csv\", index=False)\n\nprint(submission.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:20:30.864598Z","iopub.execute_input":"2026-08-07T10:20:30.865407Z","iopub.status.idle":"2026-08-07T10:20:30.883569Z","shell.execute_reply.started":"2026-08-07T10:20:30.865375Z","shell.execute_reply":"2026-08-07T10:20:30.882581Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(os.listdir(\"/kaggle/working\"))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-08-07T10:27:01.943911Z","iopub.execute_input":"2026-08-07T10:27:01.944521Z","iopub.status.idle":"2026-08-07T10:27:01.949092Z","shell.execute_reply.started":"2026-08-07T10:27:01.944489Z","shell.execute_reply":"2026-08-07T10:27:01.948271Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-08-07T09:17:36.886927Z","iopub.execute_input":"2026-08-07T09:17:36.887301Z"}},"outputs":[],"execution_count":null}]}