{"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":"pip install pydicom","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:23:13.041511Z","iopub.execute_input":"2026-09-15T04:23:13.041868Z","iopub.status.idle":"2026-09-15T04:23:18.880444Z","shell.execute_reply.started":"2026-09-15T04:23:13.041828Z","shell.execute_reply":"2026-09-15T04:23:18.879229Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Abnormalities\n\n| #  | Abnormality          | What it refers to                      |\n| -- | -------------------- | -------------------------------------- |\n| 1  | **ACL**              | Anterior cruciate ligament abnormality |\n| 2  | **MCL**              | Medial collateral ligament abnormality |\n| 3  | **Medial Meniscus**  | Abnormality of the medial meniscus     |\n| 4  | **Lateral Meniscus** | Abnormality of the lateral meniscus    |\n| 5  | **Medial OA**        | Medial tibiofemoral osteoarthritis     |\n| 6  | **Lateral OA**       | Lateral tibiofemoral osteoarthritis    |\n| 7  | **PF OA**            | Patellofemoral osteoarthritis          |\n| 8  | **Effusion**         | Joint effusion / excess fluid          |\n| 9  | **Synovitis**        | Inflammation of the synovium           |\n| 10 | **Baker's**          | Baker's (popliteal) cyst               |\n| 11 | **Contusion**        | Bone contusion                         |\n| 12 | **Fracture**         | Knee-region fracture                   |\n","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport os\nimport pydicom\n\nOUTPUT_DIR = \"/kaggle/working/\"\nsub = pd.read_csv(\"/kaggle/input/competitions/rsna-knee-abnormality-detection/sample_submission.csv\")\nsub.info()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:23:18.883362Z","iopub.execute_input":"2026-09-15T04:23:18.883813Z","iopub.status.idle":"2026-09-15T04:23:18.934354Z","shell.execute_reply.started":"2026-09-15T04:23:18.883776Z","shell.execute_reply":"2026-09-15T04:23:18.93323Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_csv = pd.read_csv(\"/kaggle/input/competitions/rsna-knee-abnormality-detection/train.csv\")\ntrain_csv.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:23:18.935645Z","iopub.execute_input":"2026-09-15T04:23:18.936784Z","iopub.status.idle":"2026-09-15T04:23:19.140388Z","shell.execute_reply.started":"2026-09-15T04:23:18.93674Z","shell.execute_reply":"2026-09-15T04:23:19.139298Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_series_csv = pd.read_csv(\"/kaggle/input/competitions/rsna-knee-abnormality-detection/train_series.csv\")\ntrain_series_csv.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:23:19.141716Z","iopub.execute_input":"2026-09-15T04:23:19.142179Z","iopub.status.idle":"2026-09-15T04:23:19.254537Z","shell.execute_reply.started":"2026-09-15T04:23:19.142053Z","shell.execute_reply":"2026-09-15T04:23:19.253495Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dir_list = set(train_series_csv[\"StudyInstanceUID\"].tolist())\nactual_base_path = \"/kaggle/input/competitions/rsna-knee-abnormality-detection/train_series\"\n\ndef verify_directories(dir_list, actual_base_path):\n    actual_folders = {entry.name for entry in os.scandir(actual_base_path) if entry.is_dir()}\n    \n    matching = dir_list.intersection(actual_folders)\n    missing = dir_list - actual_folders\n    \n    print(f\"Total CSV UIDs: {len(dir_list)}\")\n    print(f\"Actual subfolders found: {len(actual_folders)}\")\n    print(f\"Matching pairs: {len(matching)}\")\n    print(f\"Missing folders: {len(missing)}\")\n\nverify_directories(dir_list, actual_base_path)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:23:19.255763Z","iopub.execute_input":"2026-09-15T04:23:19.256102Z","iopub.status.idle":"2026-09-15T04:23:21.563377Z","shell.execute_reply.started":"2026-09-15T04:23:19.256067Z","shell.execute_reply":"2026-09-15T04:23:21.562463Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_series_csv[\"Anatomical_Plane\"].value_counts()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:23:21.564525Z","iopub.execute_input":"2026-09-15T04:23:21.564842Z","iopub.status.idle":"2026-09-15T04:23:21.575292Z","shell.execute_reply.started":"2026-09-15T04:23:21.564817Z","shell.execute_reply":"2026-09-15T04:23:21.574317Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Dividing UIDS on the basis of Anatomiacal_plane\ntrain_series_Sagittal = train_series_csv[train_series_csv[\"Anatomical_Plane\"] == \"Sagittal\"]\n\ntrain_series_Coronal = train_series_csv[train_series_csv[\"Anatomical_Plane\"] == \"Coronal\"]\n\ntrain_series_Axial = train_series_csv[train_series_csv[\"Anatomical_Plane\"] == \"Axial\"]\n\ntrain_report_csv = train_csv.iloc[:,0:2]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:23:21.577705Z","iopub.execute_input":"2026-09-15T04:23:21.578099Z","iopub.status.idle":"2026-09-15T04:23:21.613204Z","shell.execute_reply.started":"2026-09-15T04:23:21.57807Z","shell.execute_reply":"2026-09-15T04:23:21.612105Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# DICOM_ROOT = \"/kaggle/input/competitions/rsna-knee-abnormality-detection/train_series\"\n# OUTPUT_DIR = \"/kaggle/working/\"\n\n# OUTPUT_CSV = os.path.join(OUTPUT_DIR,\"dicom_metadata.csv\")\n\n# metadata_fields = [\n#     \"StudyInstanceUID\",\n#     \"SeriesInstanceUID\",\n#     \"SOPInstanceUID\",\n#     \"ImagePositionPatient\",\n#     \"ImageOrientationPatient\",\n#     \"InstanceNumber\",\n#     \"PixelSpacing\",\n#     \"SliceThickness\",\n#     \"SpacingBetweenSlices\",\n#     \"Rows\",\n#     \"Columns\",\n#     \"SeriesDescription\",\n#     \"EchoTime\",\n#     \"RepetitionTime\",\n#     \"MagneticFieldStrength\",\n#     \"Manufacturer\",\n# ]\n\n# def get_value(ds,field):\n#     try:\n#         value = getattr(ds, field, None)\n\n#         if value is None:\n#             return None\n\n#         if isinstance(value, (list, tuple)):\n#             return list(value)\n\n#         return value\n\n#     except Exception:\n#         return None\n\n# dicom_files = []\n\n# for root, dirs, files in os.walk(DICOM_ROOT):\n\n#     for file in files:\n\n#         if file.lower().endswith(\".dcm\"):\n\n#             full_path = os.path.join(root, file)\n\n#             dicom_files.append(full_path)\n\n\n# print(\"Total DICOM files found:\", len(dicom_files))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:23:21.614354Z","iopub.execute_input":"2026-09-15T04:23:21.614704Z","iopub.status.idle":"2026-09-15T04:23:21.620172Z","shell.execute_reply.started":"2026-09-15T04:23:21.614676Z","shell.execute_reply":"2026-09-15T04:23:21.619198Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# metadata_rows = []\n\n# for i, file_path in enumerate(dicom_files):\n\n#     try:\n#         ds = pydicom.dcmread(\n#             file_path,\n#             stop_before_pixels=True\n#         )\n\n#         row = {}\n\n#         for field in metadata_fields:\n\n#             row[field] = get_value(ds, field)\n\n#         row[\"FilePath\"] = file_path\n\n#         metadata_rows.append(row)\n\n\n#     except Exception as e:\n\n#         print(f\"Error reading file: {file_path}\")\n#         print(\"Error:\", e)\n\n#     if (i + 1) % 1000 == 0:\n\n#         print(\n#             f\"Processed {i + 1:,} / \"\n#             f\"{len(dicom_files):,}\"\n#         )\n\n# df = pd.DataFrame(metadata_rows)\n\n# os.makedirs(OUTPUT_DIR, exist_ok=True)\n\n# df.to_csv(\n#     OUTPUT_CSV,\n#     index=False\n# )\n\n# print(\"\\nFinished!\")\n# print(\"CSV saved to:\")\n# print(OUTPUT_CSV)\n\n# print(\"\\nDataFrame shape:\")\n# print(df.shape)\n\n# print(\"\\nColumns:\")\n# print(df.columns.tolist())\n\n# print(\"\\nFirst 5 rows:\")\n# display(df.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:23:21.621465Z","iopub.execute_input":"2026-09-15T04:23:21.622144Z","iopub.status.idle":"2026-09-15T04:23:21.644054Z","shell.execute_reply.started":"2026-09-15T04:23:21.622116Z","shell.execute_reply":"2026-09-15T04:23:21.643109Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dicom_metadata = pd.read_csv(\"/kaggle/working/dicom_metadata.csv\")\ndicom_metadata.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:23:21.64528Z","iopub.execute_input":"2026-09-15T04:23:21.64566Z","iopub.status.idle":"2026-09-15T04:23:30.514972Z","shell.execute_reply.started":"2026-09-15T04:23:21.645623Z","shell.execute_reply":"2026-09-15T04:23:30.514231Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dicom_metadata.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:25:49.589578Z","iopub.execute_input":"2026-09-15T04:25:49.590074Z","iopub.status.idle":"2026-09-15T04:25:49.597602Z","shell.execute_reply.started":"2026-09-15T04:25:49.590043Z","shell.execute_reply":"2026-09-15T04:25:49.596542Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Total rows:\",len(dicom_metadata))\nprint(\"Total columns:\",len(dicom_metadata.columns))\n\nmissing = dicom_metadata.isnull().sum()\n\nprint(\"\\nMissing values:\")\nprint(missing)\n\nprint(\"Duplicate SOPInstanceUID:\",\n      dicom_metadata[\"SOPInstanceUID\"].duplicated().sum())\n\nprint(\"Duplicate FilePath:\",\n      dicom_metadata[\"FilePath\"].duplicated().sum())\n\nprint(\"Total studies:\", dicom_metadata[\"StudyInstanceUID\"].nunique())\n\nprint(\"Total series:\", dicom_metadata[\"SeriesInstanceUID\"].nunique())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:25:50.558477Z","iopub.execute_input":"2026-09-15T04:25:50.559842Z","iopub.status.idle":"2026-09-15T04:25:51.7456Z","shell.execute_reply.started":"2026-09-15T04:25:50.5598Z","shell.execute_reply":"2026-09-15T04:25:51.744349Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# how many series each study contains\n\nseries_per_study = (\n    dicom_metadata.groupby(\"StudyInstanceUID\")[\"SeriesInstanceUID\"]\n      .nunique()\n)\n\nprint(series_per_study.describe())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:25:57.789325Z","iopub.execute_input":"2026-09-15T04:25:57.790428Z","iopub.status.idle":"2026-09-15T04:25:58.032521Z","shell.execute_reply.started":"2026-09-15T04:25:57.790379Z","shell.execute_reply":"2026-09-15T04:25:58.031214Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"slices_per_series = (\n    dicom_metadata.groupby(\"SeriesInstanceUID\")\n      .size()\n)\n\nprint(slices_per_series.describe())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:25:58.944529Z","iopub.execute_input":"2026-09-15T04:25:58.945547Z","iopub.status.idle":"2026-09-15T04:25:59.089995Z","shell.execute_reply.started":"2026-09-15T04:25:58.945476Z","shell.execute_reply":"2026-09-15T04:25:59.08897Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(slices_per_series.sort_values().head(20))\n\nprint(slices_per_series.sort_values(ascending=False).head(20))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:26:04.214837Z","iopub.execute_input":"2026-09-15T04:26:04.215322Z","iopub.status.idle":"2026-09-15T04:26:04.23162Z","shell.execute_reply.started":"2026-09-15T04:26:04.21529Z","shell.execute_reply":"2026-09-15T04:26:04.230464Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Total study instances = 4,407\n# Total series instances = 24,371\n# Total DICOM slices = 819,078\n\n# Series per study:\n# Maximum = 14\n# Minimum = 3\n# Mean = 5.53\n\n# Slices per series:\n# Maximum = 320\n# Minimum = 11\n# Mean = 33.61","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:26:08.758732Z","iopub.execute_input":"2026-09-15T04:26:08.759548Z","iopub.status.idle":"2026-09-15T04:26:08.76334Z","shell.execute_reply.started":"2026-09-15T04:26:08.759516Z","shell.execute_reply":"2026-09-15T04:26:08.762466Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"series_info = (\n    dicom_metadata\n    .groupby(\"SeriesInstanceUID\")\n    .agg(\n        StudyInstanceUID=(\"StudyInstanceUID\", \"first\"),\n        SeriesDescription=(\"SeriesDescription\", \"first\"),\n        NumSlices=(\"SOPInstanceUID\", \"count\"),\n        Rows=(\"Rows\", \"first\"),\n        Columns=(\"Columns\", \"first\"),\n        PixelSpacing=(\"PixelSpacing\", \"first\"),\n        SliceThickness=(\"SliceThickness\", \"first\"),\n        EchoTime=(\"EchoTime\", \"first\"),\n        RepetitionTime=(\"RepetitionTime\", \"first\"),\n        MagneticFieldStrength=(\"MagneticFieldStrength\", \"first\"),\n        Manufacturer=(\"Manufacturer\", \"first\")\n    )\n    .reset_index()\n)\n\nprint(\"Number of series:\", len(series_info))\n\n\nOUTPUT_CSV = os.path.join(OUTPUT_DIR,\"series_info.csv\")\nseries_info.to_csv(OUTPUT_CSV,index=False)\n\nseries_info = pd.read_csv(OUTPUT_CSV)\nseries_info.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:26:09.403615Z","iopub.execute_input":"2026-09-15T04:26:09.403938Z","iopub.status.idle":"2026-09-15T04:26:10.301924Z","shell.execute_reply.started":"2026-09-15T04:26:09.40391Z","shell.execute_reply":"2026-09-15T04:26:10.301007Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Numslices are the number of DICOM slices in one SeriesInstanceUID\n# Rows and Columns represnets 2D image dimensions in pixels \n# 'SeriesDescription' Description of MRI\n# PixelSpacing size of pixel in millimetres\n# SliceThickness thinkness of a slice\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:26:17.724487Z","iopub.execute_input":"2026-09-15T04:26:17.725049Z","iopub.status.idle":"2026-09-15T04:26:17.72972Z","shell.execute_reply.started":"2026-09-15T04:26:17.725016Z","shell.execute_reply":"2026-09-15T04:26:17.728362Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"series_counts = (\n    series_info[\"SeriesDescription\"]\n    .fillna(\"UNKNOWN\")\n    .value_counts()\n)\n\nprint(series_counts.to_string())\nprint(f\"Total series_categories: {len(series_counts)}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:26:18.358102Z","iopub.execute_input":"2026-09-15T04:26:18.358616Z","iopub.status.idle":"2026-09-15T04:26:18.375898Z","shell.execute_reply.started":"2026-09-15T04:26:18.358531Z","shell.execute_reply":"2026-09-15T04:26:18.375045Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"series_info.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:26:34.633446Z","iopub.execute_input":"2026-09-15T04:26:34.634369Z","iopub.status.idle":"2026-09-15T04:26:34.648509Z","shell.execute_reply.started":"2026-09-15T04:26:34.634331Z","shell.execute_reply":"2026-09-15T04:26:34.647594Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\nSeriesDescription = {\n\n    \"Orientation\": [\"SAG\", \"COR\", \"AX\", \"TRA\", \"OBL\", \"UNKNOWN\"],\n        \n    \"Weighting\": [\"PD\", \"DP\", \"PDW\", \"T1\", \"T1W\", \"T2\", \"T2W\", \"STIR\", \"TIRM\", \"UNKNOWN\"],\n        \n    \"Technique\": [\"TSE\", \"FSE\", \"SE\", \"SPIR\", \"SPAIR\", \"VIBE\", \"DESS\", \"3D\", \"UNKNOWN\"],\n        \n    \"FatSuppression\": [\"FS\", \"SPIR\", \"SPAIR\", \"STIR\", \"UNKNOWN\"],\n        \n    \"Anatomy\": [\"ACL\", \"PCL\", \"Meniscus\", \"Cartilage\", \"Patella\", \"GENERAL\", \"UNKNOWN\"],\n        \n    \"Side\": [\"RIGHT\", \"LEFT\", \"UNKNOWN\"]\n\n    \n}\n\nclass SeriesDescription:\n    def __init__(self):\n        self.path = \"/kaggle/working/series_info.csv\"\n    \n    def SeriesDescription_edit(self):\n        Data = pd.read_csv(self.path)\n\n        Data[\"SeriesDescription\"] = Data[\"SeriesDescription\"].fillna('UNKNOWN').str.upper()\n        Data[\"SeriesDescription\"] = Data[\"SeriesDescription\"].str.replace(r'[-_.\\s]+',' ',regex=True).str.strip()\n\n        return Data\n        \n        \n    def parse_series_description(self):\n        result1 = self.SeriesDescription_edit()\n        pass\n\nObj = SeriesDescription()\nObj.SeriesDescription_edit()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:26:35.629254Z","iopub.execute_input":"2026-09-15T04:26:35.630004Z","iopub.status.idle":"2026-09-15T04:26:35.782936Z","shell.execute_reply.started":"2026-09-15T04:26:35.62997Z","shell.execute_reply":"2026-09-15T04:26:35.782056Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"Data = pd.read_csv(\"/kaggle/working/series_info.csv\")\nData[\"SeriesDescription\"] = Data[\"SeriesDescription\"].fillna('UNKNOWN').str.upper()\nData[\"SeriesDescription\"] = Data[\"SeriesDescription\"].str.replace(r'[-_.\\s]+',' ',regex=True).str.strip()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:26:43.985516Z","iopub.execute_input":"2026-09-15T04:26:43.986336Z","iopub.status.idle":"2026-09-15T04:26:44.133089Z","shell.execute_reply.started":"2026-09-15T04:26:43.986271Z","shell.execute_reply":"2026-09-15T04:26:44.132262Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"Data[\"SeriesDescription\"].head(5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-15T04:26:45.588644Z","iopub.execute_input":"2026-09-15T04:26:45.588943Z","iopub.status.idle":"2026-09-15T04:26:45.596408Z","shell.execute_reply.started":"2026-09-15T04:26:45.588917Z","shell.execute_reply":"2026-09-15T04:26:45.595405Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}