{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.11.13"},"kaggle":{"accelerator":"none","dataSources":[{"sourceType":"competition","sourceId":99552,"databundleVersionId":13441085}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false},"papermill":{"default_parameters":{},"duration":998.27797,"end_time":"2025-08-24T01:20:17.755481","environment_variables":{},"exception":null,"input_path":"__notebook__.ipynb","output_path":"__notebook__.ipynb","parameters":{},"start_time":"2025-08-24T01:03:39.477511","version":"2.6.0"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport nibabel as nib\nimport matplotlib.pyplot as plt\nfrom tqdm import tqdm\n\nsegmentations_path = '/kaggle/input/rsna-intracranial-aneurysm-detection/segmentations/'","metadata":{"papermill":{"duration":3.228128,"end_time":"2025-08-24T01:03:48.619222","exception":false,"start_time":"2025-08-24T01:03:45.391094","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/rsna-intracranial-aneurysm-detection/train.csv')\ntrain.tail()","metadata":{"papermill":{"duration":0.072728,"end_time":"2025-08-24T01:03:48.694519","exception":false,"start_time":"2025-08-24T01:03:48.621791","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"segmentation_cases = os.listdir(segmentations_path)\nsegmentation_cases = [c[:-4] for c in segmentation_cases if c[-5] != 'g']\nsegmentation_cases[:5]","metadata":{"papermill":{"duration":0.092324,"end_time":"2025-08-24T01:03:48.789424","exception":false,"start_time":"2025-08-24T01:03:48.6971","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['segmentation_available'] = train['SeriesInstanceUID'].apply(lambda v: v in segmentation_cases)\ntrain.tail()","metadata":{"papermill":{"duration":0.091774,"end_time":"2025-08-24T01:03:48.883867","exception":false,"start_time":"2025-08-24T01:03:48.792093","status":"completed"},"tags":[],"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train = train[train.segmentation_available].reset_index(drop=True)\ntrain.tail()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train['A'] = train.Modality.apply(lambda v: v in ['MRA','MRI T1post'])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"N = 10\nA = train[train.A]['SeriesInstanceUID'].reset_index(drop=True) [np.random.permutation(np.arange(train.A.sum()))[:N]].values\nB = train[~train.A]['SeriesInstanceUID'].reset_index(drop=True) [np.random.permutation(np.arange(len(train) - train.A.sum()))[:N]].values\nfor i in range(N):\n    print(A[i])\n    print(B[i])\n    _, axs = plt.subplots(2, 3)\n    f_A = segmentations_path + A[i]\n    f_B = segmentations_path + B[i]\n    seg_A = np.rot90(\n        nib.load(f_A + '_cowseg.nii').get_fdata().astype(np.uint8).transpose(2, 0, 1),\n        1,\n        (1, 2)\n    )\n    seg_B = np.rot90(\n        nib.load(f_B + '_cowseg.nii').get_fdata().astype(np.uint8).transpose(2, 0, 1),\n        1,\n        (1, 2)\n    )\n    for k in [3,5,7,9,11]:\n        seg_A[seg_A == k] = 14\n        seg_B[seg_B == k] = 14\n        seg_A[seg_A == k+1] = 15\n        seg_B[seg_B == k+1] = 15\n    seg_A[(seg_A < 14)*(seg_A > 0)] = 2\n    seg_B[(seg_B < 14)*(seg_B > 0)] = 2\n    seg_A[seg_A == 14] = 1\n    seg_B[seg_B == 14] = 1\n    seg_A[seg_A == 15] = 3\n    seg_B[seg_B == 15] = 3\n    for axis in [0,1,2] :\n        axs[0,axis].imshow(seg_A.max(axis),cmap='turbo')\n        axs[1,axis].imshow(seg_B.max(axis),cmap='turbo')\n    plt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Fix???\nLR_ = []\ncase_ = []\nfor case in tqdm(segmentation_cases):\n    case_.append(case)\n    f = segmentations_path + case\n    seg = np.rot90(\n        nib.load(f + '_cowseg.nii').get_fdata().astype(np.uint8).transpose(2, 0, 1),\n        1,\n        (1, 2)\n    )\n    LR = 0\n    for t in [3,5,7,9,11]:\n        R = np.where(seg == t)\n        if len(R[0]) > 0:\n            L = np.where(seg == t + 1)\n            if len(L[0]) > 0:\n                LR += np.array([r.mean() - l.mean() for r,l in zip(R,L)])\n    assert(abs(LR).argmax() == 2)\n    LR_.append(LR[2] > 0)\ndf = pd.DataFrame({\n    'case':case_,\n    'LR':LR_\n})\ndf.to_csv('segmentation_fix.csv',index=False)\ndf.merge(train,left_on='case',right_on='SeriesInstanceUID').groupby(['Modality','LR']).count()['case']","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}